From 980bcd68f7e49f8c0a9042f64d62e624f8c5f76b Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 2 Jan 2009 21:21:58 +0000 Subject: [PATCH] Work better with platforms that do not have ipv6 structures, or that do not have sin_len fields, etc. svn:r986 --- Makefile.am | 2 +- configure.in | 49 ++++++++++++++++++++++++++++++++++++++------- evdns.c | 7 +------ evutil.c | 5 +++++ ipv6-internal.h | 37 ++++++++++++++++++++++++++++++++++ test/regress_util.c | 5 +++++ 6 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 ipv6-internal.h diff --git a/Makefile.am b/Makefile.am index d04651f2..5d3a1f3c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -86,7 +86,7 @@ CORE_SRC = event.c buffer.c evbuffer-internal.h bufferevent.c \ log.c evutil.c $(SYS_SRC) EXTRA_SRC = event_tagging.c http.c evhttp.h http-internal.h evdns.c \ evdns.h evrpc.c evrpc.h evrpc-internal.h mm-internal.h \ - strlcpy.c strlcpy-internal.h strlcpy-internal.h + strlcpy.c strlcpy-internal.h strlcpy-internal.h ipv6-internal.h libevent_la_SOURCES = $(CORE_SRC) $(EXTRA_SRC) libevent_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS) diff --git a/configure.in b/configure.in index 3d69625e..3ebe498f 100644 --- a/configure.in +++ b/configure.in @@ -53,7 +53,7 @@ AM_CONDITIONAL(ZLIB_REGRESS, [test "$have_zlib" != "no"]) dnl Checks for header files. AC_HEADER_STDC -AC_CHECK_HEADERS(fcntl.h stdarg.h inttypes.h stdint.h stddef.h poll.h signal.h unistd.h sys/epoll.h sys/time.h sys/queue.h sys/event.h sys/param.h sys/ioctl.h sys/select.h sys/devpoll.h port.h netinet/in6.h sys/socket.h sys/uio.h arpa/inet.h) +AC_CHECK_HEADERS(fcntl.h stdarg.h inttypes.h stdint.h stddef.h poll.h signal.h unistd.h sys/epoll.h sys/time.h sys/queue.h sys/event.h sys/param.h sys/ioctl.h sys/select.h sys/devpoll.h port.h netinet/in.h netinet/in6.h sys/socket.h sys/uio.h arpa/inet.h) if test "x$ac_cv_header_sys_queue_h" = "xyes"; then AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h) AC_EGREP_CPP(yes, @@ -326,17 +326,52 @@ AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(short) -AC_CHECK_TYPES([struct in6_addr], , , -[#ifdef WIN32 -#include -#else -#include +AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , , +[#include +#ifdef HAVE_NETINET_IN_H #include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H #include #endif +#ifdef WIN32 +#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_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , , +[#include +#ifdef HAVE_NETINET_IN_H +#include +#endif #ifdef HAVE_NETINET_IN6_H #include -#endif]) +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef WIN32 +#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_MSG_CHECKING([for socklen_t]) AC_TRY_COMPILE([ diff --git a/evdns.c b/evdns.c index 388eef7a..391c32d1 100644 --- a/evdns.c +++ b/evdns.c @@ -104,6 +104,7 @@ #include "log.h" #include "mm-internal.h" #include "strlcpy-internal.h" +#include "ipv6-internal.h" #ifdef WIN32 #include #include @@ -187,12 +188,6 @@ struct evdns_request { struct evdns_base *base; }; -#ifndef HAVE_STRUCT_IN6_ADDR -struct in6_addr { - u8 s6_addr[16]; -}; -#endif - struct reply { unsigned int type; unsigned int have_answer; diff --git a/evutil.c b/evutil.c index 55321923..2a6f7cbb 100644 --- a/evutil.c +++ b/evutil.c @@ -68,6 +68,7 @@ #include "log.h" #include "strlcpy-internal.h" +#include "ipv6-internal.h" int evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2]) @@ -634,7 +635,9 @@ evutil_parse_sockaddr_port(const char *ip_as_string, struct sockaddr *out, int o if (is_ipv6) { struct sockaddr_in6 sin6; memset(&sin6, 0, sizeof(sin6)); +#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN sin6.sin6_len = sizeof(sin6); +#endif sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(port); if (1 != evutil_inet_pton(AF_INET6, addr_part, &sin6.sin6_addr)) @@ -647,7 +650,9 @@ evutil_parse_sockaddr_port(const char *ip_as_string, struct sockaddr *out, int o } else { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN sin.sin_len = sizeof(sin); +#endif sin.sin_family = AF_INET; sin.sin_port = htons(port); if (1 != evutil_inet_pton(AF_INET, addr_part, &sin.sin_addr)) diff --git a/ipv6-internal.h b/ipv6-internal.h new file mode 100644 index 00000000..0cb40e00 --- /dev/null +++ b/ipv6-internal.h @@ -0,0 +1,37 @@ +/* Internal use only: Fake IPv6 structures and values on platforms that + * do not have them */ + +#ifndef _EVENT_IPV6_INTERNAL_H +#define _EVENT_IPV6_INTERNAL_H + +#include +#include "event-config.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _EVENT_HAVE_STRUCT_IN6_ADDR +struct in6_addr { + ev_uint8_t s6_addr[16]; +}; +#endif + +#ifndef _EVENT_HAVE_SA_FAMILY_T +typedef int sa_family_t +#endif + +#ifndef _EVENT_HAVE_STRUCT_SOCKADDR_IN6 +struct sockaddr_in6 { + sa_family_t sin6_family; + ev_uint16_t sin6_port; + struct in6_addr sin6_addr; +}; +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/test/regress_util.c b/test/regress_util.c index 990685b0..a1373170 100644 --- a/test/regress_util.c +++ b/test/regress_util.c @@ -47,6 +47,7 @@ #include #include "event2/util.h" +#include "../ipv6-internal.h" void util_suite(void); @@ -259,7 +260,9 @@ regress_sockaddr_port_parse(void) if (ent->sa_family == AF_INET) { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN sin.sin_len = sizeof(sin); +#endif sin.sin_family = AF_INET; sin.sin_port = htons(ent->port); r = evutil_inet_pton(AF_INET, ent->addr, &sin.sin_addr); @@ -273,7 +276,9 @@ regress_sockaddr_port_parse(void) } else { struct sockaddr_in6 sin6; memset(&sin6, 0, sizeof(sin6)); +#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN sin6.sin6_len = sizeof(sin6); +#endif sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(ent->port); r = evutil_inet_pton(AF_INET6, ent->addr, &sin6.sin6_addr); -- 2.40.0