summaryrefslogtreecommitdiff
path: root/resolv/ga_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'resolv/ga_test.c')
-rw-r--r--resolv/ga_test.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/resolv/ga_test.c b/resolv/ga_test.c
new file mode 100644
index 0000000000..673162f015
--- /dev/null
+++ b/resolv/ga_test.c
@@ -0,0 +1,99 @@
+#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;
+}