]> granicus.if.org Git - libevent/commitdiff
Build correctly on platforms without sockaddr_storage
authorNick Mathewson <nickm@torproject.org>
Mon, 24 Jan 2011 23:29:20 +0000 (18:29 -0500)
committerNick Mathewson <nickm@torproject.org>
Mon, 24 Jan 2011 23:29:44 +0000 (18:29 -0500)
configure.in
util-internal.h

index 0b5cabc2bd0bc42ba1d93f609c125a78acbea5ec..b14a420ca54604bd972810a5f1b9bc7fe8fefb99 100644 (file)
@@ -443,7 +443,7 @@ AC_CHECK_SIZEOF(short)
 AC_CHECK_SIZEOF(size_t)
 AC_CHECK_SIZEOF(void *)
 
-AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t, struct addrinfo], , ,
+AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t, struct addrinfo, struct sockaddr_storage], , ,
 [#define _GNU_SOURCE
 #include <sys/types.h>
 #ifdef HAVE_NETINET_IN_H
index 5c153d30e2800d8e0a3da43fd83dd6f6957e2cb4..4d8551d5ed4739d68eddba540e3fac382e28d1f7 100644 (file)
@@ -205,6 +205,23 @@ long _evutil_weakrand(void);
 #define EVUTIL_FAILURE_CHECK(cond) EVUTIL_UNLIKELY(cond)
 #endif
 
+#ifndef _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE
+/* Replacement for sockaddr storage that we can use internally on platforms
+ * that lack it.  It is not space-efficient, but neither is sockaddr_storage.
+ */
+struct sockaddr_storage {
+       union {
+               struct sockaddr ss_sa;
+               struct sockaddr_in ss_sin;
+#ifdef _EVENT_HAVE_STRUCT_SOCKADDR_IN6
+               struct sockaddr_in6 ss_sin6;
+#endif
+               char ss_padding[128];
+       } ss_union;
+};
+#define ss_family ss_union.ss_sa.sa_family
+#endif
+
 /* Internal addrinfo error code.  This one is returned from only from
  * evutil_getaddrinfo_common, when we are sure that we'll have to hit a DNS
  * server. */