From f948caad7b5bd4760fe986392e0a500721729a2c Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 5 Dec 2007 16:30:52 +0000 Subject: r15161@tombo: nickm | 2007-12-05 11:30:37 -0500 Fix bug reported by Steve Murphy on or-talk: detect the s6_addr32 and s6_addr16 fields via autoconf. svn:r12679 --- ChangeLog | 2 ++ configure.in | 25 +++++++++++++++++++++++++ src/common/compat.h | 12 +++++++----- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index b088f84416..878f57f7a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -33,6 +33,8 @@ Changes in version 0.2.0.13-alpha - 2007-12-?? - Reject uploaded descriptors and extrainfo documents if they're huge. Otherwise we'll cache them all over the network and it'll clog everything up. Reported by Aljosha Judmayer. + - Check for presence of s6_addr16 and s6_addr32 fields in in6_addr + via autoconf. Should fix compile on solaris. o Minor features: - On USR1, when dmalloc is in use, log the top 10 memory diff --git a/configure.in b/configure.in index 88bac18926..0dd2a2dffc 100644 --- a/configure.in +++ b/configure.in @@ -361,6 +361,31 @@ AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, struct sockaddr_storage, s #endif #endif ]) +AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16], , , +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef MS_WINDOWS +#define WIN32_WINNT 0x400 +#define _WIN32_WINNT 0x400 +#define WIN32_LEAN_AND_MEAN +#if defined(_MSC_VER) && (_MSC_VER < 1300) +#include +#else +#include +#include +#endif +#endif +]) AC_CHECK_TYPES([rlim_t], , , [#ifdef HAVE_SYS_TYPES_H diff --git a/src/common/compat.h b/src/common/compat.h index af8b6ae143..e775884430 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -302,15 +302,17 @@ struct in6_addr typedef uint16_t sa_family_t; #endif -#ifndef _MSC_VER -/* Apparently, MSVC doesn't define s6_addr16 or s6_addr32. How dumb. */ -/* XXXX020 detect with autoconf. */ -#define S6_ADDR16(x) ((uint16_t*)(x).s6_addr16) +/* Apparently, MS and Solaris don't define s6_addr16 or s6_addr32. */ +#ifdef HAVE_STRUCT_IN6_ADDR_S6_ADDR32 #define S6_ADDR32(x) ((uint32_t*)(x).s6_addr32) #else -#define S6_ADDR16(x) ((uint16_t*)((char*)&(x).s6_addr)) #define S6_ADDR32(x) ((uint32_t*)((char*)&(x).s6_addr)) #endif +#ifdef HAVE_STRUCT_IN6_ADDR_S6_ADDR16 +#define S6_ADDR16(x) ((uint16_t*)(x).s6_addr16) +#else +#define S6_ADDR16(x) ((uint16_t*)((char*)&(x).s6_addr)) +#endif /* XXXX020 detect sockaddr_in6 correctly on ms_windows; this is also a hack. */ #if !defined(HAVE_STRUCT_SOCKADDR_IN6) && !defined(MS_WINDOWS) -- cgit v1.2.3-54-g00ecf