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 <greearb@candelatech.com>
Tested-by: Tor Arntsen <tor@spacetec.no>
pull/1/head
Ben Greear 15 years ago
parent a00e234001
commit 9912637d32
  1. 59
      acinclude.m4
  2. 8
      ares_process.c
  3. 1
      configure.ac

@ -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 CURL_CHECK_NI_WITHSCOPEID
dnl ------------------------------------------------- dnl -------------------------------------------------
@ -1897,6 +1936,26 @@ AC_DEFUN([CARES_CHECK_STRUCT], [
fi 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 This macro determines if the specified constant exists in the specified file
dnl Syntax: dnl Syntax:
dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])

@ -434,7 +434,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
unsigned char buf[PACKETSZ + 1]; unsigned char buf[PACKETSZ + 1];
#ifdef HAVE_RECVFROM #ifdef HAVE_RECVFROM
ares_socklen_t fromlen; ares_socklen_t fromlen;
#ifdef HAVE_STRUCT_SOCKADDR_STORAGE #ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
struct sockaddr_storage from; struct sockaddr_storage from;
#else #else
union { union {
@ -488,7 +488,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
else if (count <= 0) else if (count <= 0)
handle_error(channel, i, now); handle_error(channel, i, now);
#ifdef HAVE_RECVFROM #ifdef HAVE_RECVFROM
#ifdef HAVE_STRUCT_SOCKADDR_STORAGE #ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
/* This family hack works around compiler warnings about /* This family hack works around compiler warnings about
* aliases. * aliases.
*/ */
@ -1186,7 +1186,7 @@ static int same_address(struct sockaddr *sa, struct ares_addr *aa)
void *addr1; void *addr1;
void *addr2; void *addr2;
#ifndef HAVE_STRUCT_SOCKADDR_STORAGE #ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
if (sa->sa_family == aa->family) if (sa->sa_family == aa->family)
{ {
#endif #endif
@ -1207,7 +1207,7 @@ static int same_address(struct sockaddr *sa, struct ares_addr *aa)
default: default:
break; break;
} }
#ifndef HAVE_STRUCT_SOCKADDR_STORAGE #ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
} }
#endif #endif
return 0; /* different */ return 0; /* different */

@ -506,6 +506,7 @@ CARES_CONFIGURE_ARES_SOCKLEN_T
TYPE_IN_ADDR_T TYPE_IN_ADDR_T
TYPE_SOCKADDR_STORAGE TYPE_SOCKADDR_STORAGE
TYPE_SOCKADDR_STORAGE_SSFAM
TYPE_SIG_ATOMIC_T TYPE_SIG_ATOMIC_T

Loading…
Cancel
Save