100 lines
1.8 KiB
C
100 lines
1.8 KiB
C
#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;
|
|
}
|