Procházet zdrojové kódy

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

Nick Mathewson před 16 roky
rodič
revize
f948caad7b
3 změnil soubory, kde provedl 34 přidání a 5 odebrání
  1. 2 0
      ChangeLog
  2. 25 0
      configure.in
  3. 7 5
      src/common/compat.h

+ 2 - 0
ChangeLog

@@ -33,6 +33,8 @@ Changes in version 0.2.0.13-alpha - 2007-12-??
     - Reject uploaded descriptors and extrainfo documents if they're
     - Reject uploaded descriptors and extrainfo documents if they're
       huge. Otherwise we'll cache them all over the network and it'll
       huge. Otherwise we'll cache them all over the network and it'll
       clog everything up. Reported by Aljosha Judmayer.
       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:
   o Minor features:
     - On USR1, when dmalloc is in use, log the top 10 memory
     - On USR1, when dmalloc is in use, log the top 10 memory

+ 25 - 0
configure.in

@@ -361,6 +361,31 @@ AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, struct sockaddr_storage, s
 #endif
 #endif
 #endif
 #endif
 ])
 ])
+AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16], , ,
+[#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_NETINET_IN6_H
+#include <netinet/in6.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#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 <winsock.h>
+#else
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#endif
+#endif
+])
 
 
 AC_CHECK_TYPES([rlim_t], , ,
 AC_CHECK_TYPES([rlim_t], , ,
 [#ifdef HAVE_SYS_TYPES_H
 [#ifdef HAVE_SYS_TYPES_H

+ 7 - 5
src/common/compat.h

@@ -302,15 +302,17 @@ struct in6_addr
 typedef uint16_t sa_family_t;
 typedef uint16_t sa_family_t;
 #endif
 #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)
 #define S6_ADDR32(x) ((uint32_t*)(x).s6_addr32)
 #else
 #else
-#define S6_ADDR16(x) ((uint16_t*)((char*)&(x).s6_addr))
 #define S6_ADDR32(x) ((uint32_t*)((char*)&(x).s6_addr))
 #define S6_ADDR32(x) ((uint32_t*)((char*)&(x).s6_addr))
 #endif
 #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. */
 /* XXXX020 detect sockaddr_in6 correctly on ms_windows; this is also a hack. */
 #if !defined(HAVE_STRUCT_SOCKADDR_IN6) && !defined(MS_WINDOWS)
 #if !defined(HAVE_STRUCT_SOCKADDR_IN6) && !defined(MS_WINDOWS)