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/dns.h b/include/event2/dns.h
index 6677d4e..17cd86a 100644
--- a/include/event2/dns.h
+++ b/include/event2/dns.h
@@ -132,8 +132,10 @@
  * with the next probe.
  */
 
-#ifndef _EVENT2_DNS_H_
-#define _EVENT2_DNS_H_
+#ifndef EVENT2_DNS_H_INCLUDED_
+#define EVENT2_DNS_H_INCLUDED_
+
+#include <event2/visibility.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -201,6 +203,12 @@
 struct evdns_base;
 struct event_base;
 
+/** Flag for evdns_base_new: process resolv.conf.  */
+#define EVDNS_BASE_INITIALIZE_NAMESERVERS 1
+/** Flag for evdns_base_new: Do not prevent the libevent event loop from
+ * exiting when we have no active dns requests. */
+#define EVDNS_BASE_DISABLE_WHEN_INACTIVE 0x8000
+
 /**
   Initialize the asynchronous DNS library.
 
@@ -209,10 +217,12 @@
   evdns_config_windows_nameservers() on Windows.
 
   @param event_base the event base to associate the dns client with
-  @param initialize_nameservers 1 if resolve.conf processing should occur
+  @param flags any of EVDNS_BASE_INITIALIZE_NAMESERVERS|
+    EVDNS_BASE_DISABLE_WHEN_INACTIVE
   @return evdns_base object if successful, or NULL if an error occurred.
   @see evdns_base_free()
  */
+EVENT2_EXPORT_SYMBOL
 struct evdns_base * evdns_base_new(struct event_base *event_base, int initialize_nameservers);
 
 
@@ -228,14 +238,25 @@
 		active requests will return DNS_ERR_SHUTDOWN.
   @see evdns_base_new()
  */
+EVENT2_EXPORT_SYMBOL
 void evdns_base_free(struct evdns_base *base, int fail_requests);
 
 /**
+   Remove all hosts entries that have been loaded into the event_base via
+   evdns_base_load_hosts or via event_base_resolv_conf_parse.
+
+   @param evdns_base the evdns base to remove outdated host addresses from
+ */
+EVENT2_EXPORT_SYMBOL
+void evdns_base_clear_host_addresses(struct evdns_base *base);
+
+/**
   Convert a DNS error code to a string.
 
   @param err the DNS error code
   @return a string containing an explanation of the error code
 */
+EVENT2_EXPORT_SYMBOL
 const char *evdns_err_to_string(int err);
 
 
@@ -250,6 +271,7 @@
   @return 0 if successful, or -1 if an error occurred
   @see evdns_base_nameserver_ip_add()
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_nameserver_add(struct evdns_base *base,
     unsigned long int address);
 
@@ -265,6 +287,7 @@
   @return the number of configured nameservers
   @see evdns_base_nameserver_add()
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_count_nameservers(struct evdns_base *base);
 
 /**
@@ -276,6 +299,7 @@
   @return 0 if successful, or -1 if an error occurred
   @see evdns_base_resume()
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_clear_nameservers_and_suspend(struct evdns_base *base);
 
 
@@ -289,6 +313,7 @@
   @return 0 if successful, or -1 if an error occurred
   @see evdns_base_clear_nameservers_and_suspend()
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_resume(struct evdns_base *base);
 
 /**
@@ -308,12 +333,14 @@
   @return 0 if successful, or -1 if an error occurred
   @see evdns_base_nameserver_add()
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_nameserver_ip_add(struct evdns_base *base,
     const char *ip_as_string);
 
 /**
    Add a nameserver by sockaddr.
  **/
+EVENT2_EXPORT_SYMBOL
 int
 evdns_base_nameserver_sockaddr_add(struct evdns_base *base,
     const struct sockaddr *sa, ev_socklen_t len, unsigned flags);
@@ -331,6 +358,7 @@
   @return an evdns_request object if successful, or NULL if an error occurred.
   @see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request()
  */
+EVENT2_EXPORT_SYMBOL
 struct evdns_request *evdns_base_resolve_ipv4(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr);
 
 /**
@@ -344,6 +372,7 @@
   @return an evdns_request object if successful, or NULL if an error occurred.
   @see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request()
  */
+EVENT2_EXPORT_SYMBOL
 struct evdns_request *evdns_base_resolve_ipv6(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr);
 
 struct in_addr;
@@ -360,6 +389,7 @@
   @return an evdns_request object if successful, or NULL if an error occurred.
   @see evdns_resolve_reverse_ipv6(), evdns_cancel_request()
  */
+EVENT2_EXPORT_SYMBOL
 struct evdns_request *evdns_base_resolve_reverse(struct evdns_base *base, const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr);
 
 
@@ -374,6 +404,7 @@
   @return an evdns_request object if successful, or NULL if an error occurred.
   @see evdns_resolve_reverse_ipv6(), evdns_cancel_request()
  */
+EVENT2_EXPORT_SYMBOL
 struct evdns_request *evdns_base_resolve_reverse_ipv6(struct evdns_base *base, const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr);
 
 /**
@@ -383,6 +414,7 @@
   @param req the evdns_request that was returned by calling a resolve function
   @see evdns_base_resolve_ipv4(), evdns_base_resolve_ipv6, evdns_base_resolve_reverse
 */
+EVENT2_EXPORT_SYMBOL
 void evdns_cancel_request(struct evdns_base *base, struct evdns_request *req);
 
 /**
@@ -401,6 +433,7 @@
   @param val the value to be set
   @return 0 if successful, or -1 if an error occurred
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_set_option(struct evdns_base *base, const char *option, const char *val);
 
 
@@ -426,6 +459,7 @@
     occurred (see above)
   @see resolv.conf(3), evdns_config_windows_nameservers()
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_resolv_conf_parse(struct evdns_base *base, int flags, const char *const filename);
 
 /**
@@ -436,8 +470,12 @@
 
    Note that only evdns_getaddrinfo uses the /etc/hosts entries.
 
+   This function does not replace previously loaded hosts entries; to do that,
+   call evdns_base_clear_host_addresses first.
+
    Return 0 on success, negative on failure.
 */
+EVENT2_EXPORT_SYMBOL
 int evdns_base_load_hosts(struct evdns_base *base, const char *hosts_fname);
 
 /**
@@ -450,7 +488,8 @@
   @return 0 if successful, or -1 if an error occurred
   @see evdns_resolv_conf_parse()
  */
-#ifdef WIN32
+#ifdef _WIN32
+EVENT2_EXPORT_SYMBOL
 int evdns_base_config_windows_nameservers(struct evdns_base *);
 #define EVDNS_BASE_CONFIG_WINDOWS_NAMESERVERS_IMPLEMENTED
 #endif
@@ -459,6 +498,7 @@
 /**
   Clear the list of search domains.
  */
+EVENT2_EXPORT_SYMBOL
 void evdns_base_search_clear(struct evdns_base *base);
 
 
@@ -467,6 +507,7 @@
 
   @param domain the domain to be added to the search list
  */
+EVENT2_EXPORT_SYMBOL
 void evdns_base_search_add(struct evdns_base *base, const char *domain);
 
 
@@ -478,6 +519,7 @@
 
   @param ndots the new ndots parameter
  */
+EVENT2_EXPORT_SYMBOL
 void evdns_base_search_ndots_set(struct evdns_base *base, const int ndots);
 
 /**
@@ -496,6 +538,7 @@
 
   @param fn the callback to be invoked when a log message is generated
  */
+EVENT2_EXPORT_SYMBOL
 void evdns_set_log_fn(evdns_debug_log_fn_type fn);
 
 /**
@@ -508,6 +551,7 @@
    NOTE: This function has no effect in Libevent 2.0.4-alpha and later,
    since Libevent now provides its own secure RNG.
  */
+EVENT2_EXPORT_SYMBOL
 void evdns_set_transaction_id_fn(ev_uint16_t (*fn)(void));
 
 /**
@@ -519,6 +563,7 @@
    NOTE: This function has no effect in Libevent 2.0.4-alpha and later,
    since Libevent now provides its own secure RNG.
 */
+EVENT2_EXPORT_SYMBOL
 void evdns_set_random_bytes_fn(void (*fn)(char *, size_t));
 
 /*
@@ -572,36 +617,47 @@
     @param user_data Data to pass to the callback.
     @return an evdns_server_port structure for this server port.
  */
+EVENT2_EXPORT_SYMBOL
 struct evdns_server_port *evdns_add_server_port_with_base(struct event_base *base, evutil_socket_t socket, int flags, evdns_request_callback_fn_type callback, void *user_data);
 /** Close down a DNS server port, and free associated structures. */
+EVENT2_EXPORT_SYMBOL
 void evdns_close_server_port(struct evdns_server_port *port);
 
 /** Sets some flags in a reply we're building.
     Allows setting of the AA or RD flags
  */
+EVENT2_EXPORT_SYMBOL
 void evdns_server_request_set_flags(struct evdns_server_request *req, int flags);
 
 /* Functions to add an answer to an in-progress DNS reply.
  */
+EVENT2_EXPORT_SYMBOL
 int evdns_server_request_add_reply(struct evdns_server_request *req, int section, const char *name, int type, int dns_class, int ttl, int datalen, int is_name, const char *data);
+EVENT2_EXPORT_SYMBOL
 int evdns_server_request_add_a_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl);
+EVENT2_EXPORT_SYMBOL
 int evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl);
+EVENT2_EXPORT_SYMBOL
 int evdns_server_request_add_ptr_reply(struct evdns_server_request *req, struct in_addr *in, const char *inaddr_name, const char *hostname, int ttl);
+EVENT2_EXPORT_SYMBOL
 int evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl);
 
 /**
    Send back a response to a DNS request, and free the request structure.
 */
+EVENT2_EXPORT_SYMBOL
 int evdns_server_request_respond(struct evdns_server_request *req, int err);
 /**
    Free a DNS request without sending back a reply.
 */
+EVENT2_EXPORT_SYMBOL
 int evdns_server_request_drop(struct evdns_server_request *req);
 struct sockaddr;
 /**
     Get the address that made a DNS request.
  */
-int evdns_server_request_get_requesting_addr(struct evdns_server_request *_req, struct sockaddr *sa, int addr_len);
+EVENT2_EXPORT_SYMBOL
+int evdns_server_request_get_requesting_addr(struct evdns_server_request *req, struct sockaddr *sa, int addr_len);
 
 /** Callback for evdns_getaddrinfo. */
 typedef void (*evdns_getaddrinfo_cb)(int result, struct evutil_addrinfo *res, void *arg);
@@ -625,6 +681,7 @@
  * - For ai_socktype, we only handle SOCKTYPE_STREAM, SOCKTYPE_UDP, and 0.
  * - For ai_protocol, we only handle IPPROTO_TCP, IPPROTO_UDP, and 0.
  */
+EVENT2_EXPORT_SYMBOL
 struct evdns_getaddrinfo_request *evdns_getaddrinfo(
     struct evdns_base *dns_base,
     const char *nodename, const char *servname,
@@ -634,10 +691,27 @@
 /* Cancel an in-progress evdns_getaddrinfo.  This MUST NOT be called after the
  * getaddrinfo's callback has been invoked.  The resolves will be canceled,
  * and the callback will be invoked with the error EVUTIL_EAI_CANCEL. */
+EVENT2_EXPORT_SYMBOL
 void evdns_getaddrinfo_cancel(struct evdns_getaddrinfo_request *req);
 
+/**
+   Retrieve the address of the 'idx'th configured nameserver.
+
+   @param base The evdns_base to examine.
+   @param idx The index of the nameserver to get the address of.
+   @param sa A location to receive the server's address.
+   @param len The number of bytes available at sa.
+
+   @return the number of bytes written into sa on success.  On failure, returns
+     -1 if idx is greater than the number of configured nameservers, or a
+     value greater than 'len' if len was not high enough.
+ */
+EVENT2_EXPORT_SYMBOL
+int evdns_base_get_nameserver_addr(struct evdns_base *base, int idx,
+    struct sockaddr *sa, ev_socklen_t len);
+
 #ifdef __cplusplus
 }
 #endif
 
-#endif  /* !_EVENT2_DNS_H_ */
+#endif  /* !EVENT2_DNS_H_INCLUDED_ */