Test for getaddrinfo.
[kopensolaris-gnu/glibc.git] / posix / tst-getaddrinfo2.c
1 /* Test by David L Stevens <dlstevens@us.ibm.com> [BZ #358] */
2 #include <errno.h>
3 #include <netdb.h>
4 #include <unistd.h>
5 #include <sys/socket.h>
6
7 static int
8 do_test (void)
9 {
10   const char portstr[] = "583";
11   int port = atoi (portstr);
12   struct addrinfo hints, *aires, *pai;
13   int rv;
14   int res = 1;
15
16   memset (&hints, 0, sizeof (hints));
17   hints.ai_family = AF_INET;
18   rv = getaddrinfo (NULL, portstr, &hints, &aires);
19   if (rv == 0)
20     {
21       struct sockaddr_in *psin = 0;
22       int got_tcp, got_udp;
23       int err = 0;
24
25       got_tcp = got_udp = 0;
26       for (pai = aires; pai; pai = pai->ai_next)
27         {
28           printf ("ai_family=%d, ai_addrlen=%d, ai_socktype=%d",
29                   (int) pai->ai_family, (int) pai->ai_addrlen,
30                   (int) pai->ai_socktype);
31           if (pai->ai_family == AF_INET)
32             printf (", port=%d",
33                     ntohs (((struct sockaddr_in *) pai->ai_addr)->sin_port));
34           puts ("");
35
36           err |= pai->ai_family != AF_INET;
37           err |= pai->ai_addrlen != sizeof (struct sockaddr_in);
38           err |= pai->ai_addr == 0;
39           if (pai->ai_family == AF_INET)
40             err |=
41               ntohs (((struct sockaddr_in *) pai->ai_addr)->sin_port) != port;
42           got_tcp |= pai->ai_socktype == SOCK_STREAM;
43           got_udp |= pai->ai_socktype == SOCK_DGRAM;
44           if (err)
45             break;
46         }
47       if (err)
48         {
49           printf ("FAIL getaddrinfo IPv4 socktype 0,513: "
50                   "fam %d alen %d addr 0x%08X addr/fam %d "
51                   "addr/port %d H[%d]\n",
52                   pai->ai_family, pai->ai_addrlen, psin,
53                   psin ? psin->sin_family : 0,
54                   psin ? psin->sin_port : 0,
55                   psin ? htons (psin->sin_port) : 0);
56         }
57       else if (got_tcp && got_udp)
58         {
59           printf ("SUCCESS getaddrinfo IPv4 socktype 0,513\n");
60           res = 0;
61         }
62       else
63         printf ("FAIL getaddrinfo IPv4 socktype 0,513 TCP %d"
64                 " UDP %d\n", got_tcp, got_udp);
65       freeaddrinfo (aires);
66     }
67   else
68     printf ("FAIL getaddrinfo IPv4 socktype 0,513 returns %d "
69             "(\"%s\")\n", rv, gai_strerror (rv));
70
71   return res;
72 }
73
74 #define TEST_FUNCTION do_test ()
75 #include "../test-skeleton.c"