/* Test by David L Stevens <dlstevens@us.ibm.com> [BZ #358] */ #include <errno.h> #include <netdb.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> static int do_test (void) { const char portstr[] = "583"; int port = atoi (portstr); struct addrinfo hints, *aires, *pai; int rv; int res = 1; memset (&hints, 0, sizeof (hints)); hints.ai_family = AF_INET; rv = getaddrinfo (NULL, portstr, &hints, &aires); if (rv == 0) { struct sockaddr_in *psin = 0; int got_tcp, got_udp; int err = 0; got_tcp = got_udp = 0; for (pai = aires; pai; pai = pai->ai_next) { printf ("ai_family=%d, ai_addrlen=%d, ai_socktype=%d", (int) pai->ai_family, (int) pai->ai_addrlen, (int) pai->ai_socktype); if (pai->ai_family == AF_INET) printf (", port=%d", ntohs (((struct sockaddr_in *) pai->ai_addr)->sin_port)); puts (""); err |= pai->ai_family != AF_INET; err |= pai->ai_addrlen != sizeof (struct sockaddr_in); err |= pai->ai_addr == 0; if (pai->ai_family == AF_INET) err |= ntohs (((struct sockaddr_in *) pai->ai_addr)->sin_port) != port; got_tcp |= pai->ai_socktype == SOCK_STREAM; got_udp |= pai->ai_socktype == SOCK_DGRAM; if (err) break; } if (err) { printf ("FAIL getaddrinfo IPv4 socktype 0,513: " "fam %d alen %d addr %p addr/fam %d " "addr/port %d H[%d]\n", pai->ai_family, pai->ai_addrlen, psin, psin ? psin->sin_family : 0, psin ? psin->sin_port : 0, psin ? htons (psin->sin_port) : 0); } else if (got_tcp && got_udp) { printf ("SUCCESS getaddrinfo IPv4 socktype 0,513\n"); res = 0; } else printf ("FAIL getaddrinfo IPv4 socktype 0,513 TCP %d" " UDP %d\n", got_tcp, got_udp); freeaddrinfo (aires); } else printf ("FAIL getaddrinfo IPv4 socktype 0,513 returns %d " "(\"%s\")\n", rv, gai_strerror (rv)); return res; } #define TEST_FUNCTION do_test () #include "../test-skeleton.c"