/* test-getaddrinfo.c * * Test to make sure that getaddrinfo works as expected. * * gcc -Wall -g -O0 -o test-getaddrinfo test-getaddrinfo.c -lbind * * Usage is ./test-getaddrinfo * * This shows that getaddrinfo on BeOS BONE is broken (on BONE 7a) * as shown below. (getnameinfo is also broken). * * FreeBSD 4.9 (20480 is decimal for 80 in network byte order) * * $ ./test-getaddrinfo www.google.com 80 * managed to get details for host www.google.com, port 80 * Checking returned hosts using getnameinfo: * 1: sockaddr : 66.102.9.104 port 20480 => OK * getnameinfo : 66.102.9.104 port '80' * 2: sockaddr : 66.102.9.99 port 20480 => OK * getnameinfo : 66.102.9.99 port '80' * * BeOS BONE 7a * * $ ./test-getaddrinfo www.google.com 80 * managed to get details for host www.google.com, port 80 * Checking returned hosts using getnameinfo: * 1: sockaddr : 66.102.9.104 port 80 => OK * getnameinfo : 66.102.9.104 port '' * 2: sockaddr : 66.102.9.99 port 80 => OK * getnameinfo : 66.102.9.99 port '' * */ #include #include #include #include #include #include void usage(void) { printf("usage: test-getaddrinfo \n"); exit(-1); } int main(int argc, char *argv[]) { struct addrinfo hints, *ai = NULL, *aitop = NULL; int error, i; char ntop[NI_MAXHOST], strport[NI_MAXSERV]; if (argc < 3) usage(); memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; if ((error = getaddrinfo(argv[1], argv[2], &hints, &aitop)) != 0) { printf("%s: %.100s: %s", argv[0], argv[1], gai_strerror(error)); exit(-1); } printf("managed to get details for host %s, port %s\n", argv[1], argv[2]); printf("Checking returned hosts using getnameinfo:\n"); for (ai = aitop, i = 1; ai; ai = ai->ai_next) { struct sockaddr_in *sa = (struct sockaddr_in*)ai->ai_addr; if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) continue; printf(" %2d: sockaddr : %s port %d => ", i++, inet_ntoa(sa->sin_addr), sa->sin_port); if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop), strport, sizeof(strport), NI_NUMERICHOST | NI_NUMERICSERV) != 0) { printf("failed\n"); continue; } printf("OK\n"); printf(" getnameinfo : %s port '%s'\n", ntop, strport); } return 0; }