| /* |
| * HEADER Testing netsnmp_gethostbyaddr() |
| */ |
| |
| SOCK_STARTUP; |
| |
| { |
| int ran_test = 0; |
| #ifdef HAVE_GETHOSTBYADDR |
| struct hostent *h, *h2 = NULL; |
| struct in_addr v4loop; |
| struct sockaddr_in sin_addr; |
| int s; |
| |
| v4loop.s_addr = htonl(INADDR_LOOPBACK); |
| memset(&sin_addr, 0, sizeof(sin_addr)); |
| sin_addr.sin_family = AF_INET; |
| sin_addr.sin_addr = v4loop; |
| s = socket(AF_INET, SOCK_DGRAM, 0); |
| if (s >= 0) { |
| if (bind(s, (struct sockaddr *) &sin_addr, sizeof(sin_addr)) >= 0) { |
| h = netsnmp_gethostbyaddr(&v4loop, sizeof(v4loop), AF_INET); |
| if (h) |
| h2 = gethostbyname(h->h_name); |
| OKF(h && (strcmp(h->h_name, "localhost") == 0 || |
| (h2 && memcmp(h2->h_addr, &v4loop.s_addr, |
| sizeof(v4loop.s_addr)) == 0)), |
| ("127.0.0.1 lookup (%s -> %s)", h ? h->h_name : "(failed)", |
| h2 ? inet_ntoa(*(struct in_addr *) h2-> |
| h_addr) : "(failed)")); |
| ran_test = 1; |
| } |
| close(s); |
| } |
| #endif |
| if (!ran_test) |
| OKF(1, ("Skipped IPv4 test")); |
| } |
| |
| { |
| struct hostent *h; |
| #ifdef cygwin |
| static const struct in6_addr v6loop = { { IN6ADDR_LOOPBACK_INIT } }; |
| #else |
| static const struct in6_addr v6loop = IN6ADDR_LOOPBACK_INIT; |
| #endif |
| struct sockaddr_in6 sin6_addr; |
| struct addrinfo hints, *addr = NULL, *ap; |
| char buf[64]; |
| int s, res, ran_test = 0; |
| |
| memset(&sin6_addr, 0, sizeof(sin6_addr)); |
| sin6_addr.sin6_family = AF_INET6; |
| sin6_addr.sin6_addr = v6loop; |
| s = socket(AF_INET6, SOCK_DGRAM, 0); |
| if (s >= 0) { |
| if (bind(s, (struct sockaddr *) &sin6_addr, sizeof(sin6_addr)) >= |
| 0) { |
| strcpy(buf, "(failed)"); |
| h = netsnmp_gethostbyaddr(&v6loop, sizeof(v6loop), AF_INET6); |
| if (h) { |
| memset(&hints, 0, sizeof(hints)); |
| hints.ai_family = AF_INET6; |
| res = getaddrinfo(h->h_name, NULL, &hints, &addr); |
| if (res == 0) { |
| for (ap = addr; ap; ap = ap->ai_next) { |
| if (ap->ai_family == AF_INET6) { |
| inet_ntop(ap->ai_family, |
| &((struct sockaddr_in6 *) ap-> |
| ai_addr)->sin6_addr, buf, |
| sizeof(buf)); |
| break; |
| } |
| } |
| if (!ap) |
| strcpy(buf, "no AF_INET6 address found"); |
| if (addr) |
| freeaddrinfo(addr); |
| } else { |
| snprintf(buf, sizeof(buf), "getaddrinfo() failed: %s", |
| strerror(errno)); |
| } |
| } |
| OKF(h && (strcmp(h->h_name, "localhost") == 0 || |
| (res == 0 && memcmp(addr->ai_addr, &sin6_addr, |
| sizeof(sin6_addr)) == 0)), |
| ("::1 lookup (%s -> %s)", h ? h->h_name : "(failed)", |
| buf)); |
| ran_test = 1; |
| } |
| close(s); |
| } |
| if (!ran_test) |
| OKF(1, ("Skipped IPv6 test")); |
| } |
| |
| SOCK_CLEANUP; |