
1: #include <arpa/inet.h> 2: #include <netinet/in.h> 3: #include <netdb.h> 4: #include <signal.h> 5: #include <stdio.h> 6: #include <stdlib.h> 7: 8: 9: int 10: main (void) 11: { 12: #define N 10 13: struct gaicb reqmem[N]; 14: struct gaicb *req[N]; 15: int n; 16: 17: for (n = 0; n < N; ++n) 18: { 19: asprintf (&reqmem[n].ar_name, "test%d.test.redhat.com", 140 + n); 20: reqmem[n].ar_service = NULL; 21: reqmem[n].ar_request = NULL; 22: reqmem[n].ar_result = NULL; 23: req[n] = &reqmem[n]; 24: } 25: 26: if (getaddrinfo_a (GAI_NOWAIT, req, N, NULL) != 0) 27: { 28: puts ("queue call failed"); 29: exit (1); 30: } 31: else 32: puts ("queue call successful"); 33: 34: while (1) 35: { 36: int any = 0; 37: 38: for (n = 0; n < N; ++n) 39: if (req[n] != NULL && gai_error (req[n]) != EAI_INPROGRESS) 40: { 41: if (gai_error (req[n]) == 0) 42: { 43: struct addrinfo *runp = req[n]->ar_result; 44: 45: while (runp != NULL) 46: { 47: switch (runp->ai_family) 48: { 49: case PF_INET: 50: { 51: struct sockaddr_in *sinp; 52: 53: sinp = (struct sockaddr_in *) runp->ai_addr; 54: printf ("%2d: %s = %s\n", n, 55: req[n]->ar_name, inet_ntoa (sinp->sin_addr)); 56: } 57: break; 58: default: 59: printf ("%2d: family %d\n", n, runp->ai_family); 60: break; 61: } 62: runp = runp->ai_next; 63: } 64: } 65: else 66: printf ("error for %d: %s\n", n, 67: gai_strerror (gai_error (req[n]))); 68: req[n] = NULL; 69: break; 70: } 71: else if (req[n] != NULL) 72: any = 1; 73: 74: if (n == N) 75: { 76: if (any) 77: gai_suspend (req, N, NULL); 78: else 79: break; 80: } 81: } 82: 83: __libc_write(1,"got all\n", 8); 84: 85: for (n = 0; n < N; ++n) 86: if (gai_error (&reqmem[n]) == 0) 87: { 88: struct addrinfo *runp = reqmem[n].ar_result; 89: 90: while (runp != NULL) 91: { 92: struct addrinfo *oldp = runp; 93: runp = runp->ai_next; 94: freeaddrinfo (oldp); 95: } 96: } 97: 98: return 0; 99: }