])
])
-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 -------------------------------------------------
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])
unsigned char buf[PACKETSZ + 1];
#ifdef HAVE_RECVFROM
ares_socklen_t fromlen;
-#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
- struct sockaddr_storage from;
-#else
union {
struct sockaddr_in sa4;
struct sockaddr_in6 sa6;
} from;
#endif
-#endif
if(!read_fds && (read_fd == ARES_SOCKET_BAD))
/* no possible action */
* packets as we can. */
do {
#ifdef HAVE_RECVFROM
- fromlen = sizeof(from); /* doesn't matter if it's larger than needed */
+ if (server->addr.family == AF_INET)
+ fromlen = sizeof(from.sa4);
+ else
+ fromlen = sizeof(from.sa6);
count = (ssize_t)recvfrom(server->udp_socket, (void *)buf, sizeof(buf),
0, (struct sockaddr *)&from, &fromlen);
#else
else if (count <= 0)
handle_error(channel, i, now);
#ifdef HAVE_RECVFROM
-#ifdef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
- /* This family hack works around compiler warnings about
- * aliases.
- */
- else if (!((from.ss_family == server->addr.family) &&
- same_address((struct sockaddr *)&from, &server->addr)))
-#else
else if (!same_address((struct sockaddr *)&from, &server->addr))
-#endif
/* The address the response comes from does not match
* the address we sent the request to. Someone may be
* attempting to perform a cache poisoning attack. */
void *addr1;
void *addr2;
-#ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
if (sa->sa_family == aa->family)
{
-#endif
switch (aa->family)
{
case AF_INET:
default:
break;
}
-#ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SSFAM
}
-#endif
return 0; /* different */
}