sock-addr-storage: Detect and deal with lack of .ss_family member.
authorBen Greear <greearb@candelatech.com>
Wed, 4 Aug 2010 14:42:01 +0000 (07:42 -0700)
committerBen Greear <greearb@candelatech.com>
Wed, 4 Aug 2010 14:42:01 +0000 (07:42 -0700)
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 <greearb@candelatech.com>
Tested-by: Tor Arntsen <tor@spacetec.no>
acinclude.m4
ares_process.c
configure.ac

index 336dfab..daa0c92 100644 (file)
@@ -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 <windows.h>
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#else
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#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])
index ccd6cb6..8e9a9cd 100644 (file)
@@ -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 */
index d505e16..f24892f 100644 (file)
@@ -506,6 +506,7 @@ CARES_CONFIGURE_ARES_SOCKLEN_T
 TYPE_IN_ADDR_T
 
 TYPE_SOCKADDR_STORAGE
+TYPE_SOCKADDR_STORAGE_SSFAM
 
 TYPE_SIG_ATOMIC_T