#include <arpa/inet.h> #include <netinet/in.h> #include <netdb.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> int main (void) { #define N 10 struct gaicb reqmem[N]; struct gaicb *req[N]; int n; for (n = 0; n < N; ++n) { asprintf (&reqmem[n].ar_name, "test%d.test.redhat.com", 140 + n); reqmem[n].ar_service = NULL; reqmem[n].ar_request = NULL; reqmem[n].ar_result = NULL; req[n] = &reqmem[n]; } if (getaddrinfo_a (GAI_NOWAIT, req, N, NULL) != 0) { puts ("queue call failed"); exit (1); } else puts ("queue call successful"); while (1) { int any = 0; for (n = 0; n < N; ++n) if (req[n] != NULL && gai_error (req[n]) != EAI_INPROGRESS) { if (gai_error (req[n]) == 0) { struct addrinfo *runp = req[n]->ar_result; while (runp != NULL) { switch (runp->ai_family) { case PF_INET: { struct sockaddr_in *sinp; sinp = (struct sockaddr_in *) runp->ai_addr; printf ("%2d: %s = %s\n", n, req[n]->ar_name, inet_ntoa (sinp->sin_addr)); } break; default: printf ("%2d: family %d\n", n, runp->ai_family); break; } runp = runp->ai_next; } } else printf ("error for %d: %s\n", n, gai_strerror (gai_error (req[n]))); req[n] = NULL; break; } else if (req[n] != NULL) any = 1; if (n == N) { if (any) gai_suspend (req, N, NULL); else break; } } __libc_write(1,"got all\n", 8); for (n = 0; n < N; ++n) if (gai_error (&reqmem[n]) == 0) { struct addrinfo *runp = reqmem[n].ar_result; while (runp != NULL) { struct addrinfo *oldp = runp; runp = runp->ai_next; freeaddrinfo (oldp); } } return 0; }