16 #include <sys/socket.h>
17 #include <netinet/in.h>
18 #include <arpa/inet.h>
21 #define NSS_WRAPPER_HOSTNAME_ENV "NSS_WRAPPER_HOSTNAME"
23 static void test_nwrap_gethostname(void **state)
25 const char *hostname = "milliways";
26 char sys_host[256] = {0};
30 (void) state; /* unused */
32 rc = setenv(NSS_WRAPPER_HOSTNAME_ENV, hostname, 1);
33 assert_int_equal(rc, 0);
35 rc = gethostname(host, sizeof(host));
36 assert_int_equal(rc, 0);
38 assert_string_equal(host, hostname);
40 rc = setenv(NSS_WRAPPER_HOSTNAME_ENV, "this_hostname_is_too_long", 1);
41 assert_int_equal(rc, 0);
43 rc = gethostname(host, sizeof(host));
44 assert_int_equal(rc, -1);
45 assert_int_equal(errno, ENAMETOOLONG);
47 unsetenv(NSS_WRAPPER_HOSTNAME_ENV);
49 rc = gethostname(sys_host, sizeof(sys_host));
50 assert_int_equal(rc, 0);
54 static void *thread_test_gethostbyname(void *u)
58 (void) u; /* unused */
60 he = gethostbyname("magrathea");
62 assert_non_null(he->h_name);
63 assert_string_equal(he->h_name, "magrathea.galaxy.site");
67 static void test_nwrap_gethostbyname_thread(void **state)
72 (void) state; /* unused */
74 he = gethostbyname("maximegalon.galaxy.site");
76 assert_non_null(he->h_name);
77 assert_string_equal(he->h_name, "maximegalon.galaxy.site");
79 pthread_create(&th, NULL, &thread_test_gethostbyname, NULL);
80 pthread_join(th, NULL);
83 assert_non_null(he->h_name);
86 * On *BSD (and Mac OS X) systems,
87 * data is stored in thread local storage.
89 assert_string_equal(he->h_name, "maximegalon.galaxy.site");
92 * Glibc doesn't store data in thread local storage, so calling
93 * gethostbyname from a thread overwrites the parent thread's data.
95 assert_string_equal(he->h_name, "magrathea.galaxy.site");
99 static void test_nwrap_gethostbyname(void **state)
101 char ip[INET_ADDRSTRLEN];
105 (void) state; /* unused */
107 he = gethostbyname("magrathea.galaxy.site");
109 assert_non_null(he->h_name);
110 assert_non_null(he->h_addr_list);
112 assert_string_equal(he->h_name, "magrathea.galaxy.site");
113 assert_int_equal(he->h_addrtype, AF_INET);
115 a = inet_ntop(AF_INET, he->h_addr_list[0], ip, sizeof(ip));
118 assert_string_equal(ip, "127.0.0.11");
121 static void test_nwrap_gethostbyname_multiple(void **state)
126 /* For inet_ntop call */
131 /* List of ips in hosts file - order matters */
132 const char *const result_ips[] = { "127.0.0.11", "127.0.0.12", NULL };
133 const char *actual_ip = result_ips[0];
136 (void) state; /* unused */
138 he = gethostbyname("magrathea.galaxy.site");
140 assert_non_null(he->h_name);
141 assert_non_null(he->h_addr_list);
143 list = he->h_addr_list;
144 for (ac = 0; *list != NULL; ++ac, ++list) {
145 actual_ip = result_ips[ac];
146 /* When test fails here more records are returned */
147 assert_non_null(actual_ip);
148 result = inet_ntop(AF_INET, *list, p, 4096);
150 assert_string_equal(actual_ip, result);
154 #ifdef HAVE_GETHOSTBYNAME2
155 static void test_nwrap_gethostbyname2(void **state)
157 char ip[INET6_ADDRSTRLEN];
161 (void) state; /* unused */
163 he = gethostbyname2("magrathea.galaxy.site", AF_INET6);
166 he = gethostbyname2("magrathea.galaxy.site", AF_INET);
170 he = gethostbyname2("krikkit.galaxy.site", AF_INET6);
172 assert_non_null(he->h_name);
173 assert_non_null(he->h_addr_list);
175 assert_string_equal(he->h_name, "krikkit.galaxy.site");
176 assert_int_equal(he->h_addrtype, AF_INET6);
178 a = inet_ntop(AF_INET6, he->h_addr_list[0], ip, sizeof(ip));
181 assert_string_equal(ip, "::14");
184 he = gethostbyname2("krikkit.galaxy.site", AF_INET);
186 assert_non_null(he->h_name);
187 assert_non_null(he->h_addr_list);
189 assert_string_equal(he->h_name, "krikkit.galaxy.site");
190 assert_int_equal(he->h_addrtype, AF_INET);
192 a = inet_ntop(AF_INET, he->h_addr_list[0], ip, sizeof(ip));
195 assert_string_equal(ip, "127.0.0.14");
197 #endif /* HAVE_GETHOSTBYNAME2 */
199 static void test_nwrap_gethostbyaddr(void **state)
205 (void) state; /* unused */
207 rc = inet_aton("127.0.0.11", &in);
208 assert_int_equal(rc, 1);
210 he = gethostbyaddr(&in, sizeof(struct in_addr), AF_INET);
212 assert_non_null(he->h_name);
213 assert_non_null(he->h_addr_list);
215 assert_string_equal(he->h_name, "magrathea.galaxy.site");
216 assert_int_equal(he->h_addrtype, AF_INET);
217 assert_memory_equal(&in, he->h_addr_list[0], he->h_length);
220 #ifdef HAVE_GETHOSTBYNAME_R
221 static void test_nwrap_gethostbyname_r(void **state)
223 char buf[1024] = {0};
224 char ip[INET_ADDRSTRLEN];
225 struct hostent hb, *he;
230 (void) state; /* unused */
232 rc = gethostbyname_r("magrathea.galaxy.site",
237 assert_int_equal(rc, 0);
239 assert_non_null(he->h_name);
240 assert_non_null(he->h_addr_list);
242 assert_string_equal(he->h_name, "magrathea.galaxy.site");
243 assert_int_equal(he->h_addrtype, AF_INET);
245 a = inet_ntop(AF_INET, he->h_addr_list[0], ip, sizeof(ip));
248 assert_string_equal(ip, "127.0.0.11");
251 static void test_nwrap_gethostbyname_r_null(void **state)
254 struct hostent hb, *he;
258 (void) state; /* unused */
263 /* Check that the returned buffer is zeroed */
264 rc = gethostbyname_r("wurst",
269 assert_int_equal(rc, ENOENT);
271 assert_null(hb.h_name);
272 assert_null(hb.h_addr_list);
273 assert_string_equal(buf, "");
277 #ifdef HAVE_GETHOSTBYNAME2_R
278 static void test_nwrap_gethostbyname2_r_v4(void **state)
282 char ip[INET_ADDRSTRLEN];
283 struct hostent hb, *he;
288 (void) state; /* unused */
290 for (rc = ERANGE, buflen = 2; rc == ERANGE; buflen *= 2) {
294 buf = calloc(1, buflen);
295 assert_non_null(buf);
297 rc = gethostbyname2_r("magrathea.galaxy.site", AF_INET,
304 assert_int_equal(rc, 0);
305 assert_int_equal(herr, 0);
307 assert_non_null(he->h_name);
308 assert_non_null(he->h_addr_list);
310 assert_string_equal(he->h_name, "magrathea.galaxy.site");
311 assert_int_equal(he->h_addrtype, AF_INET);
313 assert_non_null(he->h_addr_list[0]);
314 a = inet_ntop(AF_INET, he->h_addr_list[0], ip, sizeof(ip));
316 assert_string_equal(a, "127.0.0.11");
318 assert_non_null(he->h_addr_list[1]);
319 a = inet_ntop(AF_INET, he->h_addr_list[1], ip, sizeof(ip));
321 assert_string_equal(a, "127.0.0.12");
323 assert_null(he->h_addr_list[2]);
328 static void test_nwrap_gethostbyname2_r_v6(void **state)
332 char ip[INET6_ADDRSTRLEN];
333 struct hostent hb, *he;
338 (void) state; /* unused */
340 for (rc = ERANGE, buflen = 2; rc == ERANGE; buflen *= 2) {
344 buf = calloc(1, buflen);
345 assert_non_null(buf);
347 rc = gethostbyname2_r("magrathea.galaxy.site", AF_INET6,
354 assert_int_equal(rc, 0);
355 assert_int_equal(herr, 0);
357 assert_non_null(he->h_name);
358 assert_non_null(he->h_addr_list);
360 assert_string_equal(he->h_name, "magrathea.galaxy.site");
361 assert_int_equal(he->h_addrtype, AF_INET6);
363 assert_non_null(he->h_addr_list[0]);
364 a = inet_ntop(AF_INET6, he->h_addr_list[0], ip, sizeof(ip));
366 assert_string_equal(a, "::29a");
368 assert_null(he->h_addr_list[1]);
374 #ifdef HAVE_GETHOSTBYADDR_R
375 static void test_nwrap_gethostbyaddr_r(void **state)
377 char buf[1024] = {0};
378 struct hostent hb, *he;
383 (void) state; /* unused */
385 rc = inet_aton("127.0.0.11", &in);
386 assert_int_equal(rc, 1);
388 rc = gethostbyaddr_r(&in, sizeof(struct in_addr),
394 assert_int_equal(rc, 0);
396 assert_non_null(he->h_name);
397 assert_non_null(he->h_addr_list);
399 assert_string_equal(he->h_name, "magrathea.galaxy.site");
400 assert_int_equal(he->h_addrtype, AF_INET);
401 assert_memory_equal(&in, he->h_addr_list[0], he->h_length);
408 const struct CMUnitTest tests[] = {
409 cmocka_unit_test(test_nwrap_gethostname),
410 cmocka_unit_test(test_nwrap_gethostbyname),
411 cmocka_unit_test(test_nwrap_gethostbyname_thread),
412 #ifdef HAVE_GETHOSTBYNAME2
413 cmocka_unit_test(test_nwrap_gethostbyname2),
415 cmocka_unit_test(test_nwrap_gethostbyaddr),
416 #ifdef HAVE_GETHOSTBYNAME_R
417 cmocka_unit_test(test_nwrap_gethostbyname_r),
418 cmocka_unit_test(test_nwrap_gethostbyname_r_null),
420 #ifdef HAVE_GETHOSTBYNAME2_R
421 cmocka_unit_test(test_nwrap_gethostbyname2_r_v4),
422 cmocka_unit_test(test_nwrap_gethostbyname2_r_v6),
424 #ifdef HAVE_GETHOSTBYADDR_R
425 cmocka_unit_test(test_nwrap_gethostbyaddr_r),
427 cmocka_unit_test(test_nwrap_gethostbyname_multiple),
430 rc = cmocka_run_group_tests(tests, NULL, NULL);