Index: tcping.c diff -u -p tcping.c.orig tcping.c --- tcping.c.orig 2004-11-10 20:43:49.000000000 +0900 +++ tcping.c 2008-04-30 20:06:38.000000000 +0900 @@ -36,13 +36,23 @@ #include #include +#define HAVE_GETADDRINFO + void usage(); int main (int argc, char *argv[]) { int sockfd; +#ifdef HAVE_GETADDRINFO + struct sockaddr_storage addr; + struct addrinfo hints, *res; + int family = AF_INET; +#else struct sockaddr_in addr; struct hostent *host; + int port=0; +#endif + int addrlen = sizeof(addr); int error = 0; int ret; socklen_t errlen; @@ -52,14 +62,25 @@ int main (int argc, char *argv[]) { int c; char *cptr; long timeout_sec=0, timeout_usec=0; - int port=0; if (argc < 3) { usage(argv[0]); } - - while((c = getopt(argc, argv, "qt:u:")) != -1) { + + while((c = getopt(argc, argv, +#ifdef HAVE_GETADDRINFO + "46" +#endif + "qt:u:")) != -1) { switch(c) { +#ifdef HAVE_GETADDRINFO + case '4': + family = AF_INET; + break; + case '6': + family = AF_INET6; + break; +#endif case 'q': verbose = 0; break; @@ -80,7 +101,30 @@ int main (int argc, char *argv[]) { break; } } - + +#ifdef HAVE_GETADDRINFO + if (!argv[optind+1]) + usage(argv[0]); + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_socktype = SOCK_STREAM; + error = getaddrinfo(argv[optind], argv[optind+1], &hints, &res); + if (error) { + fprintf(stderr, "error: %s\n", gai_strerror(error)); + exit (-1); + } + + sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (sockfd < 0) { + fprintf(stderr, "socket: %s\n", strerror(errno)); + exit (-1); + } + + memcpy(&addr, res->ai_addr, res->ai_addrlen); + addrlen = res->ai_addrlen; + freeaddrinfo(res); +#else sockfd = socket (AF_INET, SOCK_STREAM, 0); memset(&addr, 0, sizeof(addr)); @@ -106,9 +150,10 @@ int main (int argc, char *argv[]) { usage(argv[0]); } addr.sin_port = htons(port); +#endif fcntl(sockfd, F_SETFL, O_NONBLOCK); - if ((ret = connect(sockfd, (struct sockaddr *) &addr, sizeof(addr))) != 0) { + if ((ret = connect(sockfd, (struct sockaddr *) &addr, addrlen)) != 0) { if (errno != EINPROGRESS) { #ifdef HAVE_SOLARIS /* solaris immediately returns ECONNREFUSED on local ports */ @@ -170,7 +215,11 @@ int main (int argc, char *argv[]) { } void usage(char *prog) { - fprintf(stderr, "error: Usage: %s [-q] [-t timeout_sec] [-u timeout_usec] \n", prog); + fprintf(stderr, "error: Usage: %s [-" +#ifdef HAVE_GETADDRINFO + "46" +#endif + "q] [-t timeout_sec] [-u timeout_usec] \n", prog); exit(-1); }