diff --git a/acinclude.m4 b/acinclude.m4
index 336dfab..daa0c92 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 <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])
diff --git a/ares_process.c b/ares_process.c
index ccd6cb6..8e9a9cd 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 d505e16..f24892f 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
 

