Back to index

glibc  2.9
Defines | Functions
ga_test.c File Reference
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

Go to the source code of this file.

Defines

#define N   10

Functions

int main (void)

Define Documentation

#define N   10

Function Documentation

int main ( void  )

Definition at line 10 of file ga_test.c.

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

Here is the call graph for this function: