|  | #include <mcheck.h> | 
|  | #include <netdb.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <arpa/inet.h> | 
|  | #include <arpa/nameser.h> | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | mtrace (); | 
|  |  | 
|  | int result = 0; | 
|  | struct addrinfo hints; | 
|  | struct addrinfo *ai_res; | 
|  | int s; | 
|  |  | 
|  | #define T(no, fail, addr, fam, coraddr)					      \ | 
|  | s = getaddrinfo (addr, NULL, &hints, &ai_res);			      \ | 
|  | if (s != 0)								      \ | 
|  | {									      \ | 
|  | if (s != fail)							      \ | 
|  | {								      \ | 
|  | printf ("getaddrinfo test %d failed: %s\n", no, gai_strerror (s));  \ | 
|  | result = 1;							      \ | 
|  | }								      \ | 
|  | ai_res = NULL;							      \ | 
|  | }									      \ | 
|  | else if (fail)							      \ | 
|  | {									      \ | 
|  | printf ("getaddrinfo test %d should have failed but did not\n", no);    \ | 
|  | result = 1;							      \ | 
|  | }									      \ | 
|  | else if (ai_res->ai_family != fam)					      \ | 
|  | {									      \ | 
|  | printf ("\ | 
|  | getaddrinfo test %d return address of family %d, expected %d\n",	      \ | 
|  | no, ai_res->ai_family, fam);				      \ | 
|  | result = 1;							      \ | 
|  | }									      \ | 
|  | else if (fam == AF_INET)						      \ | 
|  | {									      \ | 
|  | if (ai_res->ai_addrlen != sizeof (struct sockaddr_in))		      \ | 
|  | {								      \ | 
|  | printf ("getaddrinfo test %d: address size %zu, expected %zu\n",    \ | 
|  | no, (size_t) ai_res->ai_addrlen,			      \ | 
|  | sizeof (struct sockaddr_in));				      \ | 
|  | result = 1;							      \ | 
|  | }								      \ | 
|  | else if (strcmp (coraddr, \ | 
|  | inet_ntoa (((struct sockaddr_in *) ai_res->ai_addr)->sin_addr))\ | 
|  | != 0)							      \ | 
|  | {								      \ | 
|  | printf ("getaddrinfo test %d: got value %s, expected %s\n",	      \ | 
|  | no,							      \ | 
|  | inet_ntoa (((struct sockaddr_in *) ai_res->ai_addr)->sin_addr), \ | 
|  | coraddr);						      \ | 
|  | result = 1;							      \ | 
|  | }								      \ | 
|  | }									      \ | 
|  | else									      \ | 
|  | {									      \ | 
|  | char buf[100];							      \ | 
|  | \ | 
|  | if (ai_res->ai_addrlen != sizeof (struct sockaddr_in6))		      \ | 
|  | {								      \ | 
|  | printf ("getaddrinfo test %d: address size %zu, expected %zu\n",    \ | 
|  | no, (size_t) ai_res->ai_addrlen,			      \ | 
|  | sizeof (struct sockaddr_in6));			      \ | 
|  | result = 1;							      \ | 
|  | }								      \ | 
|  | else if (strcmp (coraddr, \ | 
|  | inet_ntop (AF_INET6,				      \ | 
|  | &((struct sockaddr_in6 *) ai_res->ai_addr)->sin6_addr,\ | 
|  | buf, sizeof (buf)))			      \ | 
|  | != 0)							      \ | 
|  | {								      \ | 
|  | printf ("getaddrinfo test %d: got value %s, expected %s\n",	      \ | 
|  | no,							      \ | 
|  | inet_ntop (AF_INET6,					      \ | 
|  | & ((struct sockaddr_in6 *) ai_res->ai_addr)->sin6_addr, \ | 
|  | buf, sizeof (buf)),			      \ | 
|  | coraddr);						      \ | 
|  | result = 1;							      \ | 
|  | }								      \ | 
|  | }									      \ | 
|  | if (ai_res != NULL && ai_res->ai_next != NULL)			      \ | 
|  | {									      \ | 
|  | puts ("expected only one result");				      \ | 
|  | result = 1;							      \ | 
|  | }									      \ | 
|  | freeaddrinfo (ai_res) | 
|  |  | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_UNSPEC; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (1, 0, "127.0.0.1", AF_INET, "127.0.0.1"); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_INET; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (2, 0, "127.0.0.1", AF_INET, "127.0.0.1"); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_INET6; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | hints.ai_flags = AI_V4MAPPED; | 
|  | T (3, 0, "127.0.0.1", AF_INET6, "::ffff:127.0.0.1"); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_INET6; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (4, EAI_ADDRFAMILY, "127.0.0.1", AF_INET6, ""); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_UNSPEC; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (5, 0, "::1", AF_INET6, "::1"); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_INET; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (6, EAI_ADDRFAMILY, "::1", AF_INET6, ""); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_INET6; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (7, 0, "::1", AF_INET6, "::1"); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_UNSPEC; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (8, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1"); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_INET; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (9, 0, "::ffff:127.0.0.1", AF_INET, "127.0.0.1"); | 
|  |  | 
|  | memset (&hints, '\0', sizeof (hints)); | 
|  | hints.ai_family = AF_INET6; | 
|  | hints.ai_socktype = SOCK_STREAM; | 
|  | T (10, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1"); | 
|  |  | 
|  | return result; | 
|  | } | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  | #include "../test-skeleton.c" |