|  | #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; | 
|  | } |