This is the mail archive of the
cygwin
mailing list for the Cygwin project.
[1.7] getaddrinfo failure
- From: Eric Blake <ebb9 at byu dot net>
- To: cygwin at cygwin dot com
- Date: Fri, 27 Mar 2009 14:32:58 +0000 (UTC)
- Subject: [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/