Revert "Revert "Upgrade to 2.1.8-stable (2017-01-22)." and "Probably Mac build fix?""

This reverts commit 83a0c9c65a60a92d3ea5542596b3ba56db492c37.

Bug: 64543673
Test: make checkbuild
Test: Manual tombstoned test
Change-Id: I84bb128d1dec433195f2cbdbf70236ba17fa9955
diff --git a/include/event2/util.h b/include/event2/util.h
index dde9113..dd4bbb6 100644
--- a/include/event2/util.h
+++ b/include/event2/util.h
@@ -23,8 +23,8 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#ifndef _EVENT2_UTIL_H_
-#define _EVENT2_UTIL_H_
+#ifndef EVENT2_UTIL_H_INCLUDED_
+#define EVENT2_UTIL_H_INCLUDED_
 
 /** @file event2/util.h
 
@@ -32,46 +32,56 @@
   related socket manipulations.
 
  */
+#include <event2/visibility.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <event2/event-config.h>
-#ifdef _EVENT_HAVE_SYS_TIME_H
+#ifdef EVENT__HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
-#ifdef _EVENT_HAVE_STDINT_H
+#ifdef EVENT__HAVE_STDINT_H
 #include <stdint.h>
-#elif defined(_EVENT_HAVE_INTTYPES_H)
+#elif defined(EVENT__HAVE_INTTYPES_H)
 #include <inttypes.h>
 #endif
-#ifdef _EVENT_HAVE_SYS_TYPES_H
+#ifdef EVENT__HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
-#ifdef _EVENT_HAVE_STDDEF_H
+#ifdef EVENT__HAVE_STDDEF_H
 #include <stddef.h>
 #endif
 #ifdef _MSC_VER
 #include <BaseTsd.h>
 #endif
 #include <stdarg.h>
-#ifdef _EVENT_HAVE_NETDB_H
+#ifdef EVENT__HAVE_NETDB_H
 #if !defined(_GNU_SOURCE)
 #define _GNU_SOURCE
 #endif
 #include <netdb.h>
 #endif
 
-#ifdef WIN32
+#ifdef _WIN32
 #include <winsock2.h>
+#ifdef EVENT__HAVE_GETADDRINFO
+/* for EAI_* definitions. */
+#include <ws2tcpip.h>
+#endif
 #else
+#ifdef EVENT__HAVE_ERRNO_H
+#include <errno.h>
+#endif
 #include <sys/socket.h>
 #endif
 
+#include <time.h>
+
 /* Some openbsd autoconf versions get the name of this macro wrong. */
-#if defined(_EVENT_SIZEOF_VOID__) && !defined(_EVENT_SIZEOF_VOID_P)
-#define _EVENT_SIZEOF_VOID_P _EVENT_SIZEOF_VOID__
+#if defined(EVENT__SIZEOF_VOID__) && !defined(EVENT__SIZEOF_VOID_P)
+#define EVENT__SIZEOF_VOID_P EVENT__SIZEOF_VOID__
 #endif
 
 /**
@@ -103,67 +113,67 @@
  *
  * @{
  */
-#ifdef _EVENT_HAVE_UINT64_T
+#ifdef EVENT__HAVE_UINT64_T
 #define ev_uint64_t uint64_t
 #define ev_int64_t int64_t
-#elif defined(WIN32)
+#elif defined(_WIN32)
 #define ev_uint64_t unsigned __int64
 #define ev_int64_t signed __int64
-#elif _EVENT_SIZEOF_LONG_LONG == 8
+#elif EVENT__SIZEOF_LONG_LONG == 8
 #define ev_uint64_t unsigned long long
 #define ev_int64_t long long
-#elif _EVENT_SIZEOF_LONG == 8
+#elif EVENT__SIZEOF_LONG == 8
 #define ev_uint64_t unsigned long
 #define ev_int64_t long
-#elif defined(_EVENT_IN_DOXYGEN)
+#elif defined(EVENT_IN_DOXYGEN_)
 #define ev_uint64_t ...
 #define ev_int64_t ...
 #else
 #error "No way to define ev_uint64_t"
 #endif
 
-#ifdef _EVENT_HAVE_UINT32_T
+#ifdef EVENT__HAVE_UINT32_T
 #define ev_uint32_t uint32_t
 #define ev_int32_t int32_t
-#elif defined(WIN32)
+#elif defined(_WIN32)
 #define ev_uint32_t unsigned int
 #define ev_int32_t signed int
-#elif _EVENT_SIZEOF_LONG == 4
+#elif EVENT__SIZEOF_LONG == 4
 #define ev_uint32_t unsigned long
 #define ev_int32_t signed long
-#elif _EVENT_SIZEOF_INT == 4
+#elif EVENT__SIZEOF_INT == 4
 #define ev_uint32_t unsigned int
 #define ev_int32_t signed int
-#elif defined(_EVENT_IN_DOXYGEN)
+#elif defined(EVENT_IN_DOXYGEN_)
 #define ev_uint32_t ...
 #define ev_int32_t ...
 #else
 #error "No way to define ev_uint32_t"
 #endif
 
-#ifdef _EVENT_HAVE_UINT16_T
+#ifdef EVENT__HAVE_UINT16_T
 #define ev_uint16_t uint16_t
 #define ev_int16_t  int16_t
-#elif defined(WIN32)
+#elif defined(_WIN32)
 #define ev_uint16_t unsigned short
 #define ev_int16_t  signed short
-#elif _EVENT_SIZEOF_INT == 2
+#elif EVENT__SIZEOF_INT == 2
 #define ev_uint16_t unsigned int
 #define ev_int16_t  signed int
-#elif _EVENT_SIZEOF_SHORT == 2
+#elif EVENT__SIZEOF_SHORT == 2
 #define ev_uint16_t unsigned short
 #define ev_int16_t  signed short
-#elif defined(_EVENT_IN_DOXYGEN)
+#elif defined(EVENT_IN_DOXYGEN_)
 #define ev_uint16_t ...
 #define ev_int16_t ...
 #else
 #error "No way to define ev_uint16_t"
 #endif
 
-#ifdef _EVENT_HAVE_UINT8_T
+#ifdef EVENT__HAVE_UINT8_T
 #define ev_uint8_t uint8_t
 #define ev_int8_t int8_t
-#elif defined(_EVENT_IN_DOXYGEN)
+#elif defined(EVENT_IN_DOXYGEN_)
 #define ev_uint8_t ...
 #define ev_int8_t ...
 #else
@@ -171,30 +181,43 @@
 #define ev_int8_t signed char
 #endif
 
-#ifdef _EVENT_HAVE_UINTPTR_T
+#ifdef EVENT__HAVE_UINTPTR_T
 #define ev_uintptr_t uintptr_t
 #define ev_intptr_t intptr_t
-#elif _EVENT_SIZEOF_VOID_P <= 4
+#elif EVENT__SIZEOF_VOID_P <= 4
 #define ev_uintptr_t ev_uint32_t
 #define ev_intptr_t ev_int32_t
-#elif _EVENT_SIZEOF_VOID_P <= 8
+#elif EVENT__SIZEOF_VOID_P <= 8
 #define ev_uintptr_t ev_uint64_t
 #define ev_intptr_t ev_int64_t
-#elif defined(_EVENT_IN_DOXYGEN)
+#elif defined(EVENT_IN_DOXYGEN_)
 #define ev_uintptr_t ...
 #define ev_intptr_t ...
 #else
 #error "No way to define ev_uintptr_t"
 #endif
 
-#ifdef _EVENT_ssize_t
-#define ev_ssize_t _EVENT_ssize_t
+#ifdef EVENT__ssize_t
+#define ev_ssize_t EVENT__ssize_t
 #else
 #define ev_ssize_t ssize_t
 #endif
 
-#ifdef WIN32
+/* Note that we define ev_off_t based on the compile-time size of off_t that
+ * we used to build Libevent, and not based on the current size of off_t.
+ * (For example, we don't define ev_off_t to off_t.).  We do this because
+ * some systems let you build your software with different off_t sizes
+ * at runtime, and so putting in any dependency on off_t would risk API
+ * mismatch.
+ */
+#ifdef _WIN32
 #define ev_off_t ev_int64_t
+#elif EVENT__SIZEOF_OFF_T == 8
+#define ev_off_t ev_int64_t
+#elif EVENT__SIZEOF_OFF_T == 4
+#define ev_off_t ev_int32_t
+#elif defined(EVENT_IN_DOXYGEN_)
+#define ev_off_t ...
 #else
 #define ev_off_t off_t
 #endif
@@ -215,6 +238,7 @@
 
    @{
 */
+#ifndef EVENT__HAVE_STDINT_H
 #define EV_UINT64_MAX ((((ev_uint64_t)0xffffffffUL) << 32) | 0xffffffffUL)
 #define EV_INT64_MAX  ((((ev_int64_t) 0x7fffffffL) << 32) | 0xffffffffL)
 #define EV_INT64_MIN  ((-EV_INT64_MAX) - 1)
@@ -227,20 +251,34 @@
 #define EV_UINT8_MAX  255
 #define EV_INT8_MAX   127
 #define EV_INT8_MIN   ((-EV_INT8_MAX) - 1)
+#else
+#define EV_UINT64_MAX UINT64_MAX
+#define EV_INT64_MAX  INT64_MAX
+#define EV_INT64_MIN  INT64_MIN
+#define EV_UINT32_MAX UINT32_MAX
+#define EV_INT32_MAX  INT32_MAX
+#define EV_INT32_MIN  INT32_MIN
+#define EV_UINT16_MAX UINT16_MAX
+#define EV_INT16_MAX  INT16_MAX
+#define EV_UINT8_MAX  UINT8_MAX
+#define EV_INT8_MAX   INT8_MAX
+#define EV_INT8_MIN   INT8_MIN
 /** @} */
+#endif
+
 
 /**
    @name Limits for SIZE_T and SSIZE_T
 
    @{
 */
-#if _EVENT_SIZEOF_SIZE_T == 8
+#if EVENT__SIZEOF_SIZE_T == 8
 #define EV_SIZE_MAX EV_UINT64_MAX
 #define EV_SSIZE_MAX EV_INT64_MAX
-#elif _EVENT_SIZEOF_SIZE_T == 4
+#elif EVENT__SIZEOF_SIZE_T == 4
 #define EV_SIZE_MAX EV_UINT32_MAX
 #define EV_SSIZE_MAX EV_INT32_MAX
-#elif defined(_EVENT_IN_DOXYGEN)
+#elif defined(EVENT_IN_DOXYGEN_)
 #define EV_SIZE_MAX ...
 #define EV_SSIZE_MAX ...
 #else
@@ -250,16 +288,16 @@
 #define EV_SSIZE_MIN ((-EV_SSIZE_MAX) - 1)
 /**@}*/
 
-#ifdef WIN32
+#ifdef _WIN32
 #define ev_socklen_t int
-#elif defined(_EVENT_socklen_t)
-#define ev_socklen_t _EVENT_socklen_t
+#elif defined(EVENT__socklen_t)
+#define ev_socklen_t EVENT__socklen_t
 #else
 #define ev_socklen_t socklen_t
 #endif
 
-#ifdef _EVENT_HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
-#if !defined(_EVENT_HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY) \
+#ifdef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
+#if !defined(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY) \
  && !defined(ss_family)
 #define ss_family __ss_family
 #endif
@@ -268,12 +306,77 @@
 /**
  * A type wide enough to hold the output of "socket()" or "accept()".  On
  * Windows, this is an intptr_t; elsewhere, it is an int. */
-#ifdef WIN32
+#ifdef _WIN32
 #define evutil_socket_t intptr_t
 #else
 #define evutil_socket_t int
 #endif
 
+/**
+ * Structure to hold information about a monotonic timer
+ *
+ * Use this with evutil_configure_monotonic_time() and
+ * evutil_gettime_monotonic().
+ *
+ * This is an opaque structure; you can allocate one using
+ * evutil_monotonic_timer_new().
+ *
+ * @see evutil_monotonic_timer_new(), evutil_monotonic_timer_free(),
+ * evutil_configure_monotonic_time(), evutil_gettime_monotonic()
+ */
+struct evutil_monotonic_timer
+#ifdef EVENT_IN_DOXYGEN_
+{/*Empty body so that doxygen will generate documentation here.*/}
+#endif
+;
+
+#define EV_MONOT_PRECISE  1
+#define EV_MONOT_FALLBACK 2
+
+/** Format a date string using RFC 1123 format (used in HTTP).
+ * If `tm` is NULL, current system's time will be used.
+ * The number of characters written will be returned.
+ * One should check if the return value is smaller than `datelen` to check if
+ * the result is truncated or not.
+ */
+EVENT2_EXPORT_SYMBOL int
+evutil_date_rfc1123(char *date, const size_t datelen, const struct tm *tm);
+
+/** Allocate a new struct evutil_monotonic_timer for use with the
+ * evutil_configure_monotonic_time() and evutil_gettime_monotonic()
+ * functions.  You must configure the timer with
+ * evutil_configure_monotonic_time() before using it.
+ */
+EVENT2_EXPORT_SYMBOL
+struct evutil_monotonic_timer * evutil_monotonic_timer_new(void);
+
+/** Free a struct evutil_monotonic_timer that was allocated using
+ * evutil_monotonic_timer_new().
+ */
+EVENT2_EXPORT_SYMBOL
+void evutil_monotonic_timer_free(struct evutil_monotonic_timer *timer);
+
+/** Set up a struct evutil_monotonic_timer; flags can include
+ * EV_MONOT_PRECISE and EV_MONOT_FALLBACK.
+ */
+EVENT2_EXPORT_SYMBOL
+int evutil_configure_monotonic_time(struct evutil_monotonic_timer *timer,
+                                    int flags);
+
+/** Query the current monotonic time from a struct evutil_monotonic_timer
+ * previously configured with evutil_configure_monotonic_time().  Monotonic
+ * time is guaranteed never to run in reverse, but is not necessarily epoch-
+ * based, or relative to any other definite point.  Use it to make reliable
+ * measurements of elapsed time between events even when the system time
+ * may be changed.
+ *
+ * It is not safe to use this funtion on the same timer from multiple
+ * threads.
+ */
+EVENT2_EXPORT_SYMBOL
+int evutil_gettime_monotonic(struct evutil_monotonic_timer *timer,
+                             struct timeval *tp);
+
 /** Create two new sockets that are connected to each other.
 
     On Unix, this simply calls socketpair().  On Windows, it uses the
@@ -285,12 +388,14 @@
 
     Parameters and return values are as for socketpair()
 */
+EVENT2_EXPORT_SYMBOL
 int evutil_socketpair(int d, int type, int protocol, evutil_socket_t sv[2]);
 /** Do platform-specific operations as needed to make a socket nonblocking.
 
     @param sock The socket to make nonblocking
     @return 0 on success, -1 on failure
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_make_socket_nonblocking(evutil_socket_t sock);
 
 /** Do platform-specific operations to make a listener socket reusable.
@@ -304,14 +409,29 @@
     @param sock The socket to make reusable
     @return 0 on success, -1 on failure
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_make_listen_socket_reuseable(evutil_socket_t sock);
 
+/** Do platform-specific operations to make a listener port reusable.
+
+    Specifically, we want to make sure that multiple programs which also
+    set the same socket option will be able to bind, listen at the same time.
+
+    This is a feature available only to Linux 3.9+
+
+    @param sock The socket to make reusable
+    @return 0 on success, -1 on failure
+ */
+EVENT2_EXPORT_SYMBOL
+int evutil_make_listen_socket_reuseable_port(evutil_socket_t sock);
+
 /** Do platform-specific operations as needed to close a socket upon a
     successful execution of one of the exec*() functions.
 
     @param sock The socket to be closed
     @return 0 on success, -1 on failure
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_make_socket_closeonexec(evutil_socket_t sock);
 
 /** Do the platform-specific call needed to close a socket returned from
@@ -320,21 +440,37 @@
     @param sock The socket to be closed
     @return 0 on success, -1 on failure
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_closesocket(evutil_socket_t sock);
 #define EVUTIL_CLOSESOCKET(s) evutil_closesocket(s)
 
+/** Do platform-specific operations, if possible, to make a tcp listener
+ *  socket defer accept()s until there is data to read.
+ *  
+ *  Not all platforms support this.  You don't want to do this for every
+ *  listener socket: only the ones that implement a protocol where the
+ *  client transmits before the server needs to respond.
+ *
+ *  @param sock The listening socket to to make deferred
+ *  @return 0 on success (whether the operation is supported or not),
+ *       -1 on failure
+*/ 
+EVENT2_EXPORT_SYMBOL
+int evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock);
 
-#ifdef WIN32
+#ifdef _WIN32
 /** Return the most recent socket error.  Not idempotent on all platforms. */
 #define EVUTIL_SOCKET_ERROR() WSAGetLastError()
 /** Replace the most recent socket error with errcode */
 #define EVUTIL_SET_SOCKET_ERROR(errcode)		\
 	do { WSASetLastError(errcode); } while (0)
 /** Return the most recent socket error to occur on sock. */
+EVENT2_EXPORT_SYMBOL
 int evutil_socket_geterror(evutil_socket_t sock);
 /** Convert a socket error to a string. */
+EVENT2_EXPORT_SYMBOL
 const char *evutil_socket_error_to_string(int errcode);
-#elif defined(_EVENT_IN_DOXYGEN)
+#elif defined(EVENT_IN_DOXYGEN_)
 /**
    @name Socket error functions
 
@@ -375,7 +511,7 @@
  *
  * @{
  */
-#ifdef _EVENT_HAVE_TIMERADD
+#ifdef EVENT__HAVE_TIMERADD
 #define evutil_timeradd(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp))
 #define evutil_timersub(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp))
 #else
@@ -397,9 +533,9 @@
 			(vvp)->tv_usec += 1000000;			\
 		}							\
 	} while (0)
-#endif /* !_EVENT_HAVE_HAVE_TIMERADD */
+#endif /* !EVENT__HAVE_TIMERADD */
 
-#ifdef _EVENT_HAVE_TIMERCLEAR
+#ifdef EVENT__HAVE_TIMERCLEAR
 #define evutil_timerclear(tvp) timerclear(tvp)
 #else
 #define	evutil_timerclear(tvp)	(tvp)->tv_sec = (tvp)->tv_usec = 0
@@ -413,7 +549,7 @@
 	 ((tvp)->tv_usec cmp (uvp)->tv_usec) :				\
 	 ((tvp)->tv_sec cmp (uvp)->tv_sec))
 
-#ifdef _EVENT_HAVE_TIMERISSET
+#ifdef EVENT__HAVE_TIMERISSET
 #define evutil_timerisset(tvp) timerisset(tvp)
 #else
 #define	evutil_timerisset(tvp)	((tvp)->tv_sec || (tvp)->tv_usec)
@@ -428,19 +564,22 @@
 
 /* big-int related functions */
 /** Parse a 64-bit value from a string.  Arguments are as for strtol. */
+EVENT2_EXPORT_SYMBOL
 ev_int64_t evutil_strtoll(const char *s, char **endptr, int base);
 
 /** Replacement for gettimeofday on platforms that lack it. */
-#ifdef _EVENT_HAVE_GETTIMEOFDAY
+#ifdef EVENT__HAVE_GETTIMEOFDAY
 #define evutil_gettimeofday(tv, tz) gettimeofday((tv), (tz))
 #else
 struct timezone;
+EVENT2_EXPORT_SYMBOL
 int evutil_gettimeofday(struct timeval *tv, struct timezone *tz);
 #endif
 
 /** Replacement for snprintf to get consistent behavior on platforms for
     which the return value of snprintf does not conform to C99.
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_snprintf(char *buf, size_t buflen, const char *format, ...)
 #ifdef __GNUC__
 	__attribute__((format(printf, 3, 4)))
@@ -449,6 +588,7 @@
 /** Replacement for vsnprintf to get consistent behavior on platforms for
     which the return value of snprintf does not conform to C99.
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap)
 #ifdef __GNUC__
 	__attribute__((format(printf, 3, 0)))
@@ -456,8 +596,10 @@
 ;
 
 /** Replacement for inet_ntop for platforms which lack it. */
+EVENT2_EXPORT_SYMBOL
 const char *evutil_inet_ntop(int af, const void *src, char *dst, size_t len);
 /** Replacement for inet_pton for platforms which lack it. */
+EVENT2_EXPORT_SYMBOL
 int evutil_inet_pton(int af, const char *src, void *dst);
 struct sockaddr;
 
@@ -481,6 +623,7 @@
        or if out is not large enough to hold the result.  Otherwise returns
        0 on success.
 */
+EVENT2_EXPORT_SYMBOL
 int evutil_parse_sockaddr_port(const char *str, struct sockaddr *out, int *outlen);
 
 /** Compare two sockaddrs; return 0 if they are equal, or less than 0 if sa1
@@ -488,21 +631,24 @@
  * true, consider the port as well as the address.  Only implemented for
  * AF_INET and AF_INET6 addresses. The ordering is not guaranteed to remain
  * the same between Libevent versions. */
+EVENT2_EXPORT_SYMBOL
 int evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2,
     int include_port);
 
 /** As strcasecmp, but always compares the characters in locale-independent
     ASCII.  That's useful if you're handling data in ASCII-based protocols.
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_ascii_strcasecmp(const char *str1, const char *str2);
 /** As strncasecmp, but always compares the characters in locale-independent
     ASCII.  That's useful if you're handling data in ASCII-based protocols.
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_ascii_strncasecmp(const char *str1, const char *str2, size_t n);
 
 /* Here we define evutil_addrinfo to the native addrinfo type, or redefine it
  * if this system has no getaddrinfo(). */
-#ifdef _EVENT_HAVE_STRUCT_ADDRINFO
+#ifdef EVENT__HAVE_STRUCT_ADDRINFO
 #define evutil_addrinfo addrinfo
 #else
 /** A definition of struct addrinfo for systems that lack it.
@@ -528,32 +674,32 @@
 
     @{
 */
-#ifdef EAI_ADDRFAMILY
+#if defined(EAI_ADDRFAMILY) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_ADDRFAMILY EAI_ADDRFAMILY
 #else
 #define EVUTIL_EAI_ADDRFAMILY -901
 #endif
-#ifdef EAI_AGAIN
+#if defined(EAI_AGAIN) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_AGAIN EAI_AGAIN
 #else
 #define EVUTIL_EAI_AGAIN -902
 #endif
-#ifdef EAI_BADFLAGS
+#if defined(EAI_BADFLAGS) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_BADFLAGS EAI_BADFLAGS
 #else
 #define EVUTIL_EAI_BADFLAGS -903
 #endif
-#ifdef EAI_FAIL
+#if defined(EAI_FAIL) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_FAIL EAI_FAIL
 #else
 #define EVUTIL_EAI_FAIL -904
 #endif
-#ifdef EAI_FAMILY
+#if defined(EAI_FAMILY) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_FAMILY EAI_FAMILY
 #else
 #define EVUTIL_EAI_FAMILY -905
 #endif
-#ifdef EAI_MEMORY
+#if defined(EAI_MEMORY) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_MEMORY EAI_MEMORY
 #else
 #define EVUTIL_EAI_MEMORY -906
@@ -561,27 +707,27 @@
 /* This test is a bit complicated, since some MS SDKs decide to
  * remove NODATA or redefine it to be the same as NONAME, in a
  * fun interpretation of RFC 2553 and RFC 3493. */
-#if defined(EAI_NODATA) && (!defined(EAI_NONAME) || EAI_NODATA != EAI_NONAME)
+#if defined(EAI_NODATA) && defined(EVENT__HAVE_GETADDRINFO) && (!defined(EAI_NONAME) || EAI_NODATA != EAI_NONAME)
 #define EVUTIL_EAI_NODATA EAI_NODATA
 #else
 #define EVUTIL_EAI_NODATA -907
 #endif
-#ifdef EAI_NONAME
+#if defined(EAI_NONAME) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_NONAME EAI_NONAME
 #else
 #define EVUTIL_EAI_NONAME -908
 #endif
-#ifdef EAI_SERVICE
+#if defined(EAI_SERVICE) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_SERVICE EAI_SERVICE
 #else
 #define EVUTIL_EAI_SERVICE -909
 #endif
-#ifdef EAI_SOCKTYPE
+#if defined(EAI_SOCKTYPE) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_SOCKTYPE EAI_SOCKTYPE
 #else
 #define EVUTIL_EAI_SOCKTYPE -910
 #endif
-#ifdef EAI_SYSTEM
+#if defined(EAI_SYSTEM) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_EAI_SYSTEM EAI_SYSTEM
 #else
 #define EVUTIL_EAI_SYSTEM -911
@@ -589,37 +735,37 @@
 
 #define EVUTIL_EAI_CANCEL -90001
 
-#ifdef AI_PASSIVE
+#if defined(AI_PASSIVE) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_AI_PASSIVE AI_PASSIVE
 #else
 #define EVUTIL_AI_PASSIVE 0x1000
 #endif
-#ifdef AI_CANONNAME
+#if defined(AI_CANONNAME) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_AI_CANONNAME AI_CANONNAME
 #else
 #define EVUTIL_AI_CANONNAME 0x2000
 #endif
-#ifdef AI_NUMERICHOST
+#if defined(AI_NUMERICHOST) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_AI_NUMERICHOST AI_NUMERICHOST
 #else
 #define EVUTIL_AI_NUMERICHOST 0x4000
 #endif
-#ifdef AI_NUMERICSERV
+#if defined(AI_NUMERICSERV) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_AI_NUMERICSERV AI_NUMERICSERV
 #else
 #define EVUTIL_AI_NUMERICSERV 0x8000
 #endif
-#ifdef AI_V4MAPPED
+#if defined(AI_V4MAPPED) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_AI_V4MAPPED AI_V4MAPPED
 #else
 #define EVUTIL_AI_V4MAPPED 0x10000
 #endif
-#ifdef AI_ALL
+#if defined(AI_ALL) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_AI_ALL AI_ALL
 #else
 #define EVUTIL_AI_ALL 0x20000
 #endif
-#ifdef AI_ADDRCONFIG
+#if defined(AI_ADDRCONFIG) && defined(EVENT__HAVE_GETADDRINFO)
 #define EVUTIL_AI_ADDRCONFIG AI_ADDRCONFIG
 #else
 #define EVUTIL_AI_ADDRCONFIG 0x40000
@@ -638,12 +784,15 @@
  *
  * For a nonblocking variant, see evdns_getaddrinfo.
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_getaddrinfo(const char *nodename, const char *servname,
     const struct evutil_addrinfo *hints_in, struct evutil_addrinfo **res);
 
 /** Release storage allocated by evutil_getaddrinfo or evdns_getaddrinfo. */
+EVENT2_EXPORT_SYMBOL
 void evutil_freeaddrinfo(struct evutil_addrinfo *ai);
 
+EVENT2_EXPORT_SYMBOL
 const char *evutil_gai_strerror(int err);
 
 /** Generate n bytes of secure pseudorandom data, and store them in buf.
@@ -655,6 +804,7 @@
  * provides only rudimentary prediction- and backtracking-resistance.  Don't
  * use this for serious cryptographic applications.
  */
+EVENT2_EXPORT_SYMBOL
 void evutil_secure_rng_get_bytes(void *buf, size_t n);
 
 /**
@@ -673,6 +823,7 @@
  * whatever), and you want to make sure that seeding happens before your
  * program loses the ability to do it.
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_secure_rng_init(void);
 
 /**
@@ -688,6 +839,7 @@
  *
  * This API is unstable, and might change in a future libevent version.
  */
+EVENT2_EXPORT_SYMBOL
 int evutil_secure_rng_set_urandom_device_file(char *fname);
 
 /** Seed the random number generator with extra random bytes.
@@ -704,10 +856,11 @@
     @param dat a buffer full of a strong source of random numbers
     @param datlen the number of bytes to read from datlen
  */
+EVENT2_EXPORT_SYMBOL
 void evutil_secure_rng_add_bytes(const char *dat, size_t datlen);
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* _EVUTIL_H_ */
+#endif /* EVENT1_EVUTIL_H_INCLUDED_ */