This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[1.7] getaddrinfo failure


The coreutils testsuite includes a test of getaddrinfo (simplified slightly 
before attaching here), and it is failing for me on a Windows XP machine (I 
don't have access to Windows Vista to see if it behaves any better there).  I 
have not yet built a debugging cygwin1.dll to try to figure out where the 
EFAULT is resulting from, but it seems like this is probably a bug in cygwin 
itself, as the testcase looks like it is calling everything with proper 
pointers.

$ cat foo.c
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

/* Whether to print debugging messages.  */
#define ENABLE_DEBUGGING 1

#if ENABLE_DEBUGGING
# define dbgprintf printf
#else
# define dbgprintf if (0) printf
#endif

/* BeOS does not have AF_UNSPEC.  */
#ifndef AF_UNSPEC
# define AF_UNSPEC 0
#endif

#ifndef EAI_SERVICE
# define EAI_SERVICE 0
#endif

int simple (char *host, char *service)
{
  char buf[BUFSIZ];
  static int skip = 0;
  struct addrinfo *ai0, *ai;
  int res;
  int err;

  /* Once we skipped the test, do not try anything else */
  if (skip)
    return 0;

  dbgprintf ("Finding %s service %s...\n", host, service);

  errno = 0;
  res = getaddrinfo (host, service, 0, &ai0);
  err = errno;

  dbgprintf ("res %d: %s\n", res, gai_strerror (res));

  if (res != 0)
    {
      /* EAI_AGAIN is returned if no network is available. Don't fail
	 the test merely because someone is down the country on their
	 in-law's farm. */
      if (res == EAI_AGAIN)
	{
	  skip++;
	  fprintf (stderr, "skipping getaddrinfo test: no network?\n");
	  return 77;
	}
      /* IRIX reports EAI_NONAME for "https".  Don't fail the test
	 merely because of this.  */
      if (res == EAI_NONAME)
	return 0;
      /* Solaris reports EAI_SERVICE for "http" and "https".  Don't
         fail the test merely because of this.  */
      if (res == EAI_SERVICE)
	return 0;
      /* AIX reports EAI_NODATA for "https".  Don't fail the test
	 merely because of this.  */
      if (res == EAI_NODATA)
	return 0;
      if (res == EAI_SYSTEM)
         dbgprintf ("system error: %s\n", strerror (err));

      return 1;
    }

  for (ai = ai0; ai; ai = ai->ai_next)
    {
      dbgprintf ("\tflags %x\n", ai->ai_flags);
      dbgprintf ("\tfamily %x\n", ai->ai_family);
      dbgprintf ("\tsocktype %x\n", ai->ai_socktype);
      dbgprintf ("\tprotocol %x\n", ai->ai_protocol);
      dbgprintf ("\taddrlen %ld: ", (unsigned long) ai->ai_addrlen);
      dbgprintf ("\tFound %s\n",
		 inet_ntop (ai->ai_family,
			    &((struct sockaddr_in *)
			      ai->ai_addr)->sin_addr,
			    buf, sizeof (buf) - 1));
      if (ai->ai_canonname)
	dbgprintf ("\tFound %s...\n", ai->ai_canonname);

      {
	char ipbuf[BUFSIZ];
	char portbuf[BUFSIZ];

	res = getnameinfo (ai->ai_addr, ai->ai_addrlen,
			   ipbuf, sizeof (ipbuf) - 1,
			   portbuf, sizeof (portbuf) - 1,
			   NI_NUMERICHOST|NI_NUMERICSERV);
	dbgprintf ("\t\tgetnameinfo %d: %s\n", res, gai_strerror (res));
	if (res == 0)
	  {
	    dbgprintf ("\t\tip %s\n", ipbuf);
	    dbgprintf ("\t\tport %s\n", portbuf);
	  }
      }

    }

  freeaddrinfo (ai0);

  return 0;
}

#define HOST1 "www.gnu.org"
#define SERV1 "http"
#define HOST2 "www.ibm.com"
#define SERV2 "https"
#define HOST3 "microsoft.com"
#define SERV3 "http"
#define HOST4 "google.org"
#define SERV4 "ldap"

int main (void)
{
  return simple (HOST1, SERV1)
    + simple (HOST2, SERV2)
    + simple (HOST3, SERV3)
    + simple (HOST4, SERV4);
}
$ ./foo
Finding www.gnu.org service http...
res 11: System error returned in errno
system error: Bad address
Finding www.ibm.com service https...
res 11: System error returned in errno
system error: Bad address
Finding microsoft.com service http...
res 11: System error returned in errno
system error: Bad address
Finding google.org service ldap...
res 11: System error returned in errno
system error: Bad address

-- 
Eric Blake




--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]