From 9912637d32c9987719a1ea12db591aee2941891c Mon Sep 17 00:00:00 2001 From: Ben Greear Date: Wed, 4 Aug 2010 07:42:01 -0700 Subject: [PATCH] sock-addr-storage: Detect and deal with lack of .ss_family member. AIX, at least, does not have sockaddr_storage.ss_family member. Detect this in the configure logic and use proper #ifdefs in the ares_process logic. Signed-off-by: Ben Greear Tested-by: Tor Arntsen --- acinclude.m4 | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ ares_process.c | 8 +++---- configure.ac | 1 + 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 336dfabb..daa0c925 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -669,6 +669,45 @@ AC_DEFUN([TYPE_SOCKADDR_STORAGE], ]) ]) +dnl TYPE_SOCKADDR_STORAGE_SSFAM +dnl ------------------------------------------------- +dnl Check for struct sockaddr_storage.ss_family +dnl Seems some AIX systems don't have this. + +AC_DEFUN([TYPE_SOCKADDR_STORAGE_SSFAM], +[ + CARES_CHECK_STRUCT_MEMBER( + [ +#undef inline +#ifdef HAVE_WINDOWS_H +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#ifdef HAVE_WINSOCK2_H +#include +#endif +#else +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#endif +], + [sockaddr_storage], [ss_family], + AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM, 1, + [if struct sockaddr_storage.ss_family is defined]), , + ) +]) + dnl CURL_CHECK_NI_WITHSCOPEID dnl ------------------------------------------------- @@ -1897,6 +1936,26 @@ AC_DEFUN([CARES_CHECK_STRUCT], [ fi ]) +dnl This macro determines if the specified struct member exists in the specified file +dnl Syntax: +dnl CARES_CHECK_STRUCT_MEMBER(headers, struct name, member, if found, [if not found]) + +AC_DEFUN([CARES_CHECK_STRUCT_MEMBER], [ + AC_MSG_CHECKING([for struct $2.$3]) + AC_TRY_COMPILE([$1], + [ + struct $2 struct_instance; + void* foo = &(struct_instance.$3); + ], ac_struct_member="yes", ac_found="no") + if test "$ac_struct_member" = "yes" ; then + AC_MSG_RESULT(yes) + $4 + else + AC_MSG_RESULT(no) + $5 + fi +]) + dnl This macro determines if the specified constant exists in the specified file dnl Syntax: dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) diff --git a/ares_process.c b/ares_process.c index ccd6cb6a..8e9a9cdb 100644 --- a/ares_process.c +++ b/ares_process.c @@ -434,7 +434,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, unsigned char buf[PACKETSZ + 1]; #ifdef HAVE_RECVFROM ares_socklen_t fromlen; -#ifdef HAVE_STRUCT_SOCKADDR_STORAGE +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM struct sockaddr_storage from; #else union { @@ -488,7 +488,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, else if (count <= 0) handle_error(channel, i, now); #ifdef HAVE_RECVFROM -#ifdef HAVE_STRUCT_SOCKADDR_STORAGE +#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM /* This family hack works around compiler warnings about * aliases. */ @@ -1186,7 +1186,7 @@ static int same_address(struct sockaddr *sa, struct ares_addr *aa) void *addr1; void *addr2; -#ifndef HAVE_STRUCT_SOCKADDR_STORAGE +#ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM if (sa->sa_family == aa->family) { #endif @@ -1207,7 +1207,7 @@ static int same_address(struct sockaddr *sa, struct ares_addr *aa) default: break; } -#ifndef HAVE_STRUCT_SOCKADDR_STORAGE +#ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM } #endif return 0; /* different */ diff --git a/configure.ac b/configure.ac index d505e161..f24892f8 100644 --- a/configure.ac +++ b/configure.ac @@ -506,6 +506,7 @@ CARES_CONFIGURE_ARES_SOCKLEN_T TYPE_IN_ADDR_T TYPE_SOCKADDR_STORAGE +TYPE_SOCKADDR_STORAGE_SSFAM TYPE_SIG_ATOMIC_T