changeset 30329:750269aeddd5

Fix getaddrinfo emulation for systems with struct sockaddr.sa_len. 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.
author Paolo Bonzini <bonzini@gnu.org>
date Mon, 13 Oct 2008 19:49:44 +0200
parents 83e76e6ccfb8
children cab3c543fee3
files ChangeLog lib/getaddrinfo.c m4/getaddrinfo.m4
diffstat 3 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Oct 13 12:20:30 2008 +0200
+++ b/ChangeLog	Mon Oct 13 19:49:44 2008 +0200
@@ -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.
--- a/lib/getaddrinfo.c	Mon Oct 13 12:20:30 2008 +0200
+++ b/lib/getaddrinfo.c	Mon Oct 13 19:49:44 2008 +0200
@@ -301,6 +301,22 @@
   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;
--- a/m4/getaddrinfo.m4	Mon Oct 13 12:20:30 2008 +0200
+++ b/m4/getaddrinfo.m4	Mon Oct 13 19:49:44 2008 +0200
@@ -99,6 +99,11 @@
   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