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