#include "config.h" #include #include #include #include #include #include #include #include #include #include #include static void test_nwrap_getnameinfo(void **state) { char host[256] = {0}; char serv[256] = {0}; struct sockaddr_in sin; struct sockaddr_in6 sin6; int flags = 0; int rc; (void) state; /* unused */ /* IPv4 */ sin.sin_family = AF_INET; sin.sin_port = htons(53); rc = inet_pton(AF_INET, "127.0.0.11", &sin.sin_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "magrathea.galaxy.site"); assert_string_equal(serv, "domain"); /* IPv6 */ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(53); rc = inet_pton(AF_INET6, "::13", &sin6.sin6_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "beteigeuze.galaxy.site"); assert_string_equal(serv, "domain"); } static void test_nwrap_getnameinfo_numeric(void **state) { char host[256] = {0}; char serv[256] = {0}; struct sockaddr_in sin; struct sockaddr_in6 sin6; int flags = 0; int rc; (void) state; /* unused */ /* IPv4 */ sin.sin_family = AF_INET; sin.sin_port = htons(53); rc = inet_pton(AF_INET, "127.0.0.11", &sin.sin_addr); assert_int_equal(rc, 1); flags = NI_NUMERICHOST; rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "127.0.0.11"); assert_string_equal(serv, "domain"); /* IPv6 */ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(53); rc = inet_pton(AF_INET6, "::13", &sin6.sin6_addr); assert_int_equal(rc, 1); flags = NI_NUMERICSERV; rc = getnameinfo((const struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "beteigeuze.galaxy.site"); assert_string_equal(serv, "53"); } static void test_nwrap_getnameinfo_any(void **state) { char host[256] = {0}; char serv[256] = {0}; struct sockaddr_in sin; struct sockaddr_in6 sin6; int flags = 0; int rc; (void) state; /* unused */ /* IPv4 */ sin.sin_family = AF_INET; sin.sin_port = htons(22); rc = inet_pton(AF_INET, "0.0.0.0", &sin.sin_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "0.0.0.0"); assert_string_equal(serv, "ssh"); /* IPv6 */ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(22); rc = inet_pton(AF_INET6, "::", &sin6.sin6_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "::"); assert_string_equal(serv, "ssh"); } static void test_nwrap_getnameinfo_local(void **state) { char host[256] = {0}; char serv[256] = {0}; struct sockaddr_in sin; struct sockaddr_in6 sin6; int flags = 0; int rc; (void) state; /* unused */ /* IPv4 */ sin.sin_family = AF_INET; sin.sin_port = htons(22); rc = inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "127.0.0.1"); assert_string_equal(serv, "ssh"); /* IPv6 */ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(22); rc = inet_pton(AF_INET6, "::1", &sin6.sin6_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "::1"); assert_string_equal(serv, "ssh"); } static void test_nwrap_getnameinfo_null(void **state) { char host[256] = {0}; char serv[256] = {0}; struct sockaddr_in sin; struct sockaddr_in6 sin6; int flags = 0; int rc; (void) state; /* unused */ rc = getnameinfo(NULL, 0, host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, EAI_FAMILY); /* IPv4 */ sin.sin_family = AF_INET; sin.sin_port = htons(22); rc = inet_pton(AF_INET, "127.0.0.11", &sin.sin_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), NULL, 0, serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(serv, "ssh"); /* IPv6 */ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(22); rc = inet_pton(AF_INET6, "::13", &sin6.sin6_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), host, sizeof(host), NULL, 0, flags); assert_int_equal(rc, 0); assert_string_equal(host, "beteigeuze.galaxy.site"); /* IPv6 */ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(22); rc = inet_pton(AF_INET6, "::13", &sin6.sin6_addr); assert_int_equal(rc, 1); rc = getnameinfo((const struct sockaddr *)&sin6, sizeof(struct sockaddr_in6), NULL, 0, NULL, 0, flags); assert_int_equal(rc, 0); assert_string_equal(host, "beteigeuze.galaxy.site"); } static void test_nwrap_getnameinfo_flags(void **state) { char host[256] = {0}; char serv[256] = {0}; struct sockaddr_in sin; int flags = 0; int rc; (void) state; /* unused */ /* NI_NAMEREQD */ sin.sin_family = AF_INET; sin.sin_port = htons(22); rc = inet_pton(AF_INET, "127.0.0.11", &sin.sin_addr); assert_int_equal(rc, 1); flags = NI_NAMEREQD; rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), NULL, 0, NULL, 0, flags); assert_int_equal(rc, EAI_NONAME); /* NI_DGRAM */ sin.sin_family = AF_INET; sin.sin_port = htons(513); rc = inet_pton(AF_INET, "127.0.0.11", &sin.sin_addr); assert_int_equal(rc, 1); flags = NI_DGRAM; rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(serv, "who"); /* STREAM (port 513) */ flags = 0; rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(serv, "login"); /* NI_NOFQDN */ flags = NI_NOFQDN; rc = getnameinfo((const struct sockaddr *)&sin, sizeof(struct sockaddr_in), host, sizeof(host), serv, sizeof(serv), flags); assert_int_equal(rc, 0); assert_string_equal(host, "magrathea"); } int main(void) { int rc; const struct CMUnitTest tests[] = { cmocka_unit_test(test_nwrap_getnameinfo), cmocka_unit_test(test_nwrap_getnameinfo_numeric), cmocka_unit_test(test_nwrap_getnameinfo_any), cmocka_unit_test(test_nwrap_getnameinfo_local), cmocka_unit_test(test_nwrap_getnameinfo_null), cmocka_unit_test(test_nwrap_getnameinfo_flags), }; rc = cmocka_run_group_tests(tests, NULL, NULL); return rc; }