diff options
Diffstat (limited to 'testing/fulltests/unit-tests/T014gethostbyaddr_clib.c')
-rw-r--r-- | testing/fulltests/unit-tests/T014gethostbyaddr_clib.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c b/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c new file mode 100644 index 0000000..4c633ed --- /dev/null +++ b/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c @@ -0,0 +1,55 @@ +/* HEADER Testing netsnmp_gethostbyaddr() */ + +SOCK_STARTUP; + +{ + int ran_test = 0; +#ifdef HAVE_GETHOSTBYADDR + struct hostent *h; + 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); + OKF(h && strcmp(h->h_name, "localhost") == 0, + ("127.0.0.1 lookup (%s)", h ? h->h_name : "(failed)")); + ran_test = 1; + } + close(s); + } +#endif + if (!ran_test) + OKF(1, ("Skipped IPv4 test")); +} + +{ + struct hostent *h; + static const struct in6_addr v6loop = IN6ADDR_LOOPBACK_INIT; + struct sockaddr_in6 sin6_addr; + int s, 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) { + h = netsnmp_gethostbyaddr(&v6loop, sizeof(v6loop), AF_INET6); + OKF(h && strcmp(h->h_name, "localhost") == 0, + ("::1 lookup (%s)", h ? h->h_name : "(failed)")); + ran_test = 1; + } + close(s); + } + if (!ran_test) + OKF(1, ("Skipped IPv6 test")); +} + +SOCK_CLEANUP; |