blob: fe5ad7861734a426c8b8962f77976c7f850c58ad [file] [log] [blame]
mridge7c0f5e52005-01-10 23:12:45 +00001/*
2 *
3 * Copyright (c) International Business Machines Corp., 2001
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
Wanlong Gao4548c6c2012-10-19 18:03:36 +080017 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
mridge7c0f5e52005-01-10 23:12:45 +000018 */
19
20/*
21 * Test Name: getaddrinfo_01
22 *
23 * Test Description:
24 * Tests for getaddrinfo library function
25 *
26 * Usage: <for command-line>
27 * getaddrinfo_01 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
28 * where, -c n : Run n copies concurrently.
29 * -e : Turn on errno logging.
30 * -i n : Execute test n times.
31 * -I x : Execute test for x seconds.
32 * -P x : Pause for x seconds between iterations.
33 * -t : Turn on syscall timing.
34 *
35 * HISTORY
36 * 07/2004 written by David L Stevens
37 *
38 * RESTRICTIONS:
39 * None.
40 *
41 */
42
43#include <unistd.h>
44#include <errno.h>
45
46#include <sys/socket.h>
47#include <netdb.h>
subrata_modakaa588ae2008-09-18 13:18:36 +000048#include <arpa/inet.h>
mridge7c0f5e52005-01-10 23:12:45 +000049
50#include "test.h"
mridge7c0f5e52005-01-10 23:12:45 +000051
robbiew5ddd2092005-02-10 23:03:35 +000052#ifndef AI_V4MAPPED
Wanlong Gao354ebb42012-12-07 10:10:04 +080053#define AI_V4MAPPED 0x0008 /* IPv4 mapped addresses are acceptable. */
robbiew5ddd2092005-02-10 23:03:35 +000054#endif
55
Wanlong Gao354ebb42012-12-07 10:10:04 +080056char *TCID = "getaddrinfo_01"; /* Test program identifier. */
mridge7c0f5e52005-01-10 23:12:45 +000057int testno;
58
59void setup(void), cleanup(void);
60
mridge7c0f5e52005-01-10 23:12:45 +000061int TST_TOTAL = 1;
62
63/* a host that isn't where LTP is running */
64#define REMOTEHOSTNAME "www.ibm.com"
65
66void gaiv4(void), gaiv6(void);
67void dumpres(struct addrinfo *);
68
Wanlong Gao354ebb42012-12-07 10:10:04 +080069int main(int argc, char *argv[])
mridge7c0f5e52005-01-10 23:12:45 +000070{
Cyril Hrubis89af32a2012-10-24 16:39:11 +020071 int lc;
Cyril Hrubis0b9589f2014-05-27 17:40:33 +020072 const char *msg;
mridge7c0f5e52005-01-10 23:12:45 +000073
74 /* Parse standard options given to run the test. */
Garrett Cooperdf3eb162010-11-28 22:44:32 -080075 msg = parse_opts(argc, argv, NULL, NULL);
76 if (msg != NULL) {
Garrett Cooper53740502010-12-16 00:04:01 -080077 tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
mridge7c0f5e52005-01-10 23:12:45 +000078 }
79
80 setup();
81
mridge7c0f5e52005-01-10 23:12:45 +000082 for (lc = 0; TEST_LOOPING(lc); ++lc) {
83 gaiv4();
84 gaiv6();
85 }
86 cleanup();
87
Wanlong Gao354ebb42012-12-07 10:10:04 +080088 return (0);
Garrett Cooper2c282152010-12-16 00:55:50 -080089}
mridge7c0f5e52005-01-10 23:12:45 +000090
91/* getaddrinfo tests (v4) */
92
Wanlong Gao354ebb42012-12-07 10:10:04 +080093void gaiv4(void)
mridge7c0f5e52005-01-10 23:12:45 +000094{
95 struct addrinfo *aires, hints, *pai;
Wanlong Gao354ebb42012-12-07 10:10:04 +080096 char hostname[MAXHOSTNAMELEN + 1];
97 char shortname[MAXHOSTNAMELEN + 1];
98 char service[NI_MAXSERV + 1];
mridge7c0f5e52005-01-10 23:12:45 +000099 int servnum;
100 char *p;
101
102 if (gethostname(hostname, sizeof(hostname)) < 0)
Garrett Cooper53740502010-12-16 00:04:01 -0800103 tst_brkm(TBROK, NULL, "gethostname failed - %s",
Wanlong Gao354ebb42012-12-07 10:10:04 +0800104 strerror(errno));
mridge7c0f5e52005-01-10 23:12:45 +0000105 strncpy(shortname, hostname, MAXHOSTNAMELEN);
106 shortname[MAXHOSTNAMELEN] = '\0';
107 p = strchr(shortname, '.');
108 if (p)
109 *p = '\0';
110
111 /* test 1, IPv4 basic lookup */
112 memset(&hints, 0, sizeof(hints));
113 hints.ai_family = AF_INET;
114 TEST(getaddrinfo(hostname, 0, &hints, &aires));
115 if (!TEST_RETURN) {
116 struct sockaddr_in *psin = 0;
117 int err = 0;
118
119 for (pai = aires; pai; pai = pai->ai_next) {
120 err |= pai->ai_family != AF_INET;
121 err |= pai->ai_addrlen != sizeof(struct sockaddr_in);
122 err |= pai->ai_addr == 0;
123 psin = (struct sockaddr_in *)pai->ai_addr;
124 if (pai->ai_addr) {
125 err |= psin->sin_family != AF_INET;
126 err |= psin->sin_port != 0;
127 }
128 if (err)
129 break;
130 }
131 if (err) {
132 tst_resm(TFAIL, "getaddrinfo IPv4 basic lookup: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800133 "fam %d alen %d addr 0x%p addr/fam %d "
134 "addr/port %d H[%d]",
135 pai->ai_family, pai->ai_addrlen, psin,
136 psin ? psin->sin_family : 0,
137 psin ? psin->sin_port : 0,
138 psin ? htons(psin->sin_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000139 } else
140 tst_resm(TPASS, "getaddrinfo IPv4 basic lookup");
141 freeaddrinfo(aires);
142 } else
143 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv4 basic "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800144 "lookup (\"%s\") returns %ld (\"%s\")", hostname,
145 TEST_RETURN, gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000146
147 /* test 2, IPv4 canonical name */
148 memset(&hints, 0, sizeof(hints));
149 hints.ai_family = AF_INET;
150 hints.ai_flags = AI_CANONNAME;
151 TEST(getaddrinfo(shortname, 0, &hints, &aires));
152 if (!TEST_RETURN) {
153 for (pai = aires; pai; pai = pai->ai_next)
154 if (pai->ai_canonname)
155 break;
156 if (!pai) {
157 tst_resm(TFAIL, "getaddrinfo IPv4 canonical name: no "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800158 "entries with canonical name set");
mridge7c0f5e52005-01-10 23:12:45 +0000159 } else if (strcasecmp(hostname, pai->ai_canonname)) {
160 tst_resm(TFAIL, "getaddrinfo IPv4 canonical name "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800161 "(\"%s\") doesn't match hostname (\"%s\")",
162 pai->ai_canonname, hostname);
mridge7c0f5e52005-01-10 23:12:45 +0000163 } else
164 tst_resm(TPASS, "getaddrinfo IPv4 canonical name");
165 freeaddrinfo(aires);
166 } else
167 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv4 "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800168 "canonical name (\"%s\") returns %ld (\"%s\")",
169 shortname, TEST_RETURN, gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000170
171 /* test 3, IPv4 host+service name */
172
173 memset(&hints, 0, sizeof(hints));
174 /*
175 * These are hard-coded for echo/7 to avoid using getservbyname(),
176 * since it isn't thread-safe and these tests may be re-used
177 * multithreaded. Sigh.
178 */
179 strcpy(service, "echo");
180 servnum = 7;
181 hints.ai_family = AF_INET;
182 TEST(getaddrinfo(hostname, service, &hints, &aires));
183 if (!TEST_RETURN) {
184 struct sockaddr_in *psin = 0;
185 int err = 0;
186
187 for (pai = aires; pai; pai = pai->ai_next) {
188 err |= pai->ai_family != AF_INET;
189 err |= pai->ai_addrlen != sizeof(struct sockaddr_in);
190 err |= pai->ai_addr == 0;
191 psin = (struct sockaddr_in *)pai->ai_addr;
192 if (pai->ai_addr) {
193 err |= psin->sin_family != AF_INET;
194 err |= psin->sin_port != htons(servnum);
195 }
196 if (err)
197 break;
198 }
199 if (err) {
200 tst_resm(TFAIL, "getaddrinfo IPv4 host+service: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800201 "fam %d alen %d addr 0x%p addr/fam %d "
202 "addr/port %d H[%d]",
203 pai->ai_family, pai->ai_addrlen, psin,
204 psin ? psin->sin_family : 0,
205 psin ? psin->sin_port : 0,
206 psin ? htons(psin->sin_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000207 } else
208 tst_resm(TPASS, "getaddrinfo IPv4 host+service");
209 freeaddrinfo(aires);
210 } else
211 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv4 host+"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800212 "service returns %ld (\"%s\")", TEST_RETURN,
213 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000214
215 /* test 4, IPv4 hostname+service, AI_PASSIVE */
216 memset(&hints, 0, sizeof(hints));
217 hints.ai_family = AF_INET;
218 hints.ai_flags = AI_PASSIVE;
219 hints.ai_socktype = SOCK_STREAM;
220 strcpy(service, "9462");
221 servnum = htons(9462);
222 TEST(getaddrinfo(hostname, service, &hints, &aires));
223 if (!TEST_RETURN) {
224 struct sockaddr_in *psin = 0;
225 int err = 0;
226
227 for (pai = aires; pai; pai = pai->ai_next) {
228 err |= pai->ai_family != AF_INET;
229 err |= pai->ai_addrlen != sizeof(struct sockaddr_in);
230 err |= pai->ai_addr == 0;
231 psin = (struct sockaddr_in *)pai->ai_addr;
232 if (pai->ai_addr) {
233 /* AI_PASSIVE is ignored if hostname is
234 * non-null; address must be set
235 */
236 err |= psin->sin_addr.s_addr == 0;
237 err |= psin->sin_family != AF_INET;
238 err |= psin->sin_port != servnum;
239 }
240 if (err)
241 break;
242 }
243 if (err) {
244 tst_resm(TFAIL, "getaddrinfo IPv4 host+service, PASSIVE"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800245 ": fam %d alen %d addr 0x%p addr/fam %d "
246 "addr/port %d H[%d]",
247 pai->ai_family, pai->ai_addrlen, psin,
248 psin ? psin->sin_family : 0,
249 psin ? psin->sin_port : 0,
250 psin ? htons(psin->sin_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000251 } else
Wanlong Gao354ebb42012-12-07 10:10:04 +0800252 tst_resm(TPASS,
253 "getaddrinfo IPv4 host+service PASSIVE");
mridge7c0f5e52005-01-10 23:12:45 +0000254 freeaddrinfo(aires);
255 } else
256 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv4 host+"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800257 "service, PASSIVE (\"%s\", \"%s\") returns %ld (\"%s\")",
258 hostname, service, TEST_RETURN,
259 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000260
261 /* test 5, IPv4 host+service w/ AI_NUMERICHOST */
262
263 memset(&hints, 0, sizeof(hints));
264 strcpy(service, "echo");
265 servnum = 7;
266 hints.ai_family = AF_INET;
267 hints.ai_flags = AI_NUMERICHOST;
268 TEST(getaddrinfo(hostname, service, &hints, &aires));
269 if (TEST_RETURN != EAI_NONAME) {
270 tst_resm(TFAIL, "getaddrinfo IPv4 AI_NUMERICHOST w/ hostname: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800271 "returns %ld expected %d (EAI_NONAME)",
272 TEST_RETURN, EAI_NONAME);
mridge7c0f5e52005-01-10 23:12:45 +0000273 } else
274 tst_resm(TPASS, "getaddrinfo IPv4 AI_NUMERICHOST w/ hostname");
275 if (!TEST_RETURN)
276 freeaddrinfo(aires);
277
278 /* test 6, IPv4 0+service, AI_PASSIVE */
279 memset(&hints, 0, sizeof(hints));
280 hints.ai_family = AF_INET;
281 hints.ai_flags = AI_PASSIVE;
282 hints.ai_socktype = SOCK_STREAM;
283 strcpy(service, "9462");
284 servnum = htons(9462);
285 TEST(getaddrinfo(0, service, &hints, &aires));
286 if (!TEST_RETURN) {
287 struct sockaddr_in *psin = 0;
288 int err = 0;
289
290 for (pai = aires; pai; pai = pai->ai_next) {
291 err |= pai->ai_family != AF_INET;
292 err |= pai->ai_addrlen != sizeof(struct sockaddr_in);
293 err |= pai->ai_addr == 0;
294 psin = (struct sockaddr_in *)pai->ai_addr;
295 if (pai->ai_addr) {
296
297 /* AI_PASSIVE means addr must be INADDR_ANY */
298 err |= psin->sin_addr.s_addr != 0;
299 err |= psin->sin_family != AF_INET;
300 err |= psin->sin_port != servnum;
301 }
302 if (err)
303 break;
304 }
305 if (err) {
306 tst_resm(TFAIL, "getaddrinfo IPv4 0+service, PASSIVE:"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800307 " fam %d alen %d addr 0x%p addr/fam %d "
308 "addr/port %d H[%d]",
309 pai->ai_family, pai->ai_addrlen, psin,
310 psin ? psin->sin_family : 0,
311 psin ? psin->sin_port : 0,
312 psin ? htons(psin->sin_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000313 } else
314 tst_resm(TPASS, "getaddrinfo IPv4 0+service, PASSIVE");
315 freeaddrinfo(aires);
316 } else
317 tst_resm(TEST_RETURN == EAI_BADFLAGS ? TPASS : TFAIL,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800318 "getaddrinfo IPv4 0+service, PASSIVE (\"\", \"%s\") "
319 "returns %ld (\"%s\")", service, TEST_RETURN,
320 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000321
mridge7c0f5e52005-01-10 23:12:45 +0000322 /* test 7, IPv4 0+service */
323
324 memset(&hints, 0, sizeof(hints));
325 hints.ai_family = AF_INET;
326 hints.ai_socktype = SOCK_STREAM;
327 strcpy(service, "9462");
328 servnum = htons(9462);
329 TEST(getaddrinfo(0, service, &hints, &aires));
330 if (!TEST_RETURN) {
331 struct sockaddr_in *psin = 0;
332 int err = 0;
333
334 for (pai = aires; pai; pai = pai->ai_next) {
335 err |= pai->ai_family != AF_INET;
336 err |= pai->ai_addrlen != sizeof(struct sockaddr_in);
337 err |= pai->ai_addr == 0;
338 psin = (struct sockaddr_in *)pai->ai_addr;
339 if (pai->ai_addr) {
340 /* hostname not set; addr should be loopback */
341 err |= psin->sin_addr.s_addr !=
Wanlong Gao354ebb42012-12-07 10:10:04 +0800342 htonl(INADDR_LOOPBACK);
mridge7c0f5e52005-01-10 23:12:45 +0000343 err |= psin->sin_family != AF_INET;
344 err |= psin->sin_port != servnum;
345 }
346 if (err)
347 break;
348 }
349 if (err) {
350 tst_resm(TFAIL, "getaddrinfo IPv4 0+service: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800351 "fam %d alen %d addr 0x%p addr/fam %d "
352 "addr/port %d H[%d]",
353 pai->ai_family, pai->ai_addrlen, psin,
354 psin ? psin->sin_family : 0,
355 psin ? psin->sin_port : 0,
356 psin ? htons(psin->sin_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000357 } else
358 tst_resm(TPASS, "getaddrinfo IPv4 0+service");
359 freeaddrinfo(aires);
360 } else
361 tst_resm(TEST_RETURN == EAI_BADFLAGS ? TPASS : TFAIL,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800362 "getaddrinfo IPv4 0+service (\"\", \"%s\") returns %ld "
363 "(\"%s\")", service, TEST_RETURN,
364 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000365
366 /* test 8, IPv4 host+service, AI_NUMERICSERV */
367
368#ifndef AI_NUMERICSERV
369 tst_resm(TFAIL, "getaddrinfo IPv4 host+service, AI_NUMERICSERV: flag "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800370 "not implemented");
mridge7c0f5e52005-01-10 23:12:45 +0000371#else
372 memset(&hints, 0, sizeof(hints));
373 strcpy(service, "echo");
374 servnum = 7;
375 hints.ai_family = AF_INET;
376 hints.ai_flags = AI_NUMERICSERV;
377 TEST(getaddrinfo(hostname, service, &hints, &aires));
378 if (TEST_RETURN != EAI_NONAME) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800379 tst_resm(TFAIL,
380 "getaddrinfo IPv4 host+service, AI_NUMERICSERV: "
381 "returns %ld (\"%s\") expected %d (EAI_NONAME)",
382 TEST_RETURN, gai_strerror(TEST_RETURN), EAI_NONAME);
mridge7c0f5e52005-01-10 23:12:45 +0000383 } else
Wanlong Gao354ebb42012-12-07 10:10:04 +0800384 tst_resm(TPASS,
385 "getaddrinfo IPv4 host+service, AI_NUMERICSERV");
mridge7c0f5e52005-01-10 23:12:45 +0000386 if (!TEST_RETURN)
387 freeaddrinfo(aires);
388#endif /* AI_NUMERICSERV */
389
390 /* test 9, IPv4 SOCK_STREAM/IPPROTO_UDP hints */
391
392 memset(&hints, 0, sizeof(hints));
393 hints.ai_family = AF_INET;
394 hints.ai_socktype = SOCK_STREAM;
395 hints.ai_protocol = IPPROTO_UDP;
396 strcpy(service, "9462");
397 servnum = htons(9462);
398 TEST(getaddrinfo(0, service, &hints, &aires));
399 if (!TEST_RETURN) {
400 tst_resm(TFAIL, "getaddrinfo IPv4 SOCK_STREAM/IPPROTO_UDP "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800401 "hints");
mridge7c0f5e52005-01-10 23:12:45 +0000402 freeaddrinfo(aires);
403 } else
404 tst_resm(TPASS, "getaddrinfo IPv4 SOCK_STREAM/IPPROTO_UDP "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800405 "hints");
mridge7c0f5e52005-01-10 23:12:45 +0000406
407 /* test 10, IPv4 socktype 0, 513 */
408
409 memset(&hints, 0, sizeof(hints));
410 hints.ai_family = AF_INET;
411 hints.ai_socktype = 0;
412 strcpy(service, "513");
413 servnum = htons(513);
414 TEST(getaddrinfo(0, service, &hints, &aires));
415 if (!TEST_RETURN) {
416 struct sockaddr_in *psin = 0;
417 int got_tcp, got_udp;
418 int err = 0;
419
420 got_tcp = got_udp = 0;
421 for (pai = aires; pai; pai = pai->ai_next) {
422 err |= pai->ai_family != AF_INET;
423 err |= pai->ai_addrlen != sizeof(struct sockaddr_in);
424 err |= pai->ai_addr == 0;
425 got_tcp |= pai->ai_socktype == SOCK_STREAM;
426 got_udp |= pai->ai_socktype == SOCK_DGRAM;
427 psin = (struct sockaddr_in *)pai->ai_addr;
428 if (pai->ai_addr) {
429 /* hostname not set; addr should be loopback */
430 err |= psin->sin_addr.s_addr !=
Wanlong Gao354ebb42012-12-07 10:10:04 +0800431 htonl(INADDR_LOOPBACK);
mridge7c0f5e52005-01-10 23:12:45 +0000432 err |= psin->sin_family != AF_INET;
433 err |= psin->sin_port != servnum;
434 }
435 if (err)
436 break;
437 }
438 if (err) {
439 tst_resm(TFAIL, "getaddrinfo IPv4 socktype 0,513: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800440 "fam %d alen %d addr 0x%p addr/fam %d "
441 "addr/port %d H[%d]",
442 pai->ai_family, pai->ai_addrlen, psin,
443 psin ? psin->sin_family : 0,
444 psin ? psin->sin_port : 0,
445 psin ? htons(psin->sin_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000446 } else if (got_tcp && got_udp)
447 tst_resm(TPASS, "getaddrinfo IPv4 socktype 0,513");
448 else
449 tst_resm(TFAIL, "getaddrinfo IPv4 socktype 0,513 TCP %d"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800450 " UDP %d", got_tcp, got_udp);
mridge7c0f5e52005-01-10 23:12:45 +0000451 freeaddrinfo(aires);
452 } else
453 tst_resm(TEST_RETURN == EAI_BADFLAGS ? TPASS : TFAIL,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800454 "getaddrinfo IPv4 socktype 0,513 (\"\", \"%s\") returns"
455 " %ld (\"%s\")", service, TEST_RETURN,
456 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000457
458 /* test 11, IPv4 AI_V4MAPPED */
459
460 /* AI_V4MAPPED should be ignored because family != AF_INET6 */
461 memset(&hints, 0, sizeof(hints));
462 hints.ai_family = AF_INET;
463 hints.ai_flags = AI_V4MAPPED;
464 TEST(getaddrinfo(hostname, 0, &hints, &aires));
465 if (!TEST_RETURN) {
466 struct sockaddr_in *psin = 0;
467 int err = 0;
468
469 for (pai = aires; pai; pai = pai->ai_next) {
470 err |= pai->ai_family != AF_INET;
471 err |= pai->ai_addrlen != sizeof(struct sockaddr_in);
472 err |= pai->ai_addr == 0;
473 psin = (struct sockaddr_in *)pai->ai_addr;
474 if (pai->ai_addr) {
475 err |= psin->sin_family != AF_INET;
476 err |= psin->sin_port != 0;
477 }
478 if (err)
479 break;
480 }
481 if (err) {
482 tst_resm(TFAIL, "getaddrinfo IPv4 AI_V4MAPPED: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800483 "fam %d alen %d addr 0x%p addr/fam %d "
484 "addr/port %d H[%d]",
485 pai->ai_family, pai->ai_addrlen, psin,
486 psin ? psin->sin_family : 0,
487 psin ? psin->sin_port : 0,
488 psin ? htons(psin->sin_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000489 } else
490 tst_resm(TPASS, "getaddrinfo IPv4 AI_V4MAPPED");
491 freeaddrinfo(aires);
492 } else
493 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv4 "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800494 "AI_V4MAPPED (\"%s\") returns %ld (\"%s\")", hostname,
495 TEST_RETURN, gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000496}
Wanlong Gao354ebb42012-12-07 10:10:04 +0800497
mridge7c0f5e52005-01-10 23:12:45 +0000498/* getaddrinfo tests (v6) */
499
Wanlong Gao354ebb42012-12-07 10:10:04 +0800500void gaiv6(void)
mridge7c0f5e52005-01-10 23:12:45 +0000501{
502 struct addrinfo *aires, hints, *pai;
Wanlong Gao354ebb42012-12-07 10:10:04 +0800503 char hostname[MAXHOSTNAMELEN + 1];
504 char shortname[MAXHOSTNAMELEN + 1];
505 char service[NI_MAXSERV + 1];
mridge7c0f5e52005-01-10 23:12:45 +0000506 int servnum;
507 char *p;
508
509 if (gethostname(hostname, sizeof(hostname)) < 0)
Garrett Cooper53740502010-12-16 00:04:01 -0800510 tst_brkm(TBROK, NULL, "gethostname failed - %s",
Wanlong Gao354ebb42012-12-07 10:10:04 +0800511 strerror(errno));
mridge7c0f5e52005-01-10 23:12:45 +0000512 strncpy(shortname, hostname, MAXHOSTNAMELEN);
513 shortname[MAXHOSTNAMELEN] = '\0';
514 p = strchr(shortname, '.');
515 if (p)
516 *p = '\0';
517
518 /* test 12, IPv6 basic lookup */
519 memset(&hints, 0, sizeof(hints));
520 hints.ai_family = AF_INET6;
521 TEST(getaddrinfo(hostname, 0, &hints, &aires));
522 if (!TEST_RETURN) {
523 struct sockaddr_in6 *psin6 = 0;
524 int err = 0;
525
526 for (pai = aires; pai; pai = pai->ai_next) {
527 err |= pai->ai_family != AF_INET6;
528 err |= pai->ai_addrlen != sizeof(struct sockaddr_in6);
529 err |= pai->ai_addr == 0;
530 psin6 = (struct sockaddr_in6 *)pai->ai_addr;
531 if (pai->ai_addr) {
532 err |= psin6->sin6_family != AF_INET6;
533 err |= psin6->sin6_port != 0;
534 }
535 if (err)
536 break;
537 }
538 if (err) {
539 tst_resm(TFAIL, "getaddrinfo IPv6 basic lookup: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800540 "fam %d alen %d addr 0x%p addr/fam %d "
541 "addr/port %d H[%d]",
542 pai->ai_family, pai->ai_addrlen, psin6,
543 psin6 ? psin6->sin6_family : 0,
544 psin6 ? psin6->sin6_port : 0,
545 psin6 ? htons(psin6->sin6_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000546 } else
547 tst_resm(TPASS, "getaddrinfo IPv6 basic lookup");
548 freeaddrinfo(aires);
549 } else
550 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv6 basic "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800551 "lookup (\"%s\") returns %ld (\"%s\")", hostname,
552 TEST_RETURN, gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000553
554 /* test 13, IPv6 canonical name */
555 memset(&hints, 0, sizeof(hints));
556 hints.ai_family = AF_INET6;
557 hints.ai_flags = AI_CANONNAME;
558 TEST(getaddrinfo(shortname, 0, &hints, &aires));
559 if (!TEST_RETURN) {
560 for (pai = aires; pai; pai = pai->ai_next)
561 if (pai->ai_canonname)
562 break;
563 if (!pai) {
564 tst_resm(TFAIL, "getaddrinfo IPv6 canonical name: no "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800565 "entries with canonical name set");
mridge7c0f5e52005-01-10 23:12:45 +0000566 } else if (strcasecmp(hostname, pai->ai_canonname)) {
567 tst_resm(TFAIL, "getaddrinfo IPv6 canonical name "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800568 "(\"%s\") doesn't match hostname (\"%s\")",
569 pai->ai_canonname, hostname);
mridge7c0f5e52005-01-10 23:12:45 +0000570 } else
571 tst_resm(TPASS, "getaddrinfo IPv6 canonical name");
572 freeaddrinfo(aires);
573 } else
574 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv6 "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800575 "canonical name (\"%s\") returns %ld (\"%s\")",
576 shortname, TEST_RETURN, gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000577
578 /* test 14, IPv6 host+service name */
579
580 memset(&hints, 0, sizeof(hints));
581 /*
582 * These are hard-coded for echo/7 to avoid using getservbyname(),
583 * since it isn't thread-safe and these tests may be re-used
584 * multithreaded. Sigh.
585 */
586 strcpy(service, "echo");
587 servnum = 7;
588 hints.ai_family = AF_INET6;
589 TEST(getaddrinfo(hostname, service, &hints, &aires));
590 if (!TEST_RETURN) {
591 struct sockaddr_in6 *psin6 = 0;
592 int err = 0;
593
594 for (pai = aires; pai; pai = pai->ai_next) {
595 err |= pai->ai_family != AF_INET6;
596 err |= pai->ai_addrlen != sizeof(struct sockaddr_in6);
597 err |= pai->ai_addr == 0;
598 psin6 = (struct sockaddr_in6 *)pai->ai_addr;
599 if (pai->ai_addr) {
600 err |= psin6->sin6_family != AF_INET6;
601 err |= psin6->sin6_port != htons(servnum);
602 }
603 if (err)
604 break;
605 }
606 if (err) {
607 tst_resm(TFAIL, "getaddrinfo IPv6 host+service: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800608 "fam %d alen %d addr 0x%p addr/fam %d "
609 "addr/port %d H[%d]",
610 pai->ai_family, pai->ai_addrlen, psin6,
611 psin6 ? psin6->sin6_family : 0,
612 psin6 ? psin6->sin6_port : 0,
613 psin6 ? htons(psin6->sin6_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000614 } else
615 tst_resm(TPASS, "getaddrinfo IPv6 host+service");
616 freeaddrinfo(aires);
617 } else
618 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv6 host+"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800619 "service returns %ld (\"%s\")", TEST_RETURN,
620 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000621
622 /* test 15, IPv6 hostname+service, AI_PASSIVE */
623 memset(&hints, 0, sizeof(hints));
624 hints.ai_family = AF_INET6;
625 hints.ai_flags = AI_PASSIVE;
626 hints.ai_socktype = SOCK_STREAM;
627 strcpy(service, "9462");
628 servnum = htons(9462);
629 TEST(getaddrinfo(hostname, service, &hints, &aires));
630 if (!TEST_RETURN) {
631 struct sockaddr_in6 *psin6 = 0;
632 int err = 0;
633
634 for (pai = aires; pai; pai = pai->ai_next) {
635 err |= pai->ai_family != AF_INET6;
636 err |= pai->ai_addrlen != sizeof(struct sockaddr_in6);
637 err |= pai->ai_addr == 0;
638 psin6 = (struct sockaddr_in6 *)pai->ai_addr;
639 if (pai->ai_addr) {
640 /* AI_PASSIVE is ignored if hostname is
641 * non-null; address must be set
642 */
643 err |= memcmp(&psin6->sin6_addr, &in6addr_any,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800644 sizeof(struct in6_addr)) == 0;
mridge7c0f5e52005-01-10 23:12:45 +0000645 err |= psin6->sin6_family != AF_INET6;
646 err |= psin6->sin6_port != servnum;
647 }
648 if (err)
649 break;
650 }
651 if (err) {
652 tst_resm(TFAIL, "getaddrinfo IPv6 host+service, PASSIVE"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800653 ": fam %d alen %d addr 0x%p addr/fam %d "
654 "addr/port %d H[%d]",
655 pai->ai_family, pai->ai_addrlen, psin6,
656 psin6 ? psin6->sin6_family : 0,
657 psin6 ? psin6->sin6_port : 0,
658 psin6 ? htons(psin6->sin6_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000659 } else
Wanlong Gao354ebb42012-12-07 10:10:04 +0800660 tst_resm(TPASS,
661 "getaddrinfo IPv6 host+service PASSIVE");
mridge7c0f5e52005-01-10 23:12:45 +0000662 freeaddrinfo(aires);
663 } else
664 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv6 host+"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800665 "service, PASSIVE (\"%s\", \"%s\") returns %ld (\"%s\")",
666 hostname, service, TEST_RETURN,
667 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000668
669 /* test 16, IPv6 host+service w/ AI_NUMERICHOST */
670
671 memset(&hints, 0, sizeof(hints));
672 strcpy(service, "echo");
673 servnum = 7;
674 hints.ai_family = AF_INET6;
675 hints.ai_flags = AI_NUMERICHOST;
676 TEST(getaddrinfo(hostname, service, &hints, &aires));
677 if (TEST_RETURN != EAI_NONAME) {
678 tst_resm(TFAIL, "getaddrinfo IPv6 AI_NUMERICHOST w/ hostname: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800679 "returns %ld expected %d (EAI_NONAME)",
680 TEST_RETURN, EAI_NONAME);
mridge7c0f5e52005-01-10 23:12:45 +0000681 } else
682 tst_resm(TPASS, "getaddrinfo IPv6 AI_NUMERICHOST w/ hostname");
683 if (!TEST_RETURN)
684 freeaddrinfo(aires);
685
686 /* test 17, IPv6 0+service, AI_PASSIVE */
687 memset(&hints, 0, sizeof(hints));
688 hints.ai_family = AF_INET6;
689 hints.ai_flags = AI_PASSIVE;
690 hints.ai_socktype = SOCK_STREAM;
691 strcpy(service, "9462");
692 servnum = htons(9462);
693 TEST(getaddrinfo(0, service, &hints, &aires));
694 if (!TEST_RETURN) {
695 struct sockaddr_in6 *psin6 = 0;
696 int err = 0;
697
698 for (pai = aires; pai; pai = pai->ai_next) {
699 err |= pai->ai_family != AF_INET6;
700 err |= pai->ai_addrlen != sizeof(struct sockaddr_in6);
701 err |= pai->ai_addr == 0;
702 psin6 = (struct sockaddr_in6 *)pai->ai_addr;
703 if (pai->ai_addr) {
704
705 /* AI_PASSIVE means addr must be INADDR_ANY */
706 err |= memcmp(&psin6->sin6_addr, &in6addr_any,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800707 sizeof(struct in6_addr)) != 0;
mridge7c0f5e52005-01-10 23:12:45 +0000708 err |= psin6->sin6_family != AF_INET6;
709 err |= psin6->sin6_port != servnum;
710 }
711 if (err)
712 break;
713 }
714 if (err) {
715 tst_resm(TFAIL, "getaddrinfo IPv6 0+service, PASSIVE:"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800716 " fam %d alen %d addr 0x%p addr/fam %d "
717 "addr/port %d H[%d]",
718 pai->ai_family, pai->ai_addrlen, psin6,
719 psin6 ? psin6->sin6_family : 0,
720 psin6 ? psin6->sin6_port : 0,
721 psin6 ? htons(psin6->sin6_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000722 } else
723 tst_resm(TPASS, "getaddrinfo IPv6 0+service, PASSIVE");
724 freeaddrinfo(aires);
725 } else
726 tst_resm(TEST_RETURN == EAI_BADFLAGS ? TPASS : TFAIL,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800727 "getaddrinfo IPv6 0+service, PASSIVE (\"\", \"%s\") "
728 "returns %ld (\"%s\")", service, TEST_RETURN,
729 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000730
mridge7c0f5e52005-01-10 23:12:45 +0000731 /* test 18, IPv6 0+service */
732
733 memset(&hints, 0, sizeof(hints));
734 hints.ai_family = AF_INET6;
735 hints.ai_socktype = SOCK_STREAM;
736 strcpy(service, "9462");
737 servnum = htons(9462);
738 TEST(getaddrinfo(0, service, &hints, &aires));
739 if (!TEST_RETURN) {
740 struct sockaddr_in6 *psin6 = 0;
741 int err = 0;
742
743 for (pai = aires; pai; pai = pai->ai_next) {
744 err |= pai->ai_family != AF_INET6;
745 err |= pai->ai_addrlen != sizeof(struct sockaddr_in6);
746 err |= pai->ai_addr == 0;
747 psin6 = (struct sockaddr_in6 *)pai->ai_addr;
748 if (pai->ai_addr) {
749 /* hostname not set; addr should be loopback */
750 err |= memcmp(&psin6->sin6_addr,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800751 &in6addr_loopback,
752 sizeof(struct in6_addr)) != 0;
mridge7c0f5e52005-01-10 23:12:45 +0000753 err |= psin6->sin6_family != AF_INET6;
754 err |= psin6->sin6_port != servnum;
755 }
756 if (err)
757 break;
758 }
759 if (err) {
760 tst_resm(TFAIL, "getaddrinfo IPv6 0+service: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800761 "fam %d alen %d addr 0x%p addr/fam %d "
762 "addr/port %d H[%d]",
763 pai->ai_family, pai->ai_addrlen, psin6,
764 psin6 ? psin6->sin6_family : 0,
765 psin6 ? psin6->sin6_port : 0,
766 psin6 ? htons(psin6->sin6_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000767 } else
768 tst_resm(TPASS, "getaddrinfo IPv6 0+service");
769 freeaddrinfo(aires);
770 } else
771 tst_resm(TEST_RETURN == EAI_BADFLAGS ? TPASS : TFAIL,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800772 "getaddrinfo IPv6 0+service (\"\", \"%s\") returns %ld "
773 "(\"%s\")", service, TEST_RETURN,
774 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000775
776 /* test 19, IPv6 host+service, AI_NUMERICSERV */
777
778#ifndef AI_NUMERICSERV
779 tst_resm(TFAIL, "getaddrinfo IPv6 host+service, AI_NUMERICSERV: flag "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800780 "not implemented");
mridge7c0f5e52005-01-10 23:12:45 +0000781#else
782 memset(&hints, 0, sizeof(hints));
783 strcpy(service, "echo");
784 servnum = 7;
785 hints.ai_family = AF_INET6;
786 hints.ai_flags = AI_NUMERICSERV;
787 TEST(getaddrinfo(hostname, service, &hints, &aires));
788 if (TEST_RETURN != EAI_NONAME) {
Wanlong Gao354ebb42012-12-07 10:10:04 +0800789 tst_resm(TFAIL,
790 "getaddrinfo IPv6 host+service, AI_NUMERICSERV: "
791 "returns %ld (\"%s\") expected %d (EAI_NONAME)",
792 TEST_RETURN, gai_strerror(TEST_RETURN), EAI_NONAME);
mridge7c0f5e52005-01-10 23:12:45 +0000793 } else
Wanlong Gao354ebb42012-12-07 10:10:04 +0800794 tst_resm(TPASS,
795 "getaddrinfo IPv6 host+service, AI_NUMERICSERV");
mridge7c0f5e52005-01-10 23:12:45 +0000796 if (!TEST_RETURN)
797 freeaddrinfo(aires);
798#endif /* AI_NUMERICSERV */
799
800 /* test 20, IPv6 SOCK_STREAM/IPPROTO_UDP hints */
801
802 memset(&hints, 0, sizeof(hints));
803 hints.ai_family = AF_INET6;
804 hints.ai_socktype = SOCK_STREAM;
805 hints.ai_protocol = IPPROTO_UDP;
806 strcpy(service, "9462");
807 servnum = htons(9462);
808 TEST(getaddrinfo(0, service, &hints, &aires));
809 if (!TEST_RETURN) {
810 tst_resm(TFAIL, "getaddrinfo IPv6 SOCK_STREAM/IPPROTO_UDP "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800811 "hints");
mridge7c0f5e52005-01-10 23:12:45 +0000812 freeaddrinfo(aires);
813 } else
814 tst_resm(TPASS, "getaddrinfo IPv6 SOCK_STREAM/IPPROTO_UDP "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800815 "hints");
mridge7c0f5e52005-01-10 23:12:45 +0000816
817 /* test 21, IPv6 socktype 0, 513 */
818
819 memset(&hints, 0, sizeof(hints));
820 hints.ai_family = AF_INET6;
821 hints.ai_socktype = 0;
822 strcpy(service, "513");
823 servnum = htons(513);
824 TEST(getaddrinfo(0, service, &hints, &aires));
825 if (!TEST_RETURN) {
826 struct sockaddr_in6 *psin6 = 0;
827 int got_tcp, got_udp;
828 int err = 0;
829
830 got_tcp = got_udp = 0;
831 for (pai = aires; pai; pai = pai->ai_next) {
832 err |= pai->ai_family != AF_INET6;
833 err |= pai->ai_addrlen != sizeof(struct sockaddr_in6);
834 err |= pai->ai_addr == 0;
835 got_tcp |= pai->ai_socktype == SOCK_STREAM;
836 got_udp |= pai->ai_socktype == SOCK_DGRAM;
837 psin6 = (struct sockaddr_in6 *)pai->ai_addr;
838 if (pai->ai_addr) {
839 /* hostname not set; addr should be loopback */
840 err |= memcmp(&psin6->sin6_addr,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800841 &in6addr_loopback,
842 sizeof(struct in6_addr)) != 0;
mridge7c0f5e52005-01-10 23:12:45 +0000843 err |= psin6->sin6_family != AF_INET6;
844 err |= psin6->sin6_port != servnum;
845 }
846 if (err)
847 break;
848 }
849 if (err) {
850 tst_resm(TFAIL, "getaddrinfo IPv6 socktype 0,513: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800851 "fam %d alen %d addr 0x%p addr/fam %d "
852 "addr/port %d H[%d]",
853 pai->ai_family, pai->ai_addrlen, psin6,
854 psin6 ? psin6->sin6_family : 0,
855 psin6 ? psin6->sin6_port : 0,
856 psin6 ? htons(psin6->sin6_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000857 } else if (got_tcp && got_udp)
858 tst_resm(TPASS, "getaddrinfo IPv6 socktype 0,513");
859 else
860 tst_resm(TFAIL, "getaddrinfo IPv6 socktype 0,513 TCP %d"
Wanlong Gao354ebb42012-12-07 10:10:04 +0800861 " UDP %d", got_tcp, got_udp);
mridge7c0f5e52005-01-10 23:12:45 +0000862 freeaddrinfo(aires);
863 } else
864 tst_resm(TEST_RETURN == EAI_BADFLAGS ? TPASS : TFAIL,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800865 "getaddrinfo IPv6 socktype 0,513 (\"\", \"%s\") returns"
866 " %ld (\"%s\")", service, TEST_RETURN,
867 gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000868
869 /* test 22, IPv6 AI_V4MAPPED */
870
871 memset(&hints, 0, sizeof(hints));
872 hints.ai_family = AF_INET6;
873 hints.ai_flags = AI_V4MAPPED;
874 TEST(getaddrinfo(hostname, 0, &hints, &aires));
875 if (!TEST_RETURN) {
876 struct sockaddr_in6 *psin6 = 0;
877 int err = 0;
878
879 for (pai = aires; pai; pai = pai->ai_next) {
880 err |= pai->ai_family != AF_INET6;
881 err |= pai->ai_addrlen != sizeof(struct sockaddr_in6);
882 err |= pai->ai_addr == 0;
883 psin6 = (struct sockaddr_in6 *)pai->ai_addr;
884 if (pai->ai_addr) {
885 err |= psin6->sin6_family != AF_INET6;
886 err |= psin6->sin6_port != 0;
887 }
888 if (err)
889 break;
890 }
891 if (err) {
892 tst_resm(TFAIL, "getaddrinfo IPv6 AI_V4MAPPED: "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800893 "fam %d alen %d addr 0x%p addr/fam %d "
894 "addr/port %d H[%d]",
895 pai->ai_family, pai->ai_addrlen, psin6,
896 psin6 ? psin6->sin6_family : 0,
897 psin6 ? psin6->sin6_port : 0,
898 psin6 ? htons(psin6->sin6_port) : 0);
mridge7c0f5e52005-01-10 23:12:45 +0000899 } else
900 tst_resm(TPASS, "getaddrinfo IPv6 AI_V4MAPPED");
901 freeaddrinfo(aires);
902 } else
903 tst_resm(TEST_RETURN ? TFAIL : TPASS, "getaddrinfo IPv6 "
Wanlong Gao354ebb42012-12-07 10:10:04 +0800904 "AI_V4MAPPED (\"%s\") returns %ld (\"%s\")", hostname,
905 TEST_RETURN, gai_strerror(TEST_RETURN));
mridge7c0f5e52005-01-10 23:12:45 +0000906}
907
908/* this prints an addrinfo list; useful for debugging */
Wanlong Gao354ebb42012-12-07 10:10:04 +0800909void dumpres(struct addrinfo *pai)
mridge7c0f5e52005-01-10 23:12:45 +0000910{
Wanlong Gao354ebb42012-12-07 10:10:04 +0800911 int count = 1;
mridge7c0f5e52005-01-10 23:12:45 +0000912 for (; pai; pai = pai->ai_next, count++) {
subrata_modakaa588ae2008-09-18 13:18:36 +0000913 printf("result %d [0x%p]\n", count, pai);
mridge7c0f5e52005-01-10 23:12:45 +0000914 printf("\tai_flags %x\n", pai->ai_flags);
915 printf("\tai_family %d\n", pai->ai_family);
916 printf("\tai_socktype %d\n", pai->ai_socktype);
917 printf("\tai_protocol %d\n", pai->ai_protocol);
918 printf("\tai_addrlen %d\n", pai->ai_addrlen);
919 printf("\tai_canonname \"%s\"\n", pai->ai_canonname);
920 printf("\tai_addr.sa_family %x\n", pai->ai_addr->sa_family);
921 if (pai->ai_addr->sa_family == AF_INET) {
922 char buf[1024];
923 struct sockaddr_in *psin =
Wanlong Gao354ebb42012-12-07 10:10:04 +0800924 (struct sockaddr_in *)pai->ai_addr;
mridge7c0f5e52005-01-10 23:12:45 +0000925
926 if (!inet_ntop(AF_INET, &psin->sin_addr, buf,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800927 sizeof(buf)))
928 buf[0] = '\0';
mridge7c0f5e52005-01-10 23:12:45 +0000929 printf("\tai_addr.sin_addr \"%s\"\n", buf);
930 } else if (pai->ai_addr->sa_family == AF_INET6) {
931 char buf[1024];
932
933 struct sockaddr_in6 *psin6 =
Wanlong Gao354ebb42012-12-07 10:10:04 +0800934 (struct sockaddr_in6 *)pai->ai_addr;
mridge7c0f5e52005-01-10 23:12:45 +0000935 if (!inet_ntop(AF_INET6, &psin6->sin6_addr, buf,
Wanlong Gao354ebb42012-12-07 10:10:04 +0800936 sizeof(buf)))
937 buf[0] = '\0';
mridge7c0f5e52005-01-10 23:12:45 +0000938 printf("\tai_addr.sin6_addr \"%s\"\n", buf);
939
940 }
subrata_modakaa588ae2008-09-18 13:18:36 +0000941 printf("\tai_next %p\n", pai->ai_next);
mridge7c0f5e52005-01-10 23:12:45 +0000942 }
943}
944
Wanlong Gao354ebb42012-12-07 10:10:04 +0800945void setup(void)
mridge7c0f5e52005-01-10 23:12:45 +0000946{
Wanlong Gao354ebb42012-12-07 10:10:04 +0800947 TEST_PAUSE; /* if -P option specified */
mridge7c0f5e52005-01-10 23:12:45 +0000948}
949
Wanlong Gao354ebb42012-12-07 10:10:04 +0800950void cleanup(void)
mridge7c0f5e52005-01-10 23:12:45 +0000951{
Chris Dearmanec6edca2012-10-17 19:54:01 -0700952}