From 3b8caead4388d424884b49c791a2e85d7750623f Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 13 Oct 2008 19:49:44 +0200 Subject: [PATCH] Fix getaddrinfo emulation for systems with struct sockaddr.sa_len. 2008-10-13 Paolo Bonzini 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 | 7 +++++++ lib/getaddrinfo.c | 16 ++++++++++++++++ m4/getaddrinfo.m4 | 5 +++++ 3 files changed, 28 insertions(+) diff --git a/ChangeLog b/ChangeLog index 3aa6dabbcc..f3fa73431b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-10-13 Paolo Bonzini + + 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 * build-aux/pmccabe2html: Add css and css_url parameters. diff --git a/lib/getaddrinfo.c b/lib/getaddrinfo.c index 06501f2380..e4ed8213c0 100644 --- a/lib/getaddrinfo.c +++ b/lib/getaddrinfo.c @@ -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; diff --git a/m4/getaddrinfo.m4 b/m4/getaddrinfo.m4 index 5d36c19505..52135ba947 100644 --- a/m4/getaddrinfo.m4 +++ b/m4/getaddrinfo.m4 @@ -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 ]) + 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 -- 2.30.2