Fix getaddrinfo emulation for systems with struct sockaddr.sa_len.
authorPaolo Bonzini <bonzini@gnu.org>
Mon, 13 Oct 2008 17:49:44 +0000 (19:49 +0200)
committerPaolo Bonzini <bonzini@gnu.org>
Mon, 13 Oct 2008 17:51:13 +0000 (19:51 +0200)
2008-10-13  Paolo Bonzini  <bonzini@gnu.org>

fix getaddrinfo emulation for systems with struct sockaddr.sa_len
* m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Detect
struct sockaddr.sa_len.
* lib/getaddrinfo.c (getaddrinfo): Set it if appropriate.

ChangeLog
lib/getaddrinfo.c
m4/getaddrinfo.m4

index 3aa6dab..f3fa734 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-10-13  Paolo Bonzini  <bonzini@gnu.org>
+
+       fix getaddrinfo emulation for systems with struct sockaddr.sa_len
+       * m4/getaddrinfo.m4 (gl_PREREQ_GETADDRINFO): Detect
+       struct sockaddr.sa_len.
+       * lib/getaddrinfo.c (getaddrinfo): Set it if appropriate.
+
 2008-10-13  Simon Josefsson  <simon@josefsson.org>
 
        * build-aux/pmccabe2html: Add css and css_url parameters.
index 06501f2..e4ed821 100644 (file)
@@ -301,6 +301,22 @@ getaddrinfo (const char *restrict nodename,
   tmp->ai_addr->sa_family = he->h_addrtype;
   tmp->ai_family = he->h_addrtype;
 
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+  switch (he->h_addrtype)
+    {
+#if HAVE_IPV4
+    case AF_INET:
+      tmp->ai_addr->sa_len = sizeof (struct sockaddr_in);
+      break;
+#endif
+#if HAVE_IPV6
+    case AF_INET6:
+      tmp->ai_addr->sa_len = sizeof (struct sockaddr_in6);
+      break;
+#endif
+    }
+#endif
+
   /* FIXME: If more than one address, create linked list of addrinfo's. */
 
   *res = tmp;
index 5d36c19..52135ba 100644 (file)
@@ -99,6 +99,11 @@ AC_DEFUN([gl_PREREQ_GETADDRINFO], [
   AC_REQUIRE([gl_HEADER_SYS_SOCKET])
   AC_REQUIRE([AC_C_INLINE])
   AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  dnl Including sys/socket.h is wrong for Windows, but Windows does not
+  dnl have sa_len so the result is correct anyway.
+  AC_CHECK_MEMBERS([struct sockaddr.sa_len], , , [#include <sys/socket.h>])
+
   AC_CHECK_HEADERS_ONCE(netinet/in.h netdb.h)
   AC_CHECK_DECLS([getaddrinfo, freeaddrinfo, gai_strerror, getnameinfo],,,[
   /* sys/types.h is not needed according to POSIX, but the