mirror of git://sourceware.org/git/glibc.git
				
				
				
			
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
#include <mcheck.h>
 | 
						|
#include <netdb.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <arpa/inet.h>
 | 
						|
#include <arpa/nameser.h>
 | 
						|
 | 
						|
 | 
						|
static int
 | 
						|
do_test (void)
 | 
						|
{
 | 
						|
  mtrace ();
 | 
						|
 | 
						|
  int result = 0;
 | 
						|
  struct addrinfo hints;
 | 
						|
  struct addrinfo *ai_res;
 | 
						|
  int s;
 | 
						|
 | 
						|
#define T(no, fail, addr, fam, coraddr)					      \
 | 
						|
  s = getaddrinfo (addr, NULL, &hints, &ai_res);			      \
 | 
						|
  if (s != 0)								      \
 | 
						|
    {									      \
 | 
						|
      if (s != fail)							      \
 | 
						|
	{								      \
 | 
						|
	  printf ("getaddrinfo test %d failed: %s\n", no, gai_strerror (s));  \
 | 
						|
	  result = 1;							      \
 | 
						|
	}								      \
 | 
						|
      ai_res = NULL;							      \
 | 
						|
    }									      \
 | 
						|
  else if (fail)							      \
 | 
						|
    {									      \
 | 
						|
      printf ("getaddrinfo test %d should have failed but did not\n", no);    \
 | 
						|
      result = 1;							      \
 | 
						|
    }									      \
 | 
						|
  else if (ai_res->ai_family != fam)					      \
 | 
						|
    {									      \
 | 
						|
      printf ("\
 | 
						|
getaddrinfo test %d return address of family %d, expected %d\n",	      \
 | 
						|
	      no, ai_res->ai_family, fam);				      \
 | 
						|
      result = 1;							      \
 | 
						|
    }									      \
 | 
						|
  else if (fam == AF_INET)						      \
 | 
						|
    {									      \
 | 
						|
      if (ai_res->ai_addrlen != sizeof (struct sockaddr_in))		      \
 | 
						|
	{								      \
 | 
						|
	  printf ("getaddrinfo test %d: address size %zu, expected %zu\n",    \
 | 
						|
		  no, (size_t) ai_res->ai_addrlen,			      \
 | 
						|
		  sizeof (struct sockaddr_in));				      \
 | 
						|
	  result = 1;							      \
 | 
						|
	}								      \
 | 
						|
      else if (strcmp (coraddr, \
 | 
						|
		       inet_ntoa (((struct sockaddr_in *) ai_res->ai_addr)->sin_addr))\
 | 
						|
	       != 0)							      \
 | 
						|
	{								      \
 | 
						|
	  printf ("getaddrinfo test %d: got value %s, expected %s\n",	      \
 | 
						|
		  no,							      \
 | 
						|
		  inet_ntoa (((struct sockaddr_in *) ai_res->ai_addr)->sin_addr), \
 | 
						|
		  coraddr);						      \
 | 
						|
	  result = 1;							      \
 | 
						|
	}								      \
 | 
						|
    }									      \
 | 
						|
  else									      \
 | 
						|
    {									      \
 | 
						|
      char buf[100];							      \
 | 
						|
									      \
 | 
						|
      if (ai_res->ai_addrlen != sizeof (struct sockaddr_in6))		      \
 | 
						|
	{								      \
 | 
						|
	  printf ("getaddrinfo test %d: address size %zu, expected %zu\n",    \
 | 
						|
		  no, (size_t) ai_res->ai_addrlen,			      \
 | 
						|
		  sizeof (struct sockaddr_in6));			      \
 | 
						|
	  result = 1;							      \
 | 
						|
	}								      \
 | 
						|
      else if (strcmp (coraddr, \
 | 
						|
		       inet_ntop (AF_INET6,				      \
 | 
						|
				  &((struct sockaddr_in6 *) ai_res->ai_addr)->sin6_addr,\
 | 
						|
				  buf, sizeof (buf)))			      \
 | 
						|
	       != 0)							      \
 | 
						|
	{								      \
 | 
						|
	  printf ("getaddrinfo test %d: got value %s, expected %s\n",	      \
 | 
						|
		  no,							      \
 | 
						|
		  inet_ntop (AF_INET6,					      \
 | 
						|
			     & ((struct sockaddr_in6 *) ai_res->ai_addr)->sin6_addr, \
 | 
						|
			     buf, sizeof (buf)),			      \
 | 
						|
		  coraddr);						      \
 | 
						|
	  result = 1;							      \
 | 
						|
	}								      \
 | 
						|
    }									      \
 | 
						|
  if (ai_res != NULL && ai_res->ai_next != NULL)			      \
 | 
						|
    {									      \
 | 
						|
      puts ("expected only one result");				      \
 | 
						|
      result = 1;							      \
 | 
						|
    }									      \
 | 
						|
  freeaddrinfo (ai_res)
 | 
						|
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_UNSPEC;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (1, 0, "127.0.0.1", AF_INET, "127.0.0.1");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_INET;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (2, 0, "127.0.0.1", AF_INET, "127.0.0.1");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_INET6;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  hints.ai_flags = AI_V4MAPPED;
 | 
						|
  T (3, 0, "127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_INET6;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (4, EAI_ADDRFAMILY, "127.0.0.1", AF_INET6, "");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_UNSPEC;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (5, 0, "::1", AF_INET6, "::1");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_INET;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (6, EAI_ADDRFAMILY, "::1", AF_INET6, "");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_INET6;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (7, 0, "::1", AF_INET6, "::1");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_UNSPEC;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (8, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_INET;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (9, 0, "::ffff:127.0.0.1", AF_INET, "127.0.0.1");
 | 
						|
 | 
						|
  memset (&hints, '\0', sizeof (hints));
 | 
						|
  hints.ai_family = AF_INET6;
 | 
						|
  hints.ai_socktype = SOCK_STREAM;
 | 
						|
  T (10, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
 | 
						|
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
#define TEST_FUNCTION do_test ()
 | 
						|
#include "../test-skeleton.c"
 |