Home | History | Annotate | Download | only in libevent
      1 /*
      2  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  * 3. The name of the author may not be used to endorse or promote products
     13  *    derived from this software without specific prior written permission.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #include "event2/event-config.h"
     28 #include "evconfig-private.h"
     29 
     30 #ifdef _WIN32
     31 #include <winsock2.h>
     32 #include <ws2tcpip.h>
     33 #define WIN32_LEAN_AND_MEAN
     34 #include <windows.h>
     35 #undef WIN32_LEAN_AND_MEAN
     36 #include <io.h>
     37 #include <tchar.h>
     38 #include <process.h>
     39 #undef _WIN32_WINNT
     40 /* For structs needed by GetAdaptersAddresses */
     41 #define _WIN32_WINNT 0x0501
     42 #include <iphlpapi.h>
     43 #endif
     44 
     45 #include <sys/types.h>
     46 #ifdef EVENT__HAVE_SYS_SOCKET_H
     47 #include <sys/socket.h>
     48 #endif
     49 #ifdef EVENT__HAVE_UNISTD_H
     50 #include <unistd.h>
     51 #endif
     52 #ifdef EVENT__HAVE_FCNTL_H
     53 #include <fcntl.h>
     54 #endif
     55 #ifdef EVENT__HAVE_STDLIB_H
     56 #include <stdlib.h>
     57 #endif
     58 #include <errno.h>
     59 #include <limits.h>
     60 #include <stdio.h>
     61 #include <string.h>
     62 #ifdef EVENT__HAVE_NETINET_IN_H
     63 #include <netinet/in.h>
     64 #endif
     65 #ifdef EVENT__HAVE_NETINET_IN6_H
     66 #include <netinet/in6.h>
     67 #endif
     68 #ifdef EVENT__HAVE_NETINET_TCP_H
     69 #include <netinet/tcp.h>
     70 #endif
     71 #ifdef EVENT__HAVE_ARPA_INET_H
     72 #include <arpa/inet.h>
     73 #endif
     74 #include <time.h>
     75 #include <sys/stat.h>
     76 #ifdef EVENT__HAVE_IFADDRS_H
     77 #include <ifaddrs.h>
     78 #endif
     79 
     80 #include "event2/util.h"
     81 #include "util-internal.h"
     82 #include "log-internal.h"
     83 #include "mm-internal.h"
     84 #include "evthread-internal.h"
     85 
     86 #include "strlcpy-internal.h"
     87 #include "ipv6-internal.h"
     88 
     89 #ifdef _WIN32
     90 #define HT_NO_CACHE_HASH_VALUES
     91 #include "ht-internal.h"
     92 #define open _open
     93 #define read _read
     94 #define close _close
     95 #ifndef fstat
     96 #define fstat _fstati64
     97 #endif
     98 #ifndef stat
     99 #define stat _stati64
    100 #endif
    101 #define mode_t int
    102 #endif
    103 
    104 int
    105 evutil_open_closeonexec_(const char *pathname, int flags, unsigned mode)
    106 {
    107 	int fd;
    108 
    109 #ifdef O_CLOEXEC
    110 	fd = open(pathname, flags|O_CLOEXEC, (mode_t)mode);
    111 	if (fd >= 0 || errno == EINVAL)
    112 		return fd;
    113 	/* If we got an EINVAL, fall through and try without O_CLOEXEC */
    114 #endif
    115 	fd = open(pathname, flags, (mode_t)mode);
    116 	if (fd < 0)
    117 		return -1;
    118 
    119 #if defined(FD_CLOEXEC)
    120 	if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) {
    121 		close(fd);
    122 		return -1;
    123 	}
    124 #endif
    125 
    126 	return fd;
    127 }
    128 
    129 /**
    130    Read the contents of 'filename' into a newly allocated NUL-terminated
    131    string.  Set *content_out to hold this string, and *len_out to hold its
    132    length (not including the appended NUL).  If 'is_binary', open the file in
    133    binary mode.
    134 
    135    Returns 0 on success, -1 if the open fails, and -2 for all other failures.
    136 
    137    Used internally only; may go away in a future version.
    138  */
    139 int
    140 evutil_read_file_(const char *filename, char **content_out, size_t *len_out,
    141     int is_binary)
    142 {
    143 	int fd, r;
    144 	struct stat st;
    145 	char *mem;
    146 	size_t read_so_far=0;
    147 	int mode = O_RDONLY;
    148 
    149 	EVUTIL_ASSERT(content_out);
    150 	EVUTIL_ASSERT(len_out);
    151 	*content_out = NULL;
    152 	*len_out = 0;
    153 
    154 #ifdef O_BINARY
    155 	if (is_binary)
    156 		mode |= O_BINARY;
    157 #endif
    158 
    159 	fd = evutil_open_closeonexec_(filename, mode, 0);
    160 	if (fd < 0)
    161 		return -1;
    162 	if (fstat(fd, &st) || st.st_size < 0 ||
    163 	    st.st_size > EV_SSIZE_MAX-1 ) {
    164 		close(fd);
    165 		return -2;
    166 	}
    167 	mem = mm_malloc((size_t)st.st_size + 1);
    168 	if (!mem) {
    169 		close(fd);
    170 		return -2;
    171 	}
    172 	read_so_far = 0;
    173 #ifdef _WIN32
    174 #define N_TO_READ(x) ((x) > INT_MAX) ? INT_MAX : ((int)(x))
    175 #else
    176 #define N_TO_READ(x) (x)
    177 #endif
    178 	while ((r = read(fd, mem+read_so_far, N_TO_READ(st.st_size - read_so_far))) > 0) {
    179 		read_so_far += r;
    180 		if (read_so_far >= (size_t)st.st_size)
    181 			break;
    182 		EVUTIL_ASSERT(read_so_far < (size_t)st.st_size);
    183 	}
    184 	close(fd);
    185 	if (r < 0) {
    186 		mm_free(mem);
    187 		return -2;
    188 	}
    189 	mem[read_so_far] = 0;
    190 
    191 	*len_out = read_so_far;
    192 	*content_out = mem;
    193 	return 0;
    194 }
    195 
    196 int
    197 evutil_socketpair(int family, int type, int protocol, evutil_socket_t fd[2])
    198 {
    199 #ifndef _WIN32
    200 	return socketpair(family, type, protocol, fd);
    201 #else
    202 	return evutil_ersatz_socketpair_(family, type, protocol, fd);
    203 #endif
    204 }
    205 
    206 int
    207 evutil_ersatz_socketpair_(int family, int type, int protocol,
    208     evutil_socket_t fd[2])
    209 {
    210 	/* This code is originally from Tor.  Used with permission. */
    211 
    212 	/* This socketpair does not work when localhost is down. So
    213 	 * it's really not the same thing at all. But it's close enough
    214 	 * for now, and really, when localhost is down sometimes, we
    215 	 * have other problems too.
    216 	 */
    217 #ifdef _WIN32
    218 #define ERR(e) WSA##e
    219 #else
    220 #define ERR(e) e
    221 #endif
    222 	evutil_socket_t listener = -1;
    223 	evutil_socket_t connector = -1;
    224 	evutil_socket_t acceptor = -1;
    225 	struct sockaddr_in listen_addr;
    226 	struct sockaddr_in connect_addr;
    227 	ev_socklen_t size;
    228 	int saved_errno = -1;
    229 	int family_test;
    230 
    231 	family_test = family != AF_INET;
    232 #ifdef AF_UNIX
    233 	family_test = family_test && (family != AF_UNIX);
    234 #endif
    235 	if (protocol || family_test) {
    236 		EVUTIL_SET_SOCKET_ERROR(ERR(EAFNOSUPPORT));
    237 		return -1;
    238 	}
    239 
    240 	if (!fd) {
    241 		EVUTIL_SET_SOCKET_ERROR(ERR(EINVAL));
    242 		return -1;
    243 	}
    244 
    245 	listener = socket(AF_INET, type, 0);
    246 	if (listener < 0)
    247 		return -1;
    248 	memset(&listen_addr, 0, sizeof(listen_addr));
    249 	listen_addr.sin_family = AF_INET;
    250 	listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    251 	listen_addr.sin_port = 0;	/* kernel chooses port.	 */
    252 	if (bind(listener, (struct sockaddr *) &listen_addr, sizeof (listen_addr))
    253 		== -1)
    254 		goto tidy_up_and_fail;
    255 	if (listen(listener, 1) == -1)
    256 		goto tidy_up_and_fail;
    257 
    258 	connector = socket(AF_INET, type, 0);
    259 	if (connector < 0)
    260 		goto tidy_up_and_fail;
    261 
    262 	memset(&connect_addr, 0, sizeof(connect_addr));
    263 
    264 	/* We want to find out the port number to connect to.  */
    265 	size = sizeof(connect_addr);
    266 	if (getsockname(listener, (struct sockaddr *) &connect_addr, &size) == -1)
    267 		goto tidy_up_and_fail;
    268 	if (size != sizeof (connect_addr))
    269 		goto abort_tidy_up_and_fail;
    270 	if (connect(connector, (struct sockaddr *) &connect_addr,
    271 				sizeof(connect_addr)) == -1)
    272 		goto tidy_up_and_fail;
    273 
    274 	size = sizeof(listen_addr);
    275 	acceptor = accept(listener, (struct sockaddr *) &listen_addr, &size);
    276 	if (acceptor < 0)
    277 		goto tidy_up_and_fail;
    278 	if (size != sizeof(listen_addr))
    279 		goto abort_tidy_up_and_fail;
    280 	/* Now check we are talking to ourself by matching port and host on the
    281 	   two sockets.	 */
    282 	if (getsockname(connector, (struct sockaddr *) &connect_addr, &size) == -1)
    283 		goto tidy_up_and_fail;
    284 	if (size != sizeof (connect_addr)
    285 		|| listen_addr.sin_family != connect_addr.sin_family
    286 		|| listen_addr.sin_addr.s_addr != connect_addr.sin_addr.s_addr
    287 		|| listen_addr.sin_port != connect_addr.sin_port)
    288 		goto abort_tidy_up_and_fail;
    289 	evutil_closesocket(listener);
    290 	fd[0] = connector;
    291 	fd[1] = acceptor;
    292 
    293 	return 0;
    294 
    295  abort_tidy_up_and_fail:
    296 	saved_errno = ERR(ECONNABORTED);
    297  tidy_up_and_fail:
    298 	if (saved_errno < 0)
    299 		saved_errno = EVUTIL_SOCKET_ERROR();
    300 	if (listener != -1)
    301 		evutil_closesocket(listener);
    302 	if (connector != -1)
    303 		evutil_closesocket(connector);
    304 	if (acceptor != -1)
    305 		evutil_closesocket(acceptor);
    306 
    307 	EVUTIL_SET_SOCKET_ERROR(saved_errno);
    308 	return -1;
    309 #undef ERR
    310 }
    311 
    312 int
    313 evutil_make_socket_nonblocking(evutil_socket_t fd)
    314 {
    315 #ifdef _WIN32
    316 	{
    317 		unsigned long nonblocking = 1;
    318 		if (ioctlsocket(fd, FIONBIO, &nonblocking) == SOCKET_ERROR) {
    319 			event_sock_warn(fd, "fcntl(%d, F_GETFL)", (int)fd);
    320 			return -1;
    321 		}
    322 	}
    323 #else
    324 	{
    325 		int flags;
    326 		if ((flags = fcntl(fd, F_GETFL, NULL)) < 0) {
    327 			event_warn("fcntl(%d, F_GETFL)", fd);
    328 			return -1;
    329 		}
    330 		if (!(flags & O_NONBLOCK)) {
    331 			if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
    332 				event_warn("fcntl(%d, F_SETFL)", fd);
    333 				return -1;
    334 			}
    335 		}
    336 	}
    337 #endif
    338 	return 0;
    339 }
    340 
    341 /* Faster version of evutil_make_socket_nonblocking for internal use.
    342  *
    343  * Requires that no F_SETFL flags were previously set on the fd.
    344  */
    345 static int
    346 evutil_fast_socket_nonblocking(evutil_socket_t fd)
    347 {
    348 #ifdef _WIN32
    349 	return evutil_make_socket_nonblocking(fd);
    350 #else
    351 	if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) {
    352 		event_warn("fcntl(%d, F_SETFL)", fd);
    353 		return -1;
    354 	}
    355 	return 0;
    356 #endif
    357 }
    358 
    359 int
    360 evutil_make_listen_socket_reuseable(evutil_socket_t sock)
    361 {
    362 #if defined(SO_REUSEADDR) && !defined(_WIN32)
    363 	int one = 1;
    364 	/* REUSEADDR on Unix means, "don't hang on to this address after the
    365 	 * listener is closed."  On Windows, though, it means "don't keep other
    366 	 * processes from binding to this address while we're using it. */
    367 	return setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one,
    368 	    (ev_socklen_t)sizeof(one));
    369 #else
    370 	return 0;
    371 #endif
    372 }
    373 
    374 int
    375 evutil_make_listen_socket_reuseable_port(evutil_socket_t sock)
    376 {
    377 #if defined __linux__ && defined(SO_REUSEPORT)
    378 	int one = 1;
    379 	/* REUSEPORT on Linux 3.9+ means, "Multiple servers (processes or
    380 	 * threads) can bind to the same port if they each set the option. */
    381 	return setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (void*) &one,
    382 	    (ev_socklen_t)sizeof(one));
    383 #else
    384 	return 0;
    385 #endif
    386 }
    387 
    388 int
    389 evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock)
    390 {
    391 #if defined(EVENT__HAVE_NETINET_TCP_H) && defined(TCP_DEFER_ACCEPT)
    392 	int one = 1;
    393 
    394 	/* TCP_DEFER_ACCEPT tells the kernel to call defer accept() only after data
    395 	 * has arrived and ready to read */
    396 	return setsockopt(sock, IPPROTO_TCP, TCP_DEFER_ACCEPT, &one,
    397 		(ev_socklen_t)sizeof(one));
    398 #endif
    399 	return 0;
    400 }
    401 
    402 int
    403 evutil_make_socket_closeonexec(evutil_socket_t fd)
    404 {
    405 #if !defined(_WIN32) && defined(EVENT__HAVE_SETFD)
    406 	int flags;
    407 	if ((flags = fcntl(fd, F_GETFD, NULL)) < 0) {
    408 		event_warn("fcntl(%d, F_GETFD)", fd);
    409 		return -1;
    410 	}
    411 	if (!(flags & FD_CLOEXEC)) {
    412 		if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {
    413 			event_warn("fcntl(%d, F_SETFD)", fd);
    414 			return -1;
    415 		}
    416 	}
    417 #endif
    418 	return 0;
    419 }
    420 
    421 /* Faster version of evutil_make_socket_closeonexec for internal use.
    422  *
    423  * Requires that no F_SETFD flags were previously set on the fd.
    424  */
    425 static int
    426 evutil_fast_socket_closeonexec(evutil_socket_t fd)
    427 {
    428 #if !defined(_WIN32) && defined(EVENT__HAVE_SETFD)
    429 	if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
    430 		event_warn("fcntl(%d, F_SETFD)", fd);
    431 		return -1;
    432 	}
    433 #endif
    434 	return 0;
    435 }
    436 
    437 int
    438 evutil_closesocket(evutil_socket_t sock)
    439 {
    440 #ifndef _WIN32
    441 	return close(sock);
    442 #else
    443 	return closesocket(sock);
    444 #endif
    445 }
    446 
    447 ev_int64_t
    448 evutil_strtoll(const char *s, char **endptr, int base)
    449 {
    450 #ifdef EVENT__HAVE_STRTOLL
    451 	return (ev_int64_t)strtoll(s, endptr, base);
    452 #elif EVENT__SIZEOF_LONG == 8
    453 	return (ev_int64_t)strtol(s, endptr, base);
    454 #elif defined(_WIN32) && defined(_MSC_VER) && _MSC_VER < 1300
    455 	/* XXXX on old versions of MS APIs, we only support base
    456 	 * 10. */
    457 	ev_int64_t r;
    458 	if (base != 10)
    459 		return 0;
    460 	r = (ev_int64_t) _atoi64(s);
    461 	while (isspace(*s))
    462 		++s;
    463 	if (*s == '-')
    464 		++s;
    465 	while (isdigit(*s))
    466 		++s;
    467 	if (endptr)
    468 		*endptr = (char*) s;
    469 	return r;
    470 #elif defined(_WIN32)
    471 	return (ev_int64_t) _strtoi64(s, endptr, base);
    472 #elif defined(EVENT__SIZEOF_LONG_LONG) && EVENT__SIZEOF_LONG_LONG == 8
    473 	long long r;
    474 	int n;
    475 	if (base != 10 && base != 16)
    476 		return 0;
    477 	if (base == 10) {
    478 		n = sscanf(s, "%lld", &r);
    479 	} else {
    480 		unsigned long long ru=0;
    481 		n = sscanf(s, "%llx", &ru);
    482 		if (ru > EV_INT64_MAX)
    483 			return 0;
    484 		r = (long long) ru;
    485 	}
    486 	if (n != 1)
    487 		return 0;
    488 	while (EVUTIL_ISSPACE_(*s))
    489 		++s;
    490 	if (*s == '-')
    491 		++s;
    492 	if (base == 10) {
    493 		while (EVUTIL_ISDIGIT_(*s))
    494 			++s;
    495 	} else {
    496 		while (EVUTIL_ISXDIGIT_(*s))
    497 			++s;
    498 	}
    499 	if (endptr)
    500 		*endptr = (char*) s;
    501 	return r;
    502 #else
    503 #error "I don't know how to parse 64-bit integers."
    504 #endif
    505 }
    506 
    507 #ifdef _WIN32
    508 int
    509 evutil_socket_geterror(evutil_socket_t sock)
    510 {
    511 	int optval, optvallen=sizeof(optval);
    512 	int err = WSAGetLastError();
    513 	if (err == WSAEWOULDBLOCK && sock >= 0) {
    514 		if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&optval,
    515 					   &optvallen))
    516 			return err;
    517 		if (optval)
    518 			return optval;
    519 	}
    520 	return err;
    521 }
    522 #endif
    523 
    524 /* XXX we should use an enum here. */
    525 /* 2 for connection refused, 1 for connected, 0 for not yet, -1 for error. */
    526 int
    527 evutil_socket_connect_(evutil_socket_t *fd_ptr, const struct sockaddr *sa, int socklen)
    528 {
    529 	int made_fd = 0;
    530 
    531 	if (*fd_ptr < 0) {
    532 		if ((*fd_ptr = socket(sa->sa_family, SOCK_STREAM, 0)) < 0)
    533 			goto err;
    534 		made_fd = 1;
    535 		if (evutil_make_socket_nonblocking(*fd_ptr) < 0) {
    536 			goto err;
    537 		}
    538 	}
    539 
    540 	if (connect(*fd_ptr, sa, socklen) < 0) {
    541 		int e = evutil_socket_geterror(*fd_ptr);
    542 		if (EVUTIL_ERR_CONNECT_RETRIABLE(e))
    543 			return 0;
    544 		if (EVUTIL_ERR_CONNECT_REFUSED(e))
    545 			return 2;
    546 		goto err;
    547 	} else {
    548 		return 1;
    549 	}
    550 
    551 err:
    552 	if (made_fd) {
    553 		evutil_closesocket(*fd_ptr);
    554 		*fd_ptr = -1;
    555 	}
    556 	return -1;
    557 }
    558 
    559 /* Check whether a socket on which we called connect() is done
    560    connecting. Return 1 for connected, 0 for not yet, -1 for error.  In the
    561    error case, set the current socket errno to the error that happened during
    562    the connect operation. */
    563 int
    564 evutil_socket_finished_connecting_(evutil_socket_t fd)
    565 {
    566 	int e;
    567 	ev_socklen_t elen = sizeof(e);
    568 
    569 	if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*)&e, &elen) < 0)
    570 		return -1;
    571 
    572 	if (e) {
    573 		if (EVUTIL_ERR_CONNECT_RETRIABLE(e))
    574 			return 0;
    575 		EVUTIL_SET_SOCKET_ERROR(e);
    576 		return -1;
    577 	}
    578 
    579 	return 1;
    580 }
    581 
    582 #if (EVUTIL_AI_PASSIVE|EVUTIL_AI_CANONNAME|EVUTIL_AI_NUMERICHOST| \
    583      EVUTIL_AI_NUMERICSERV|EVUTIL_AI_V4MAPPED|EVUTIL_AI_ALL| \
    584      EVUTIL_AI_ADDRCONFIG) != \
    585     (EVUTIL_AI_PASSIVE^EVUTIL_AI_CANONNAME^EVUTIL_AI_NUMERICHOST^ \
    586      EVUTIL_AI_NUMERICSERV^EVUTIL_AI_V4MAPPED^EVUTIL_AI_ALL^ \
    587      EVUTIL_AI_ADDRCONFIG)
    588 #error "Some of our EVUTIL_AI_* flags seem to overlap with system AI_* flags"
    589 #endif
    590 
    591 /* We sometimes need to know whether we have an ipv4 address and whether we
    592    have an ipv6 address. If 'have_checked_interfaces', then we've already done
    593    the test.  If 'had_ipv4_address', then it turns out we had an ipv4 address.
    594    If 'had_ipv6_address', then it turns out we had an ipv6 address.   These are
    595    set by evutil_check_interfaces. */
    596 static int have_checked_interfaces, had_ipv4_address, had_ipv6_address;
    597 
    598 /* Macro: True iff the IPv4 address 'addr', in host order, is in 127.0.0.0/8
    599  */
    600 #define EVUTIL_V4ADDR_IS_LOCALHOST(addr) (((addr)>>24) == 127)
    601 
    602 /* Macro: True iff the IPv4 address 'addr', in host order, is a class D
    603  * (multiclass) address.
    604  */
    605 #define EVUTIL_V4ADDR_IS_CLASSD(addr) ((((addr)>>24) & 0xf0) == 0xe0)
    606 
    607 static void
    608 evutil_found_ifaddr(const struct sockaddr *sa)
    609 {
    610 	const char ZEROES[] = "\x00\x00\x00\x00\x00\x00\x00\x00"
    611 	    "\x00\x00\x00\x00\x00\x00\x00\x00";
    612 
    613 	if (sa->sa_family == AF_INET) {
    614 		const struct sockaddr_in *sin = (struct sockaddr_in *)sa;
    615 		ev_uint32_t addr = ntohl(sin->sin_addr.s_addr);
    616 		if (addr == 0 ||
    617 		    EVUTIL_V4ADDR_IS_LOCALHOST(addr) ||
    618 		    EVUTIL_V4ADDR_IS_CLASSD(addr)) {
    619 			/* Not actually a usable external address. */
    620 		} else {
    621 			event_debug(("Detected an IPv4 interface"));
    622 			had_ipv4_address = 1;
    623 		}
    624 	} else if (sa->sa_family == AF_INET6) {
    625 		const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
    626 		const unsigned char *addr =
    627 		    (unsigned char*)sin6->sin6_addr.s6_addr;
    628 		if (!memcmp(addr, ZEROES, 8) ||
    629 		    ((addr[0] & 0xfe) == 0xfc) ||
    630 		    (addr[0] == 0xfe && (addr[1] & 0xc0) == 0x80) ||
    631 		    (addr[0] == 0xfe && (addr[1] & 0xc0) == 0xc0) ||
    632 		    (addr[0] == 0xff)) {
    633 			/* This is a reserved, ipv4compat, ipv4map, loopback,
    634 			 * link-local, multicast, or unspecified address. */
    635 		} else {
    636 			event_debug(("Detected an IPv6 interface"));
    637 			had_ipv6_address = 1;
    638 		}
    639 	}
    640 }
    641 
    642 #ifdef _WIN32
    643 typedef ULONG (WINAPI *GetAdaptersAddresses_fn_t)(
    644               ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG);
    645 #endif
    646 
    647 static int
    648 evutil_check_ifaddrs(void)
    649 {
    650 #if defined(EVENT__HAVE_GETIFADDRS)
    651 	/* Most free Unixy systems provide getifaddrs, which gives us a linked list
    652 	 * of struct ifaddrs. */
    653 	struct ifaddrs *ifa = NULL;
    654 	const struct ifaddrs *i;
    655 	if (getifaddrs(&ifa) < 0) {
    656 		event_warn("Unable to call getifaddrs()");
    657 		return -1;
    658 	}
    659 
    660 	for (i = ifa; i; i = i->ifa_next) {
    661 		if (!i->ifa_addr)
    662 			continue;
    663 		evutil_found_ifaddr(i->ifa_addr);
    664 	}
    665 
    666 	freeifaddrs(ifa);
    667 	return 0;
    668 #elif defined(_WIN32)
    669 	/* Windows XP began to provide GetAdaptersAddresses. Windows 2000 had a
    670 	   "GetAdaptersInfo", but that's deprecated; let's just try
    671 	   GetAdaptersAddresses and fall back to connect+getsockname.
    672 	*/
    673 	HMODULE lib = evutil_load_windows_system_library_(TEXT("ihplapi.dll"));
    674 	GetAdaptersAddresses_fn_t fn;
    675 	ULONG size, res;
    676 	IP_ADAPTER_ADDRESSES *addresses = NULL, *address;
    677 	int result = -1;
    678 
    679 #define FLAGS (GAA_FLAG_SKIP_ANYCAST | \
    680                GAA_FLAG_SKIP_MULTICAST | \
    681                GAA_FLAG_SKIP_DNS_SERVER)
    682 
    683 	if (!lib)
    684 		goto done;
    685 
    686 	if (!(fn = (GetAdaptersAddresses_fn_t) GetProcAddress(lib, "GetAdaptersAddresses")))
    687 		goto done;
    688 
    689 	/* Guess how much space we need. */
    690 	size = 15*1024;
    691 	addresses = mm_malloc(size);
    692 	if (!addresses)
    693 		goto done;
    694 	res = fn(AF_UNSPEC, FLAGS, NULL, addresses, &size);
    695 	if (res == ERROR_BUFFER_OVERFLOW) {
    696 		/* we didn't guess that we needed enough space; try again */
    697 		mm_free(addresses);
    698 		addresses = mm_malloc(size);
    699 		if (!addresses)
    700 			goto done;
    701 		res = fn(AF_UNSPEC, FLAGS, NULL, addresses, &size);
    702 	}
    703 	if (res != NO_ERROR)
    704 		goto done;
    705 
    706 	for (address = addresses; address; address = address->Next) {
    707 		IP_ADAPTER_UNICAST_ADDRESS *a;
    708 		for (a = address->FirstUnicastAddress; a; a = a->Next) {
    709 			/* Yes, it's a linked list inside a linked list */
    710 			struct sockaddr *sa = a->Address.lpSockaddr;
    711 			evutil_found_ifaddr(sa);
    712 		}
    713 	}
    714 
    715 	result = 0;
    716 done:
    717 	if (lib)
    718 		FreeLibrary(lib);
    719 	if (addresses)
    720 		mm_free(addresses);
    721 	return result;
    722 #else
    723 	return -1;
    724 #endif
    725 }
    726 
    727 /* Test whether we have an ipv4 interface and an ipv6 interface.  Return 0 if
    728  * the test seemed successful. */
    729 static int
    730 evutil_check_interfaces(int force_recheck)
    731 {
    732 	evutil_socket_t fd = -1;
    733 	struct sockaddr_in sin, sin_out;
    734 	struct sockaddr_in6 sin6, sin6_out;
    735 	ev_socklen_t sin_out_len = sizeof(sin_out);
    736 	ev_socklen_t sin6_out_len = sizeof(sin6_out);
    737 	int r;
    738 	if (have_checked_interfaces && !force_recheck)
    739 		return 0;
    740 
    741 	if (evutil_check_ifaddrs() == 0) {
    742 		/* Use a nice sane interface, if this system has one. */
    743 		return 0;
    744 	}
    745 
    746 	/* Ugh. There was no nice sane interface.  So to check whether we have
    747 	 * an interface open for a given protocol, will try to make a UDP
    748 	 * 'connection' to a remote host on the internet.  We don't actually
    749 	 * use it, so the address doesn't matter, but we want to pick one that
    750 	 * keep us from using a host- or link-local interface. */
    751 	memset(&sin, 0, sizeof(sin));
    752 	sin.sin_family = AF_INET;
    753 	sin.sin_port = htons(53);
    754 	r = evutil_inet_pton(AF_INET, "18.244.0.188", &sin.sin_addr);
    755 	EVUTIL_ASSERT(r);
    756 
    757 	memset(&sin6, 0, sizeof(sin6));
    758 	sin6.sin6_family = AF_INET6;
    759 	sin6.sin6_port = htons(53);
    760 	r = evutil_inet_pton(AF_INET6, "2001:4860:b002::68", &sin6.sin6_addr);
    761 	EVUTIL_ASSERT(r);
    762 
    763 	memset(&sin_out, 0, sizeof(sin_out));
    764 	memset(&sin6_out, 0, sizeof(sin6_out));
    765 
    766 	/* XXX some errnos mean 'no address'; some mean 'not enough sockets'. */
    767 	if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) >= 0 &&
    768 	    connect(fd, (struct sockaddr*)&sin, sizeof(sin)) == 0 &&
    769 	    getsockname(fd, (struct sockaddr*)&sin_out, &sin_out_len) == 0) {
    770 		/* We might have an IPv4 interface. */
    771 		evutil_found_ifaddr((struct sockaddr*) &sin_out);
    772 	}
    773 	if (fd >= 0)
    774 		evutil_closesocket(fd);
    775 
    776 	if ((fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) >= 0 &&
    777 	    connect(fd, (struct sockaddr*)&sin6, sizeof(sin6)) == 0 &&
    778 	    getsockname(fd, (struct sockaddr*)&sin6_out, &sin6_out_len) == 0) {
    779 		/* We might have an IPv6 interface. */
    780 		evutil_found_ifaddr((struct sockaddr*) &sin6_out);
    781 	}
    782 
    783 	if (fd >= 0)
    784 		evutil_closesocket(fd);
    785 
    786 	return 0;
    787 }
    788 
    789 /* Internal addrinfo flag.  This one is set when we allocate the addrinfo from
    790  * inside libevent.  Otherwise, the built-in getaddrinfo() function allocated
    791  * it, and we should trust what they said.
    792  **/
    793 #define EVUTIL_AI_LIBEVENT_ALLOCATED 0x80000000
    794 
    795 /* Helper: construct a new addrinfo containing the socket address in
    796  * 'sa', which must be a sockaddr_in or a sockaddr_in6.  Take the
    797  * socktype and protocol info from hints.  If they weren't set, then
    798  * allocate both a TCP and a UDP addrinfo.
    799  */
    800 struct evutil_addrinfo *
    801 evutil_new_addrinfo_(struct sockaddr *sa, ev_socklen_t socklen,
    802     const struct evutil_addrinfo *hints)
    803 {
    804 	struct evutil_addrinfo *res;
    805 	EVUTIL_ASSERT(hints);
    806 
    807 	if (hints->ai_socktype == 0 && hints->ai_protocol == 0) {
    808 		/* Indecisive user! Give them a UDP and a TCP. */
    809 		struct evutil_addrinfo *r1, *r2;
    810 		struct evutil_addrinfo tmp;
    811 		memcpy(&tmp, hints, sizeof(tmp));
    812 		tmp.ai_socktype = SOCK_STREAM; tmp.ai_protocol = IPPROTO_TCP;
    813 		r1 = evutil_new_addrinfo_(sa, socklen, &tmp);
    814 		if (!r1)
    815 			return NULL;
    816 		tmp.ai_socktype = SOCK_DGRAM; tmp.ai_protocol = IPPROTO_UDP;
    817 		r2 = evutil_new_addrinfo_(sa, socklen, &tmp);
    818 		if (!r2) {
    819 			evutil_freeaddrinfo(r1);
    820 			return NULL;
    821 		}
    822 		r1->ai_next = r2;
    823 		return r1;
    824 	}
    825 
    826 	/* We're going to allocate extra space to hold the sockaddr. */
    827 	res = mm_calloc(1,sizeof(struct evutil_addrinfo)+socklen);
    828 	if (!res)
    829 		return NULL;
    830 	res->ai_addr = (struct sockaddr*)
    831 	    (((char*)res) + sizeof(struct evutil_addrinfo));
    832 	memcpy(res->ai_addr, sa, socklen);
    833 	res->ai_addrlen = socklen;
    834 	res->ai_family = sa->sa_family; /* Same or not? XXX */
    835 	res->ai_flags = EVUTIL_AI_LIBEVENT_ALLOCATED;
    836 	res->ai_socktype = hints->ai_socktype;
    837 	res->ai_protocol = hints->ai_protocol;
    838 
    839 	return res;
    840 }
    841 
    842 /* Append the addrinfo 'append' to the end of 'first', and return the start of
    843  * the list.  Either element can be NULL, in which case we return the element
    844  * that is not NULL. */
    845 struct evutil_addrinfo *
    846 evutil_addrinfo_append_(struct evutil_addrinfo *first,
    847     struct evutil_addrinfo *append)
    848 {
    849 	struct evutil_addrinfo *ai = first;
    850 	if (!ai)
    851 		return append;
    852 	while (ai->ai_next)
    853 		ai = ai->ai_next;
    854 	ai->ai_next = append;
    855 
    856 	return first;
    857 }
    858 
    859 static int
    860 parse_numeric_servname(const char *servname)
    861 {
    862 	int n;
    863 	char *endptr=NULL;
    864 	n = (int) strtol(servname, &endptr, 10);
    865 	if (n>=0 && n <= 65535 && servname[0] && endptr && !endptr[0])
    866 		return n;
    867 	else
    868 		return -1;
    869 }
    870 
    871 /** Parse a service name in 'servname', which can be a decimal port.
    872  * Return the port number, or -1 on error.
    873  */
    874 static int
    875 evutil_parse_servname(const char *servname, const char *protocol,
    876     const struct evutil_addrinfo *hints)
    877 {
    878 	int n = parse_numeric_servname(servname);
    879 	if (n>=0)
    880 		return n;
    881 #if defined(EVENT__HAVE_GETSERVBYNAME) || defined(_WIN32)
    882 	if (!(hints->ai_flags & EVUTIL_AI_NUMERICSERV)) {
    883 		struct servent *ent = getservbyname(servname, protocol);
    884 		if (ent) {
    885 			return ntohs(ent->s_port);
    886 		}
    887 	}
    888 #endif
    889 	return -1;
    890 }
    891 
    892 /* Return a string corresponding to a protocol number that we can pass to
    893  * getservyname.  */
    894 static const char *
    895 evutil_unparse_protoname(int proto)
    896 {
    897 	switch (proto) {
    898 	case 0:
    899 		return NULL;
    900 	case IPPROTO_TCP:
    901 		return "tcp";
    902 	case IPPROTO_UDP:
    903 		return "udp";
    904 #ifdef IPPROTO_SCTP
    905 	case IPPROTO_SCTP:
    906 		return "sctp";
    907 #endif
    908 	default:
    909 #ifdef EVENT__HAVE_GETPROTOBYNUMBER
    910 		{
    911 			struct protoent *ent = getprotobynumber(proto);
    912 			if (ent)
    913 				return ent->p_name;
    914 		}
    915 #endif
    916 		return NULL;
    917 	}
    918 }
    919 
    920 static void
    921 evutil_getaddrinfo_infer_protocols(struct evutil_addrinfo *hints)
    922 {
    923 	/* If we can guess the protocol from the socktype, do so. */
    924 	if (!hints->ai_protocol && hints->ai_socktype) {
    925 		if (hints->ai_socktype == SOCK_DGRAM)
    926 			hints->ai_protocol = IPPROTO_UDP;
    927 		else if (hints->ai_socktype == SOCK_STREAM)
    928 			hints->ai_protocol = IPPROTO_TCP;
    929 	}
    930 
    931 	/* Set the socktype if it isn't set. */
    932 	if (!hints->ai_socktype && hints->ai_protocol) {
    933 		if (hints->ai_protocol == IPPROTO_UDP)
    934 			hints->ai_socktype = SOCK_DGRAM;
    935 		else if (hints->ai_protocol == IPPROTO_TCP)
    936 			hints->ai_socktype = SOCK_STREAM;
    937 #ifdef IPPROTO_SCTP
    938 		else if (hints->ai_protocol == IPPROTO_SCTP)
    939 			hints->ai_socktype = SOCK_STREAM;
    940 #endif
    941 	}
    942 }
    943 
    944 #if AF_UNSPEC != PF_UNSPEC
    945 #error "I cannot build on a system where AF_UNSPEC != PF_UNSPEC"
    946 #endif
    947 
    948 /** Implements the part of looking up hosts by name that's common to both
    949  * the blocking and nonblocking resolver:
    950  *   - Adjust 'hints' to have a reasonable socktype and protocol.
    951  *   - Look up the port based on 'servname', and store it in *portnum,
    952  *   - Handle the nodename==NULL case
    953  *   - Handle some invalid arguments cases.
    954  *   - Handle the cases where nodename is an IPv4 or IPv6 address.
    955  *
    956  * If we need the resolver to look up the hostname, we return
    957  * EVUTIL_EAI_NEED_RESOLVE.  Otherwise, we can completely implement
    958  * getaddrinfo: we return 0 or an appropriate EVUTIL_EAI_* error, and
    959  * set *res as getaddrinfo would.
    960  */
    961 int
    962 evutil_getaddrinfo_common_(const char *nodename, const char *servname,
    963     struct evutil_addrinfo *hints, struct evutil_addrinfo **res, int *portnum)
    964 {
    965 	int port = 0;
    966 	const char *pname;
    967 
    968 	if (nodename == NULL && servname == NULL)
    969 		return EVUTIL_EAI_NONAME;
    970 
    971 	/* We only understand 3 families */
    972 	if (hints->ai_family != PF_UNSPEC && hints->ai_family != PF_INET &&
    973 	    hints->ai_family != PF_INET6)
    974 		return EVUTIL_EAI_FAMILY;
    975 
    976 	evutil_getaddrinfo_infer_protocols(hints);
    977 
    978 	/* Look up the port number and protocol, if possible. */
    979 	pname = evutil_unparse_protoname(hints->ai_protocol);
    980 	if (servname) {
    981 		/* XXXX We could look at the protocol we got back from
    982 		 * getservbyname, but it doesn't seem too useful. */
    983 		port = evutil_parse_servname(servname, pname, hints);
    984 		if (port < 0) {
    985 			return EVUTIL_EAI_NONAME;
    986 		}
    987 	}
    988 
    989 	/* If we have no node name, then we're supposed to bind to 'any' and
    990 	 * connect to localhost. */
    991 	if (nodename == NULL) {
    992 		struct evutil_addrinfo *res4=NULL, *res6=NULL;
    993 		if (hints->ai_family != PF_INET) { /* INET6 or UNSPEC. */
    994 			struct sockaddr_in6 sin6;
    995 			memset(&sin6, 0, sizeof(sin6));
    996 			sin6.sin6_family = AF_INET6;
    997 			sin6.sin6_port = htons(port);
    998 			if (hints->ai_flags & EVUTIL_AI_PASSIVE) {
    999 				/* Bind to :: */
   1000 			} else {
   1001 				/* connect to ::1 */
   1002 				sin6.sin6_addr.s6_addr[15] = 1;
   1003 			}
   1004 			res6 = evutil_new_addrinfo_((struct sockaddr*)&sin6,
   1005 			    sizeof(sin6), hints);
   1006 			if (!res6)
   1007 				return EVUTIL_EAI_MEMORY;
   1008 		}
   1009 
   1010 		if (hints->ai_family != PF_INET6) { /* INET or UNSPEC */
   1011 			struct sockaddr_in sin;
   1012 			memset(&sin, 0, sizeof(sin));
   1013 			sin.sin_family = AF_INET;
   1014 			sin.sin_port = htons(port);
   1015 			if (hints->ai_flags & EVUTIL_AI_PASSIVE) {
   1016 				/* Bind to 0.0.0.0 */
   1017 			} else {
   1018 				/* connect to 127.0.0.1 */
   1019 				sin.sin_addr.s_addr = htonl(0x7f000001);
   1020 			}
   1021 			res4 = evutil_new_addrinfo_((struct sockaddr*)&sin,
   1022 			    sizeof(sin), hints);
   1023 			if (!res4) {
   1024 				if (res6)
   1025 					evutil_freeaddrinfo(res6);
   1026 				return EVUTIL_EAI_MEMORY;
   1027 			}
   1028 		}
   1029 		*res = evutil_addrinfo_append_(res4, res6);
   1030 		return 0;
   1031 	}
   1032 
   1033 	/* If we can, we should try to parse the hostname without resolving
   1034 	 * it. */
   1035 	/* Try ipv6. */
   1036 	if (hints->ai_family == PF_INET6 || hints->ai_family == PF_UNSPEC) {
   1037 		struct sockaddr_in6 sin6;
   1038 		memset(&sin6, 0, sizeof(sin6));
   1039 		if (1==evutil_inet_pton(AF_INET6, nodename, &sin6.sin6_addr)) {
   1040 			/* Got an ipv6 address. */
   1041 			sin6.sin6_family = AF_INET6;
   1042 			sin6.sin6_port = htons(port);
   1043 			*res = evutil_new_addrinfo_((struct sockaddr*)&sin6,
   1044 			    sizeof(sin6), hints);
   1045 			if (!*res)
   1046 				return EVUTIL_EAI_MEMORY;
   1047 			return 0;
   1048 		}
   1049 	}
   1050 
   1051 	/* Try ipv4. */
   1052 	if (hints->ai_family == PF_INET || hints->ai_family == PF_UNSPEC) {
   1053 		struct sockaddr_in sin;
   1054 		memset(&sin, 0, sizeof(sin));
   1055 		if (1==evutil_inet_pton(AF_INET, nodename, &sin.sin_addr)) {
   1056 			/* Got an ipv6 address. */
   1057 			sin.sin_family = AF_INET;
   1058 			sin.sin_port = htons(port);
   1059 			*res = evutil_new_addrinfo_((struct sockaddr*)&sin,
   1060 			    sizeof(sin), hints);
   1061 			if (!*res)
   1062 				return EVUTIL_EAI_MEMORY;
   1063 			return 0;
   1064 		}
   1065 	}
   1066 
   1067 
   1068 	/* If we have reached this point, we definitely need to do a DNS
   1069 	 * lookup. */
   1070 	if ((hints->ai_flags & EVUTIL_AI_NUMERICHOST)) {
   1071 		/* If we're not allowed to do one, then say so. */
   1072 		return EVUTIL_EAI_NONAME;
   1073 	}
   1074 	*portnum = port;
   1075 	return EVUTIL_EAI_NEED_RESOLVE;
   1076 }
   1077 
   1078 #ifdef EVENT__HAVE_GETADDRINFO
   1079 #define USE_NATIVE_GETADDRINFO
   1080 #endif
   1081 
   1082 #ifdef USE_NATIVE_GETADDRINFO
   1083 /* A mask of all the flags that we declare, so we can clear them before calling
   1084  * the native getaddrinfo */
   1085 static const unsigned int ALL_NONNATIVE_AI_FLAGS =
   1086 #ifndef AI_PASSIVE
   1087     EVUTIL_AI_PASSIVE |
   1088 #endif
   1089 #ifndef AI_CANONNAME
   1090     EVUTIL_AI_CANONNAME |
   1091 #endif
   1092 #ifndef AI_NUMERICHOST
   1093     EVUTIL_AI_NUMERICHOST |
   1094 #endif
   1095 #ifndef AI_NUMERICSERV
   1096     EVUTIL_AI_NUMERICSERV |
   1097 #endif
   1098 #ifndef AI_ADDRCONFIG
   1099     EVUTIL_AI_ADDRCONFIG |
   1100 #endif
   1101 #ifndef AI_ALL
   1102     EVUTIL_AI_ALL |
   1103 #endif
   1104 #ifndef AI_V4MAPPED
   1105     EVUTIL_AI_V4MAPPED |
   1106 #endif
   1107     EVUTIL_AI_LIBEVENT_ALLOCATED;
   1108 
   1109 static const unsigned int ALL_NATIVE_AI_FLAGS =
   1110 #ifdef AI_PASSIVE
   1111     AI_PASSIVE |
   1112 #endif
   1113 #ifdef AI_CANONNAME
   1114     AI_CANONNAME |
   1115 #endif
   1116 #ifdef AI_NUMERICHOST
   1117     AI_NUMERICHOST |
   1118 #endif
   1119 #ifdef AI_NUMERICSERV
   1120     AI_NUMERICSERV |
   1121 #endif
   1122 #ifdef AI_ADDRCONFIG
   1123     AI_ADDRCONFIG |
   1124 #endif
   1125 #ifdef AI_ALL
   1126     AI_ALL |
   1127 #endif
   1128 #ifdef AI_V4MAPPED
   1129     AI_V4MAPPED |
   1130 #endif
   1131     0;
   1132 #endif
   1133 
   1134 #ifndef USE_NATIVE_GETADDRINFO
   1135 /* Helper for systems with no getaddrinfo(): make one or more addrinfos out of
   1136  * a struct hostent.
   1137  */
   1138 static struct evutil_addrinfo *
   1139 addrinfo_from_hostent(const struct hostent *ent,
   1140     int port, const struct evutil_addrinfo *hints)
   1141 {
   1142 	int i;
   1143 	struct sockaddr_in sin;
   1144 	struct sockaddr_in6 sin6;
   1145 	struct sockaddr *sa;
   1146 	int socklen;
   1147 	struct evutil_addrinfo *res=NULL, *ai;
   1148 	void *addrp;
   1149 
   1150 	if (ent->h_addrtype == PF_INET) {
   1151 		memset(&sin, 0, sizeof(sin));
   1152 		sin.sin_family = AF_INET;
   1153 		sin.sin_port = htons(port);
   1154 		sa = (struct sockaddr *)&sin;
   1155 		socklen = sizeof(struct sockaddr_in);
   1156 		addrp = &sin.sin_addr;
   1157 		if (ent->h_length != sizeof(sin.sin_addr)) {
   1158 			event_warnx("Weird h_length from gethostbyname");
   1159 			return NULL;
   1160 		}
   1161 	} else if (ent->h_addrtype == PF_INET6) {
   1162 		memset(&sin6, 0, sizeof(sin6));
   1163 		sin6.sin6_family = AF_INET6;
   1164 		sin6.sin6_port = htons(port);
   1165 		sa = (struct sockaddr *)&sin6;
   1166 		socklen = sizeof(struct sockaddr_in6);
   1167 		addrp = &sin6.sin6_addr;
   1168 		if (ent->h_length != sizeof(sin6.sin6_addr)) {
   1169 			event_warnx("Weird h_length from gethostbyname");
   1170 			return NULL;
   1171 		}
   1172 	} else
   1173 		return NULL;
   1174 
   1175 	for (i = 0; ent->h_addr_list[i]; ++i) {
   1176 		memcpy(addrp, ent->h_addr_list[i], ent->h_length);
   1177 		ai = evutil_new_addrinfo_(sa, socklen, hints);
   1178 		if (!ai) {
   1179 			evutil_freeaddrinfo(res);
   1180 			return NULL;
   1181 		}
   1182 		res = evutil_addrinfo_append_(res, ai);
   1183 	}
   1184 
   1185 	if (res && ((hints->ai_flags & EVUTIL_AI_CANONNAME) && ent->h_name)) {
   1186 		res->ai_canonname = mm_strdup(ent->h_name);
   1187 		if (res->ai_canonname == NULL) {
   1188 			evutil_freeaddrinfo(res);
   1189 			return NULL;
   1190 		}
   1191 	}
   1192 
   1193 	return res;
   1194 }
   1195 #endif
   1196 
   1197 /* If the EVUTIL_AI_ADDRCONFIG flag is set on hints->ai_flags, and
   1198  * hints->ai_family is PF_UNSPEC, then revise the value of hints->ai_family so
   1199  * that we'll only get addresses we could maybe connect to.
   1200  */
   1201 void
   1202 evutil_adjust_hints_for_addrconfig_(struct evutil_addrinfo *hints)
   1203 {
   1204 	if (!(hints->ai_flags & EVUTIL_AI_ADDRCONFIG))
   1205 		return;
   1206 	if (hints->ai_family != PF_UNSPEC)
   1207 		return;
   1208 	if (!have_checked_interfaces)
   1209 		evutil_check_interfaces(0);
   1210 	if (had_ipv4_address && !had_ipv6_address) {
   1211 		hints->ai_family = PF_INET;
   1212 	} else if (!had_ipv4_address && had_ipv6_address) {
   1213 		hints->ai_family = PF_INET6;
   1214 	}
   1215 }
   1216 
   1217 #ifdef USE_NATIVE_GETADDRINFO
   1218 static int need_numeric_port_hack_=0;
   1219 static int need_socktype_protocol_hack_=0;
   1220 static int tested_for_getaddrinfo_hacks=0;
   1221 
   1222 /* Some older BSDs (like OpenBSD up to 4.6) used to believe that
   1223    giving a numeric port without giving an ai_socktype was verboten.
   1224    We test for this so we can apply an appropriate workaround.  If it
   1225    turns out that the bug is present, then:
   1226 
   1227     - If nodename==NULL and servname is numeric, we build an answer
   1228       ourselves using evutil_getaddrinfo_common_().
   1229 
   1230     - If nodename!=NULL and servname is numeric, then we set
   1231       servname=NULL when calling getaddrinfo, and post-process the
   1232       result to set the ports on it.
   1233 
   1234    We test for this bug at runtime, since otherwise we can't have the
   1235    same binary run on multiple BSD versions.
   1236 
   1237    - Some versions of Solaris believe that it's nice to leave to protocol
   1238      field set to 0.  We test for this so we can apply an appropriate
   1239      workaround.
   1240 */
   1241 static struct evutil_addrinfo *ai_find_protocol(struct evutil_addrinfo *ai)
   1242 {
   1243 	while (ai) {
   1244 		if (ai->ai_protocol)
   1245 			return ai;
   1246 		ai = ai->ai_next;
   1247 	}
   1248 	return NULL;
   1249 }
   1250 static void
   1251 test_for_getaddrinfo_hacks(void)
   1252 {
   1253 	int r, r2;
   1254 	struct evutil_addrinfo *ai=NULL, *ai2=NULL, *ai3=NULL;
   1255 	struct evutil_addrinfo hints;
   1256 
   1257 	memset(&hints,0,sizeof(hints));
   1258 	hints.ai_family = PF_UNSPEC;
   1259 	hints.ai_flags =
   1260 #ifdef AI_NUMERICHOST
   1261 	    AI_NUMERICHOST |
   1262 #endif
   1263 #ifdef AI_NUMERICSERV
   1264 	    AI_NUMERICSERV |
   1265 #endif
   1266 	    0;
   1267 	r = getaddrinfo("1.2.3.4", "80", &hints, &ai);
   1268 	getaddrinfo("1.2.3.4", NULL, &hints, &ai3);
   1269 	hints.ai_socktype = SOCK_STREAM;
   1270 	r2 = getaddrinfo("1.2.3.4", "80", &hints, &ai2);
   1271 	if (r2 == 0 && r != 0) {
   1272 		need_numeric_port_hack_=1;
   1273 	}
   1274 	if (!ai_find_protocol(ai2) || !ai_find_protocol(ai3)) {
   1275 		need_socktype_protocol_hack_=1;
   1276 	}
   1277 
   1278 	if (ai)
   1279 		freeaddrinfo(ai);
   1280 	if (ai2)
   1281 		freeaddrinfo(ai2);
   1282 	if (ai3)
   1283 		freeaddrinfo(ai3);
   1284 	tested_for_getaddrinfo_hacks=1;
   1285 }
   1286 
   1287 static inline int
   1288 need_numeric_port_hack(void)
   1289 {
   1290 	if (!tested_for_getaddrinfo_hacks)
   1291 		test_for_getaddrinfo_hacks();
   1292 	return need_numeric_port_hack_;
   1293 }
   1294 
   1295 static inline int
   1296 need_socktype_protocol_hack(void)
   1297 {
   1298 	if (!tested_for_getaddrinfo_hacks)
   1299 		test_for_getaddrinfo_hacks();
   1300 	return need_socktype_protocol_hack_;
   1301 }
   1302 
   1303 static void
   1304 apply_numeric_port_hack(int port, struct evutil_addrinfo **ai)
   1305 {
   1306 	/* Now we run through the list and set the ports on all of the
   1307 	 * results where ports would make sense. */
   1308 	for ( ; *ai; ai = &(*ai)->ai_next) {
   1309 		struct sockaddr *sa = (*ai)->ai_addr;
   1310 		if (sa && sa->sa_family == AF_INET) {
   1311 			struct sockaddr_in *sin = (struct sockaddr_in*)sa;
   1312 			sin->sin_port = htons(port);
   1313 		} else if (sa && sa->sa_family == AF_INET6) {
   1314 			struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa;
   1315 			sin6->sin6_port = htons(port);
   1316 		} else {
   1317 			/* A numeric port makes no sense here; remove this one
   1318 			 * from the list. */
   1319 			struct evutil_addrinfo *victim = *ai;
   1320 			*ai = victim->ai_next;
   1321 			victim->ai_next = NULL;
   1322 			freeaddrinfo(victim);
   1323 		}
   1324 	}
   1325 }
   1326 
   1327 static int
   1328 apply_socktype_protocol_hack(struct evutil_addrinfo *ai)
   1329 {
   1330 	struct evutil_addrinfo *ai_new;
   1331 	for (; ai; ai = ai->ai_next) {
   1332 		evutil_getaddrinfo_infer_protocols(ai);
   1333 		if (ai->ai_socktype || ai->ai_protocol)
   1334 			continue;
   1335 		ai_new = mm_malloc(sizeof(*ai_new));
   1336 		if (!ai_new)
   1337 			return -1;
   1338 		memcpy(ai_new, ai, sizeof(*ai_new));
   1339 		ai->ai_socktype = SOCK_STREAM;
   1340 		ai->ai_protocol = IPPROTO_TCP;
   1341 		ai_new->ai_socktype = SOCK_DGRAM;
   1342 		ai_new->ai_protocol = IPPROTO_UDP;
   1343 
   1344 		ai_new->ai_next = ai->ai_next;
   1345 		ai->ai_next = ai_new;
   1346 	}
   1347 	return 0;
   1348 }
   1349 #endif
   1350 
   1351 int
   1352 evutil_getaddrinfo(const char *nodename, const char *servname,
   1353     const struct evutil_addrinfo *hints_in, struct evutil_addrinfo **res)
   1354 {
   1355 #ifdef USE_NATIVE_GETADDRINFO
   1356 	struct evutil_addrinfo hints;
   1357 	int portnum=-1, need_np_hack, err;
   1358 
   1359 	if (hints_in) {
   1360 		memcpy(&hints, hints_in, sizeof(hints));
   1361 	} else {
   1362 		memset(&hints, 0, sizeof(hints));
   1363 		hints.ai_family = PF_UNSPEC;
   1364 	}
   1365 
   1366 #ifndef AI_ADDRCONFIG
   1367 	/* Not every system has AI_ADDRCONFIG, so fake it. */
   1368 	if (hints.ai_family == PF_UNSPEC &&
   1369 	    (hints.ai_flags & EVUTIL_AI_ADDRCONFIG)) {
   1370 		evutil_adjust_hints_for_addrconfig_(&hints);
   1371 	}
   1372 #endif
   1373 
   1374 #ifndef AI_NUMERICSERV
   1375 	/* Not every system has AI_NUMERICSERV, so fake it. */
   1376 	if (hints.ai_flags & EVUTIL_AI_NUMERICSERV) {
   1377 		if (servname && parse_numeric_servname(servname)<0)
   1378 			return EVUTIL_EAI_NONAME;
   1379 	}
   1380 #endif
   1381 
   1382 	/* Enough operating systems handle enough common non-resolve
   1383 	 * cases here weirdly enough that we are better off just
   1384 	 * overriding them.  For example:
   1385 	 *
   1386 	 * - Windows doesn't like to infer the protocol from the
   1387 	 *   socket type, or fill in socket or protocol types much at
   1388 	 *   all.  It also seems to do its own broken implicit
   1389 	 *   always-on version of AI_ADDRCONFIG that keeps it from
   1390 	 *   ever resolving even a literal IPv6 address when
   1391 	 *   ai_addrtype is PF_UNSPEC.
   1392 	 */
   1393 #ifdef _WIN32
   1394 	{
   1395 		int tmp_port;
   1396 		err = evutil_getaddrinfo_common_(nodename,servname,&hints,
   1397 		    res, &tmp_port);
   1398 		if (err == 0 ||
   1399 		    err == EVUTIL_EAI_MEMORY ||
   1400 		    err == EVUTIL_EAI_NONAME)
   1401 			return err;
   1402 		/* If we make it here, the system getaddrinfo can
   1403 		 * have a crack at it. */
   1404 	}
   1405 #endif
   1406 
   1407 	/* See documentation for need_numeric_port_hack above.*/
   1408 	need_np_hack = need_numeric_port_hack() && servname && !hints.ai_socktype
   1409 	    && ((portnum=parse_numeric_servname(servname)) >= 0);
   1410 	if (need_np_hack) {
   1411 		if (!nodename)
   1412 			return evutil_getaddrinfo_common_(
   1413 				NULL,servname,&hints, res, &portnum);
   1414 		servname = NULL;
   1415 	}
   1416 
   1417 	if (need_socktype_protocol_hack()) {
   1418 		evutil_getaddrinfo_infer_protocols(&hints);
   1419 	}
   1420 
   1421 	/* Make sure that we didn't actually steal any AI_FLAGS values that
   1422 	 * the system is using.  (This is a constant expression, and should ge
   1423 	 * optimized out.)
   1424 	 *
   1425 	 * XXXX Turn this into a compile-time failure rather than a run-time
   1426 	 * failure.
   1427 	 */
   1428 	EVUTIL_ASSERT((ALL_NONNATIVE_AI_FLAGS & ALL_NATIVE_AI_FLAGS) == 0);
   1429 
   1430 	/* Clear any flags that only libevent understands. */
   1431 	hints.ai_flags &= ~ALL_NONNATIVE_AI_FLAGS;
   1432 
   1433 	err = getaddrinfo(nodename, servname, &hints, res);
   1434 	if (need_np_hack)
   1435 		apply_numeric_port_hack(portnum, res);
   1436 
   1437 	if (need_socktype_protocol_hack()) {
   1438 		if (apply_socktype_protocol_hack(*res) < 0) {
   1439 			evutil_freeaddrinfo(*res);
   1440 			*res = NULL;
   1441 			return EVUTIL_EAI_MEMORY;
   1442 		}
   1443 	}
   1444 	return err;
   1445 #else
   1446 	int port=0, err;
   1447 	struct hostent *ent = NULL;
   1448 	struct evutil_addrinfo hints;
   1449 
   1450 	if (hints_in) {
   1451 		memcpy(&hints, hints_in, sizeof(hints));
   1452 	} else {
   1453 		memset(&hints, 0, sizeof(hints));
   1454 		hints.ai_family = PF_UNSPEC;
   1455 	}
   1456 
   1457 	evutil_adjust_hints_for_addrconfig_(&hints);
   1458 
   1459 	err = evutil_getaddrinfo_common_(nodename, servname, &hints, res, &port);
   1460 	if (err != EVUTIL_EAI_NEED_RESOLVE) {
   1461 		/* We either succeeded or failed.  No need to continue */
   1462 		return err;
   1463 	}
   1464 
   1465 	err = 0;
   1466 	/* Use any of the various gethostbyname_r variants as available. */
   1467 	{
   1468 #ifdef EVENT__HAVE_GETHOSTBYNAME_R_6_ARG
   1469 		/* This one is what glibc provides. */
   1470 		char buf[2048];
   1471 		struct hostent hostent;
   1472 		int r;
   1473 		r = gethostbyname_r(nodename, &hostent, buf, sizeof(buf), &ent,
   1474 		    &err);
   1475 #elif defined(EVENT__HAVE_GETHOSTBYNAME_R_5_ARG)
   1476 		char buf[2048];
   1477 		struct hostent hostent;
   1478 		ent = gethostbyname_r(nodename, &hostent, buf, sizeof(buf),
   1479 		    &err);
   1480 #elif defined(EVENT__HAVE_GETHOSTBYNAME_R_3_ARG)
   1481 		struct hostent_data data;
   1482 		struct hostent hostent;
   1483 		memset(&data, 0, sizeof(data));
   1484 		err = gethostbyname_r(nodename, &hostent, &data);
   1485 		ent = err ? NULL : &hostent;
   1486 #else
   1487 		/* fall back to gethostbyname. */
   1488 		/* XXXX This needs a lock everywhere but Windows. */
   1489 		ent = gethostbyname(nodename);
   1490 #ifdef _WIN32
   1491 		err = WSAGetLastError();
   1492 #else
   1493 		err = h_errno;
   1494 #endif
   1495 #endif
   1496 
   1497 		/* Now we have either ent or err set. */
   1498 		if (!ent) {
   1499 			/* XXX is this right for windows ? */
   1500 			switch (err) {
   1501 			case TRY_AGAIN:
   1502 				return EVUTIL_EAI_AGAIN;
   1503 			case NO_RECOVERY:
   1504 			default:
   1505 				return EVUTIL_EAI_FAIL;
   1506 			case HOST_NOT_FOUND:
   1507 				return EVUTIL_EAI_NONAME;
   1508 			case NO_ADDRESS:
   1509 #if NO_DATA != NO_ADDRESS
   1510 			case NO_DATA:
   1511 #endif
   1512 				return EVUTIL_EAI_NODATA;
   1513 			}
   1514 		}
   1515 
   1516 		if (ent->h_addrtype != hints.ai_family &&
   1517 		    hints.ai_family != PF_UNSPEC) {
   1518 			/* This wasn't the type we were hoping for.  Too bad
   1519 			 * we never had a chance to ask gethostbyname for what
   1520 			 * we wanted. */
   1521 			return EVUTIL_EAI_NONAME;
   1522 		}
   1523 
   1524 		/* Make sure we got _some_ answers. */
   1525 		if (ent->h_length == 0)
   1526 			return EVUTIL_EAI_NODATA;
   1527 
   1528 		/* If we got an address type we don't know how to make a
   1529 		   sockaddr for, give up. */
   1530 		if (ent->h_addrtype != PF_INET && ent->h_addrtype != PF_INET6)
   1531 			return EVUTIL_EAI_FAMILY;
   1532 
   1533 		*res = addrinfo_from_hostent(ent, port, &hints);
   1534 		if (! *res)
   1535 			return EVUTIL_EAI_MEMORY;
   1536 	}
   1537 
   1538 	return 0;
   1539 #endif
   1540 }
   1541 
   1542 void
   1543 evutil_freeaddrinfo(struct evutil_addrinfo *ai)
   1544 {
   1545 #ifdef EVENT__HAVE_GETADDRINFO
   1546 	if (!(ai->ai_flags & EVUTIL_AI_LIBEVENT_ALLOCATED)) {
   1547 		freeaddrinfo(ai);
   1548 		return;
   1549 	}
   1550 #endif
   1551 	while (ai) {
   1552 		struct evutil_addrinfo *next = ai->ai_next;
   1553 		if (ai->ai_canonname)
   1554 			mm_free(ai->ai_canonname);
   1555 		mm_free(ai);
   1556 		ai = next;
   1557 	}
   1558 }
   1559 
   1560 static evdns_getaddrinfo_fn evdns_getaddrinfo_impl = NULL;
   1561 static evdns_getaddrinfo_cancel_fn evdns_getaddrinfo_cancel_impl = NULL;
   1562 
   1563 void
   1564 evutil_set_evdns_getaddrinfo_fn_(evdns_getaddrinfo_fn fn)
   1565 {
   1566 	if (!evdns_getaddrinfo_impl)
   1567 		evdns_getaddrinfo_impl = fn;
   1568 }
   1569 void
   1570 evutil_set_evdns_getaddrinfo_cancel_fn_(evdns_getaddrinfo_cancel_fn fn)
   1571 {
   1572 	if (!evdns_getaddrinfo_cancel_impl)
   1573 		evdns_getaddrinfo_cancel_impl = fn;
   1574 }
   1575 
   1576 /* Internal helper function: act like evdns_getaddrinfo if dns_base is set;
   1577  * otherwise do a blocking resolve and pass the result to the callback in the
   1578  * way that evdns_getaddrinfo would.
   1579  */
   1580 struct evdns_getaddrinfo_request *evutil_getaddrinfo_async_(
   1581     struct evdns_base *dns_base,
   1582     const char *nodename, const char *servname,
   1583     const struct evutil_addrinfo *hints_in,
   1584     void (*cb)(int, struct evutil_addrinfo *, void *), void *arg)
   1585 {
   1586 	if (dns_base && evdns_getaddrinfo_impl) {
   1587 		return evdns_getaddrinfo_impl(
   1588 			dns_base, nodename, servname, hints_in, cb, arg);
   1589 	} else {
   1590 		struct evutil_addrinfo *ai=NULL;
   1591 		int err;
   1592 		err = evutil_getaddrinfo(nodename, servname, hints_in, &ai);
   1593 		cb(err, ai, arg);
   1594 		return NULL;
   1595 	}
   1596 }
   1597 
   1598 void evutil_getaddrinfo_cancel_async_(struct evdns_getaddrinfo_request *data)
   1599 {
   1600 	if (evdns_getaddrinfo_cancel_impl && data) {
   1601 		evdns_getaddrinfo_cancel_impl(data);
   1602 	}
   1603 }
   1604 
   1605 const char *
   1606 evutil_gai_strerror(int err)
   1607 {
   1608 	/* As a sneaky side-benefit, this case statement will get most
   1609 	 * compilers to tell us if any of the error codes we defined
   1610 	 * conflict with the platform's native error codes. */
   1611 	switch (err) {
   1612 	case EVUTIL_EAI_CANCEL:
   1613 		return "Request canceled";
   1614 	case 0:
   1615 		return "No error";
   1616 
   1617 	case EVUTIL_EAI_ADDRFAMILY:
   1618 		return "address family for nodename not supported";
   1619 	case EVUTIL_EAI_AGAIN:
   1620 		return "temporary failure in name resolution";
   1621 	case EVUTIL_EAI_BADFLAGS:
   1622 		return "invalid value for ai_flags";
   1623 	case EVUTIL_EAI_FAIL:
   1624 		return "non-recoverable failure in name resolution";
   1625 	case EVUTIL_EAI_FAMILY:
   1626 		return "ai_family not supported";
   1627 	case EVUTIL_EAI_MEMORY:
   1628 		return "memory allocation failure";
   1629 	case EVUTIL_EAI_NODATA:
   1630 		return "no address associated with nodename";
   1631 	case EVUTIL_EAI_NONAME:
   1632 		return "nodename nor servname provided, or not known";
   1633 	case EVUTIL_EAI_SERVICE:
   1634 		return "servname not supported for ai_socktype";
   1635 	case EVUTIL_EAI_SOCKTYPE:
   1636 		return "ai_socktype not supported";
   1637 	case EVUTIL_EAI_SYSTEM:
   1638 		return "system error";
   1639 	default:
   1640 #if defined(USE_NATIVE_GETADDRINFO) && defined(_WIN32)
   1641 		return gai_strerrorA(err);
   1642 #elif defined(USE_NATIVE_GETADDRINFO)
   1643 		return gai_strerror(err);
   1644 #else
   1645 		return "Unknown error code";
   1646 #endif
   1647 	}
   1648 }
   1649 
   1650 #ifdef _WIN32
   1651 /* destructively remove a trailing line terminator from s */
   1652 static void
   1653 chomp (char *s)
   1654 {
   1655 	size_t len;
   1656 	if (s && (len = strlen (s)) > 0 && s[len - 1] == '\n') {
   1657 		s[--len] = 0;
   1658 		if (len > 0 && s[len - 1] == '\r')
   1659 			s[--len] = 0;
   1660 	}
   1661 }
   1662 
   1663 /* FormatMessage returns allocated strings, but evutil_socket_error_to_string
   1664  * is supposed to return a string which is good indefinitely without having
   1665  * to be freed.  To make this work without leaking memory, we cache the
   1666  * string the first time FormatMessage is called on a particular error
   1667  * code, and then return the cached string on subsequent calls with the
   1668  * same code.  The strings aren't freed until libevent_global_shutdown
   1669  * (or never).  We use a linked list to cache the errors, because we
   1670  * only expect there to be a few dozen, and that should be fast enough.
   1671  */
   1672 
   1673 struct cached_sock_errs_entry {
   1674 	HT_ENTRY(cached_sock_errs_entry) node;
   1675 	DWORD code;
   1676 	char *msg; /* allocated with LocalAlloc; free with LocalFree */
   1677 };
   1678 
   1679 static inline unsigned
   1680 hash_cached_sock_errs(const struct cached_sock_errs_entry *e)
   1681 {
   1682 	/* Use Murmur3's 32-bit finalizer as an integer hash function */
   1683 	DWORD h = e->code;
   1684 	h ^= h >> 16;
   1685 	h *= 0x85ebca6b;
   1686 	h ^= h >> 13;
   1687 	h *= 0xc2b2ae35;
   1688 	h ^= h >> 16;
   1689 	return h;
   1690 }
   1691 
   1692 static inline int
   1693 eq_cached_sock_errs(const struct cached_sock_errs_entry *a,
   1694 		    const struct cached_sock_errs_entry *b)
   1695 {
   1696 	return a->code == b->code;
   1697 }
   1698 
   1699 #ifndef EVENT__DISABLE_THREAD_SUPPORT
   1700 static void *windows_socket_errors_lock_ = NULL;
   1701 #endif
   1702 
   1703 static HT_HEAD(cached_sock_errs_map, cached_sock_errs_entry)
   1704      windows_socket_errors = HT_INITIALIZER();
   1705 
   1706 HT_PROTOTYPE(cached_sock_errs_map,
   1707 	     cached_sock_errs_entry,
   1708 	     node,
   1709 	     hash_cached_sock_errs,
   1710 	     eq_cached_sock_errs);
   1711 
   1712 HT_GENERATE(cached_sock_errs_map,
   1713 	    cached_sock_errs_entry,
   1714 	    node,
   1715 	    hash_cached_sock_errs,
   1716 	    eq_cached_sock_errs,
   1717 	    0.5,
   1718 	    mm_malloc,
   1719 	    mm_realloc,
   1720 	    mm_free);
   1721 
   1722 /** Equivalent to strerror, but for windows socket errors. */
   1723 const char *
   1724 evutil_socket_error_to_string(int errcode)
   1725 {
   1726 	struct cached_sock_errs_entry *errs, *newerr, find;
   1727 	char *msg = NULL;
   1728 
   1729 	EVLOCK_LOCK(windows_socket_errors_lock_, 0);
   1730 
   1731 	find.code = errcode;
   1732 	errs = HT_FIND(cached_sock_errs_map, &windows_socket_errors, &find);
   1733 	if (errs) {
   1734 		msg = errs->msg;
   1735 		goto done;
   1736 	}
   1737 
   1738 	if (0 != FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
   1739 			       FORMAT_MESSAGE_IGNORE_INSERTS |
   1740 			       FORMAT_MESSAGE_ALLOCATE_BUFFER,
   1741 			       NULL, errcode, 0, (char *)&msg, 0, NULL))
   1742 		chomp (msg);	/* because message has trailing newline */
   1743 	else {
   1744 		size_t len = 50;
   1745 		/* use LocalAlloc because FormatMessage does */
   1746 		msg = LocalAlloc(LMEM_FIXED, len);
   1747 		if (!msg) {
   1748 			msg = (char *)"LocalAlloc failed during Winsock error";
   1749 			goto done;
   1750 		}
   1751 		evutil_snprintf(msg, len, "winsock error 0x%08x", errcode);
   1752 	}
   1753 
   1754 	newerr = (struct cached_sock_errs_entry *)
   1755 		mm_malloc(sizeof (struct cached_sock_errs_entry));
   1756 
   1757 	if (!newerr) {
   1758 		LocalFree(msg);
   1759 		msg = (char *)"malloc failed during Winsock error";
   1760 		goto done;
   1761 	}
   1762 
   1763 	newerr->code = errcode;
   1764 	newerr->msg = msg;
   1765 	HT_INSERT(cached_sock_errs_map, &windows_socket_errors, newerr);
   1766 
   1767  done:
   1768 	EVLOCK_UNLOCK(windows_socket_errors_lock_, 0);
   1769 
   1770 	return msg;
   1771 }
   1772 
   1773 #ifndef EVENT__DISABLE_THREAD_SUPPORT
   1774 int
   1775 evutil_global_setup_locks_(const int enable_locks)
   1776 {
   1777 	EVTHREAD_SETUP_GLOBAL_LOCK(windows_socket_errors_lock_, 0);
   1778 	return 0;
   1779 }
   1780 #endif
   1781 
   1782 static void
   1783 evutil_free_sock_err_globals(void)
   1784 {
   1785 	struct cached_sock_errs_entry **errs, *tofree;
   1786 
   1787 	for (errs = HT_START(cached_sock_errs_map, &windows_socket_errors)
   1788 		     ; errs; ) {
   1789 		tofree = *errs;
   1790 		errs = HT_NEXT_RMV(cached_sock_errs_map,
   1791 				   &windows_socket_errors,
   1792 				   errs);
   1793 		LocalFree(tofree->msg);
   1794 		mm_free(tofree);
   1795 	}
   1796 
   1797 	HT_CLEAR(cached_sock_errs_map, &windows_socket_errors);
   1798 
   1799 #ifndef EVENT__DISABLE_THREAD_SUPPORT
   1800 	if (windows_socket_errors_lock_ != NULL) {
   1801 		EVTHREAD_FREE_LOCK(windows_socket_errors_lock_, 0);
   1802 		windows_socket_errors_lock_ = NULL;
   1803 	}
   1804 #endif
   1805 }
   1806 
   1807 #else
   1808 
   1809 #ifndef EVENT__DISABLE_THREAD_SUPPORT
   1810 int
   1811 evutil_global_setup_locks_(const int enable_locks)
   1812 {
   1813 	return 0;
   1814 }
   1815 #endif
   1816 
   1817 static void
   1818 evutil_free_sock_err_globals(void)
   1819 {
   1820 }
   1821 
   1822 #endif
   1823 
   1824 int
   1825 evutil_snprintf(char *buf, size_t buflen, const char *format, ...)
   1826 {
   1827 	int r;
   1828 	va_list ap;
   1829 	va_start(ap, format);
   1830 	r = evutil_vsnprintf(buf, buflen, format, ap);
   1831 	va_end(ap);
   1832 	return r;
   1833 }
   1834 
   1835 int
   1836 evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap)
   1837 {
   1838 	int r;
   1839 	if (!buflen)
   1840 		return 0;
   1841 #if defined(_MSC_VER) || defined(_WIN32)
   1842 	r = _vsnprintf(buf, buflen, format, ap);
   1843 	if (r < 0)
   1844 		r = _vscprintf(format, ap);
   1845 #elif defined(sgi)
   1846 	/* Make sure we always use the correct vsnprintf on IRIX */
   1847 	extern int      _xpg5_vsnprintf(char * __restrict,
   1848 		__SGI_LIBC_NAMESPACE_QUALIFIER size_t,
   1849 		const char * __restrict, /* va_list */ char *);
   1850 
   1851 	r = _xpg5_vsnprintf(buf, buflen, format, ap);
   1852 #else
   1853 	r = vsnprintf(buf, buflen, format, ap);
   1854 #endif
   1855 	buf[buflen-1] = '\0';
   1856 	return r;
   1857 }
   1858 
   1859 #define USE_INTERNAL_NTOP
   1860 #define USE_INTERNAL_PTON
   1861 
   1862 const char *
   1863 evutil_inet_ntop(int af, const void *src, char *dst, size_t len)
   1864 {
   1865 #if defined(EVENT__HAVE_INET_NTOP) && !defined(USE_INTERNAL_NTOP)
   1866 	return inet_ntop(af, src, dst, len);
   1867 #else
   1868 	if (af == AF_INET) {
   1869 		const struct in_addr *in = src;
   1870 		const ev_uint32_t a = ntohl(in->s_addr);
   1871 		int r;
   1872 		r = evutil_snprintf(dst, len, "%d.%d.%d.%d",
   1873 		    (int)(ev_uint8_t)((a>>24)&0xff),
   1874 		    (int)(ev_uint8_t)((a>>16)&0xff),
   1875 		    (int)(ev_uint8_t)((a>>8 )&0xff),
   1876 		    (int)(ev_uint8_t)((a    )&0xff));
   1877 		if (r<0||(size_t)r>=len)
   1878 			return NULL;
   1879 		else
   1880 			return dst;
   1881 #ifdef AF_INET6
   1882 	} else if (af == AF_INET6) {
   1883 		const struct in6_addr *addr = src;
   1884 		char buf[64], *cp;
   1885 		int longestGapLen = 0, longestGapPos = -1, i,
   1886 			curGapPos = -1, curGapLen = 0;
   1887 		ev_uint16_t words[8];
   1888 		for (i = 0; i < 8; ++i) {
   1889 			words[i] =
   1890 			    (((ev_uint16_t)addr->s6_addr[2*i])<<8) + addr->s6_addr[2*i+1];
   1891 		}
   1892 		if (words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 &&
   1893 		    words[4] == 0 && ((words[5] == 0 && words[6] && words[7]) ||
   1894 			(words[5] == 0xffff))) {
   1895 			/* This is an IPv4 address. */
   1896 			if (words[5] == 0) {
   1897 				evutil_snprintf(buf, sizeof(buf), "::%d.%d.%d.%d",
   1898 				    addr->s6_addr[12], addr->s6_addr[13],
   1899 				    addr->s6_addr[14], addr->s6_addr[15]);
   1900 			} else {
   1901 				evutil_snprintf(buf, sizeof(buf), "::%x:%d.%d.%d.%d", words[5],
   1902 				    addr->s6_addr[12], addr->s6_addr[13],
   1903 				    addr->s6_addr[14], addr->s6_addr[15]);
   1904 			}
   1905 			if (strlen(buf) > len)
   1906 				return NULL;
   1907 			strlcpy(dst, buf, len);
   1908 			return dst;
   1909 		}
   1910 		i = 0;
   1911 		while (i < 8) {
   1912 			if (words[i] == 0) {
   1913 				curGapPos = i++;
   1914 				curGapLen = 1;
   1915 				while (i<8 && words[i] == 0) {
   1916 					++i; ++curGapLen;
   1917 				}
   1918 				if (curGapLen > longestGapLen) {
   1919 					longestGapPos = curGapPos;
   1920 					longestGapLen = curGapLen;
   1921 				}
   1922 			} else {
   1923 				++i;
   1924 			}
   1925 		}
   1926 		if (longestGapLen<=1)
   1927 			longestGapPos = -1;
   1928 
   1929 		cp = buf;
   1930 		for (i = 0; i < 8; ++i) {
   1931 			if (words[i] == 0 && longestGapPos == i) {
   1932 				if (i == 0)
   1933 					*cp++ = ':';
   1934 				*cp++ = ':';
   1935 				while (i < 8 && words[i] == 0)
   1936 					++i;
   1937 				--i; /* to compensate for loop increment. */
   1938 			} else {
   1939 				evutil_snprintf(cp,
   1940 								sizeof(buf)-(cp-buf), "%x", (unsigned)words[i]);
   1941 				cp += strlen(cp);
   1942 				if (i != 7)
   1943 					*cp++ = ':';
   1944 			}
   1945 		}
   1946 		*cp = '\0';
   1947 		if (strlen(buf) > len)
   1948 			return NULL;
   1949 		strlcpy(dst, buf, len);
   1950 		return dst;
   1951 #endif
   1952 	} else {
   1953 		return NULL;
   1954 	}
   1955 #endif
   1956 }
   1957 
   1958 int
   1959 evutil_inet_pton(int af, const char *src, void *dst)
   1960 {
   1961 #if defined(EVENT__HAVE_INET_PTON) && !defined(USE_INTERNAL_PTON)
   1962 	return inet_pton(af, src, dst);
   1963 #else
   1964 	if (af == AF_INET) {
   1965 		unsigned a,b,c,d;
   1966 		char more;
   1967 		struct in_addr *addr = dst;
   1968 		if (sscanf(src, "%u.%u.%u.%u%c", &a,&b,&c,&d,&more) != 4)
   1969 			return 0;
   1970 		if (a > 255) return 0;
   1971 		if (b > 255) return 0;
   1972 		if (c > 255) return 0;
   1973 		if (d > 255) return 0;
   1974 		addr->s_addr = htonl((a<<24) | (b<<16) | (c<<8) | d);
   1975 		return 1;
   1976 #ifdef AF_INET6
   1977 	} else if (af == AF_INET6) {
   1978 		struct in6_addr *out = dst;
   1979 		ev_uint16_t words[8];
   1980 		int gapPos = -1, i, setWords=0;
   1981 		const char *dot = strchr(src, '.');
   1982 		const char *eow; /* end of words. */
   1983 		if (dot == src)
   1984 			return 0;
   1985 		else if (!dot)
   1986 			eow = src+strlen(src);
   1987 		else {
   1988 			unsigned byte1,byte2,byte3,byte4;
   1989 			char more;
   1990 			for (eow = dot-1; eow >= src && EVUTIL_ISDIGIT_(*eow); --eow)
   1991 				;
   1992 			++eow;
   1993 
   1994 			/* We use "scanf" because some platform inet_aton()s are too lax
   1995 			 * about IPv4 addresses of the form "1.2.3" */
   1996 			if (sscanf(eow, "%u.%u.%u.%u%c",
   1997 					   &byte1,&byte2,&byte3,&byte4,&more) != 4)
   1998 				return 0;
   1999 
   2000 			if (byte1 > 255 ||
   2001 			    byte2 > 255 ||
   2002 			    byte3 > 255 ||
   2003 			    byte4 > 255)
   2004 				return 0;
   2005 
   2006 			words[6] = (byte1<<8) | byte2;
   2007 			words[7] = (byte3<<8) | byte4;
   2008 			setWords += 2;
   2009 		}
   2010 
   2011 		i = 0;
   2012 		while (src < eow) {
   2013 			if (i > 7)
   2014 				return 0;
   2015 			if (EVUTIL_ISXDIGIT_(*src)) {
   2016 				char *next;
   2017 				long r = strtol(src, &next, 16);
   2018 				if (next > 4+src)
   2019 					return 0;
   2020 				if (next == src)
   2021 					return 0;
   2022 				if (r<0 || r>65536)
   2023 					return 0;
   2024 
   2025 				words[i++] = (ev_uint16_t)r;
   2026 				setWords++;
   2027 				src = next;
   2028 				if (*src != ':' && src != eow)
   2029 					return 0;
   2030 				++src;
   2031 			} else if (*src == ':' && i > 0 && gapPos==-1) {
   2032 				gapPos = i;
   2033 				++src;
   2034 			} else if (*src == ':' && i == 0 && src[1] == ':' && gapPos==-1) {
   2035 				gapPos = i;
   2036 				src += 2;
   2037 			} else {
   2038 				return 0;
   2039 			}
   2040 		}
   2041 
   2042 		if (setWords > 8 ||
   2043 			(setWords == 8 && gapPos != -1) ||
   2044 			(setWords < 8 && gapPos == -1))
   2045 			return 0;
   2046 
   2047 		if (gapPos >= 0) {
   2048 			int nToMove = setWords - (dot ? 2 : 0) - gapPos;
   2049 			int gapLen = 8 - setWords;
   2050 			/* assert(nToMove >= 0); */
   2051 			if (nToMove < 0)
   2052 				return -1; /* should be impossible */
   2053 			memmove(&words[gapPos+gapLen], &words[gapPos],
   2054 					sizeof(ev_uint16_t)*nToMove);
   2055 			memset(&words[gapPos], 0, sizeof(ev_uint16_t)*gapLen);
   2056 		}
   2057 		for (i = 0; i < 8; ++i) {
   2058 			out->s6_addr[2*i  ] = words[i] >> 8;
   2059 			out->s6_addr[2*i+1] = words[i] & 0xff;
   2060 		}
   2061 
   2062 		return 1;
   2063 #endif
   2064 	} else {
   2065 		return -1;
   2066 	}
   2067 #endif
   2068 }
   2069 
   2070 int
   2071 evutil_parse_sockaddr_port(const char *ip_as_string, struct sockaddr *out, int *outlen)
   2072 {
   2073 	int port;
   2074 	char buf[128];
   2075 	const char *cp, *addr_part, *port_part;
   2076 	int is_ipv6;
   2077 	/* recognized formats are:
   2078 	 * [ipv6]:port
   2079 	 * ipv6
   2080 	 * [ipv6]
   2081 	 * ipv4:port
   2082 	 * ipv4
   2083 	 */
   2084 
   2085 	cp = strchr(ip_as_string, ':');
   2086 	if (*ip_as_string == '[') {
   2087 		size_t len;
   2088 		if (!(cp = strchr(ip_as_string, ']'))) {
   2089 			return -1;
   2090 		}
   2091 		len = ( cp-(ip_as_string + 1) );
   2092 		if (len > sizeof(buf)-1) {
   2093 			return -1;
   2094 		}
   2095 		memcpy(buf, ip_as_string+1, len);
   2096 		buf[len] = '\0';
   2097 		addr_part = buf;
   2098 		if (cp[1] == ':')
   2099 			port_part = cp+2;
   2100 		else
   2101 			port_part = NULL;
   2102 		is_ipv6 = 1;
   2103 	} else if (cp && strchr(cp+1, ':')) {
   2104 		is_ipv6 = 1;
   2105 		addr_part = ip_as_string;
   2106 		port_part = NULL;
   2107 	} else if (cp) {
   2108 		is_ipv6 = 0;
   2109 		if (cp - ip_as_string > (int)sizeof(buf)-1) {
   2110 			return -1;
   2111 		}
   2112 		memcpy(buf, ip_as_string, cp-ip_as_string);
   2113 		buf[cp-ip_as_string] = '\0';
   2114 		addr_part = buf;
   2115 		port_part = cp+1;
   2116 	} else {
   2117 		addr_part = ip_as_string;
   2118 		port_part = NULL;
   2119 		is_ipv6 = 0;
   2120 	}
   2121 
   2122 	if (port_part == NULL) {
   2123 		port = 0;
   2124 	} else {
   2125 		port = atoi(port_part);
   2126 		if (port <= 0 || port > 65535) {
   2127 			return -1;
   2128 		}
   2129 	}
   2130 
   2131 	if (!addr_part)
   2132 		return -1; /* Should be impossible. */
   2133 #ifdef AF_INET6
   2134 	if (is_ipv6)
   2135 	{
   2136 		struct sockaddr_in6 sin6;
   2137 		memset(&sin6, 0, sizeof(sin6));
   2138 #ifdef EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
   2139 		sin6.sin6_len = sizeof(sin6);
   2140 #endif
   2141 		sin6.sin6_family = AF_INET6;
   2142 		sin6.sin6_port = htons(port);
   2143 		if (1 != evutil_inet_pton(AF_INET6, addr_part, &sin6.sin6_addr))
   2144 			return -1;
   2145 		if ((int)sizeof(sin6) > *outlen)
   2146 			return -1;
   2147 		memset(out, 0, *outlen);
   2148 		memcpy(out, &sin6, sizeof(sin6));
   2149 		*outlen = sizeof(sin6);
   2150 		return 0;
   2151 	}
   2152 	else
   2153 #endif
   2154 	{
   2155 		struct sockaddr_in sin;
   2156 		memset(&sin, 0, sizeof(sin));
   2157 #ifdef EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
   2158 		sin.sin_len = sizeof(sin);
   2159 #endif
   2160 		sin.sin_family = AF_INET;
   2161 		sin.sin_port = htons(port);
   2162 		if (1 != evutil_inet_pton(AF_INET, addr_part, &sin.sin_addr))
   2163 			return -1;
   2164 		if ((int)sizeof(sin) > *outlen)
   2165 			return -1;
   2166 		memset(out, 0, *outlen);
   2167 		memcpy(out, &sin, sizeof(sin));
   2168 		*outlen = sizeof(sin);
   2169 		return 0;
   2170 	}
   2171 }
   2172 
   2173 const char *
   2174 evutil_format_sockaddr_port_(const struct sockaddr *sa, char *out, size_t outlen)
   2175 {
   2176 	char b[128];
   2177 	const char *res=NULL;
   2178 	int port;
   2179 	if (sa->sa_family == AF_INET) {
   2180 		const struct sockaddr_in *sin = (const struct sockaddr_in*)sa;
   2181 		res = evutil_inet_ntop(AF_INET, &sin->sin_addr,b,sizeof(b));
   2182 		port = ntohs(sin->sin_port);
   2183 		if (res) {
   2184 			evutil_snprintf(out, outlen, "%s:%d", b, port);
   2185 			return out;
   2186 		}
   2187 	} else if (sa->sa_family == AF_INET6) {
   2188 		const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6*)sa;
   2189 		res = evutil_inet_ntop(AF_INET6, &sin6->sin6_addr,b,sizeof(b));
   2190 		port = ntohs(sin6->sin6_port);
   2191 		if (res) {
   2192 			evutil_snprintf(out, outlen, "[%s]:%d", b, port);
   2193 			return out;
   2194 		}
   2195 	}
   2196 
   2197 	evutil_snprintf(out, outlen, "<addr with socktype %d>",
   2198 	    (int)sa->sa_family);
   2199 	return out;
   2200 }
   2201 
   2202 int
   2203 evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2,
   2204     int include_port)
   2205 {
   2206 	int r;
   2207 	if (0 != (r = (sa1->sa_family - sa2->sa_family)))
   2208 		return r;
   2209 
   2210 	if (sa1->sa_family == AF_INET) {
   2211 		const struct sockaddr_in *sin1, *sin2;
   2212 		sin1 = (const struct sockaddr_in *)sa1;
   2213 		sin2 = (const struct sockaddr_in *)sa2;
   2214 		if (sin1->sin_addr.s_addr < sin2->sin_addr.s_addr)
   2215 			return -1;
   2216 		else if (sin1->sin_addr.s_addr > sin2->sin_addr.s_addr)
   2217 			return 1;
   2218 		else if (include_port &&
   2219 		    (r = ((int)sin1->sin_port - (int)sin2->sin_port)))
   2220 			return r;
   2221 		else
   2222 			return 0;
   2223 	}
   2224 #ifdef AF_INET6
   2225 	else if (sa1->sa_family == AF_INET6) {
   2226 		const struct sockaddr_in6 *sin1, *sin2;
   2227 		sin1 = (const struct sockaddr_in6 *)sa1;
   2228 		sin2 = (const struct sockaddr_in6 *)sa2;
   2229 		if ((r = memcmp(sin1->sin6_addr.s6_addr, sin2->sin6_addr.s6_addr, 16)))
   2230 			return r;
   2231 		else if (include_port &&
   2232 		    (r = ((int)sin1->sin6_port - (int)sin2->sin6_port)))
   2233 			return r;
   2234 		else
   2235 			return 0;
   2236 	}
   2237 #endif
   2238 	return 1;
   2239 }
   2240 
   2241 /* Tables to implement ctypes-replacement EVUTIL_IS*() functions.  Each table
   2242  * has 256 bits to look up whether a character is in some set or not.  This
   2243  * fails on non-ASCII platforms, but so does every other place where we
   2244  * take a char and write it onto the network.
   2245  **/
   2246 static const ev_uint32_t EVUTIL_ISALPHA_TABLE[8] =
   2247   { 0, 0, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 };
   2248 static const ev_uint32_t EVUTIL_ISALNUM_TABLE[8] =
   2249   { 0, 0x3ff0000, 0x7fffffe, 0x7fffffe, 0, 0, 0, 0 };
   2250 static const ev_uint32_t EVUTIL_ISSPACE_TABLE[8] = { 0x3e00, 0x1, 0, 0, 0, 0, 0, 0 };
   2251 static const ev_uint32_t EVUTIL_ISXDIGIT_TABLE[8] =
   2252   { 0, 0x3ff0000, 0x7e, 0x7e, 0, 0, 0, 0 };
   2253 static const ev_uint32_t EVUTIL_ISDIGIT_TABLE[8] = { 0, 0x3ff0000, 0, 0, 0, 0, 0, 0 };
   2254 static const ev_uint32_t EVUTIL_ISPRINT_TABLE[8] =
   2255   { 0, 0xffffffff, 0xffffffff, 0x7fffffff, 0, 0, 0, 0x0 };
   2256 static const ev_uint32_t EVUTIL_ISUPPER_TABLE[8] = { 0, 0, 0x7fffffe, 0, 0, 0, 0, 0 };
   2257 static const ev_uint32_t EVUTIL_ISLOWER_TABLE[8] = { 0, 0, 0, 0x7fffffe, 0, 0, 0, 0 };
   2258 /* Upper-casing and lowercasing tables to map characters to upper/lowercase
   2259  * equivalents. */
   2260 static const unsigned char EVUTIL_TOUPPER_TABLE[256] = {
   2261   0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
   2262   16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
   2263   32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
   2264   48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
   2265   64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
   2266   80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
   2267   96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
   2268   80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,
   2269   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
   2270   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
   2271   160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
   2272   176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
   2273   192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
   2274   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
   2275   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
   2276   240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
   2277 };
   2278 static const unsigned char EVUTIL_TOLOWER_TABLE[256] = {
   2279   0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
   2280   16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
   2281   32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
   2282   48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
   2283   64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
   2284   112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,
   2285   96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
   2286   112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
   2287   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
   2288   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
   2289   160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
   2290   176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
   2291   192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
   2292   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
   2293   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
   2294   240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
   2295 };
   2296 
   2297 #define IMPL_CTYPE_FN(name)						\
   2298 	int EVUTIL_##name##_(char c) {					\
   2299 		ev_uint8_t u = c;					\
   2300 		return !!(EVUTIL_##name##_TABLE[(u >> 5) & 7] & (1 << (u & 31))); \
   2301 	}
   2302 IMPL_CTYPE_FN(ISALPHA)
   2303 IMPL_CTYPE_FN(ISALNUM)
   2304 IMPL_CTYPE_FN(ISSPACE)
   2305 IMPL_CTYPE_FN(ISDIGIT)
   2306 IMPL_CTYPE_FN(ISXDIGIT)
   2307 IMPL_CTYPE_FN(ISPRINT)
   2308 IMPL_CTYPE_FN(ISLOWER)
   2309 IMPL_CTYPE_FN(ISUPPER)
   2310 
   2311 char EVUTIL_TOLOWER_(char c)
   2312 {
   2313 	return ((char)EVUTIL_TOLOWER_TABLE[(ev_uint8_t)c]);
   2314 }
   2315 char EVUTIL_TOUPPER_(char c)
   2316 {
   2317 	return ((char)EVUTIL_TOUPPER_TABLE[(ev_uint8_t)c]);
   2318 }
   2319 int
   2320 evutil_ascii_strcasecmp(const char *s1, const char *s2)
   2321 {
   2322 	char c1, c2;
   2323 	while (1) {
   2324 		c1 = EVUTIL_TOLOWER_(*s1++);
   2325 		c2 = EVUTIL_TOLOWER_(*s2++);
   2326 		if (c1 < c2)
   2327 			return -1;
   2328 		else if (c1 > c2)
   2329 			return 1;
   2330 		else if (c1 == 0)
   2331 			return 0;
   2332 	}
   2333 }
   2334 int evutil_ascii_strncasecmp(const char *s1, const char *s2, size_t n)
   2335 {
   2336 	char c1, c2;
   2337 	while (n--) {
   2338 		c1 = EVUTIL_TOLOWER_(*s1++);
   2339 		c2 = EVUTIL_TOLOWER_(*s2++);
   2340 		if (c1 < c2)
   2341 			return -1;
   2342 		else if (c1 > c2)
   2343 			return 1;
   2344 		else if (c1 == 0)
   2345 			return 0;
   2346 	}
   2347 	return 0;
   2348 }
   2349 
   2350 void
   2351 evutil_rtrim_lws_(char *str)
   2352 {
   2353 	char *cp;
   2354 
   2355 	if (str == NULL)
   2356 		return;
   2357 
   2358 	if ((cp = strchr(str, '\0')) == NULL || (cp == str))
   2359 		return;
   2360 
   2361 	--cp;
   2362 
   2363 	while (*cp == ' ' || *cp == '\t') {
   2364 		*cp = '\0';
   2365 		if (cp == str)
   2366 			break;
   2367 		--cp;
   2368 	}
   2369 }
   2370 
   2371 static int
   2372 evutil_issetugid(void)
   2373 {
   2374 #ifdef EVENT__HAVE_ISSETUGID
   2375 	return issetugid();
   2376 #else
   2377 
   2378 #ifdef EVENT__HAVE_GETEUID
   2379 	if (getuid() != geteuid())
   2380 		return 1;
   2381 #endif
   2382 #ifdef EVENT__HAVE_GETEGID
   2383 	if (getgid() != getegid())
   2384 		return 1;
   2385 #endif
   2386 	return 0;
   2387 #endif
   2388 }
   2389 
   2390 const char *
   2391 evutil_getenv_(const char *varname)
   2392 {
   2393 	if (evutil_issetugid())
   2394 		return NULL;
   2395 
   2396 	return getenv(varname);
   2397 }
   2398 
   2399 ev_uint32_t
   2400 evutil_weakrand_seed_(struct evutil_weakrand_state *state, ev_uint32_t seed)
   2401 {
   2402 	if (seed == 0) {
   2403 		struct timeval tv;
   2404 		evutil_gettimeofday(&tv, NULL);
   2405 		seed = (ev_uint32_t)tv.tv_sec + (ev_uint32_t)tv.tv_usec;
   2406 #ifdef _WIN32
   2407 		seed += (ev_uint32_t) _getpid();
   2408 #else
   2409 		seed += (ev_uint32_t) getpid();
   2410 #endif
   2411 	}
   2412 	state->seed = seed;
   2413 	return seed;
   2414 }
   2415 
   2416 ev_int32_t
   2417 evutil_weakrand_(struct evutil_weakrand_state *state)
   2418 {
   2419 	/* This RNG implementation is a linear congruential generator, with
   2420 	 * modulus 2^31, multiplier 1103515245, and addend 12345.  It's also
   2421 	 * used by OpenBSD, and by Glibc's TYPE_0 RNG.
   2422 	 *
   2423 	 * The linear congruential generator is not an industrial-strength
   2424 	 * RNG!  It's fast, but it can have higher-order patterns.  Notably,
   2425 	 * the low bits tend to have periodicity.
   2426 	 */
   2427 	state->seed = ((state->seed) * 1103515245 + 12345) & 0x7fffffff;
   2428 	return (ev_int32_t)(state->seed);
   2429 }
   2430 
   2431 ev_int32_t
   2432 evutil_weakrand_range_(struct evutil_weakrand_state *state, ev_int32_t top)
   2433 {
   2434 	ev_int32_t divisor, result;
   2435 
   2436 	/* We can't just do weakrand() % top, since the low bits of the LCG
   2437 	 * are less random than the high ones.  (Specifically, since the LCG
   2438 	 * modulus is 2^N, every 2^m for m<N will divide the modulus, and so
   2439 	 * therefore the low m bits of the LCG will have period 2^m.) */
   2440 	divisor = EVUTIL_WEAKRAND_MAX / top;
   2441 	do {
   2442 		result = evutil_weakrand_(state) / divisor;
   2443 	} while (result >= top);
   2444 	return result;
   2445 }
   2446 
   2447 /**
   2448  * Volatile pointer to memset: we use this to keep the compiler from
   2449  * eliminating our call to memset.
   2450  */
   2451 void * (*volatile evutil_memset_volatile_)(void *, int, size_t) = memset;
   2452 
   2453 void
   2454 evutil_memclear_(void *mem, size_t len)
   2455 {
   2456 	evutil_memset_volatile_(mem, 0, len);
   2457 }
   2458 
   2459 int
   2460 evutil_sockaddr_is_loopback_(const struct sockaddr *addr)
   2461 {
   2462 	static const char LOOPBACK_S6[16] =
   2463 	    "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1";
   2464 	if (addr->sa_family == AF_INET) {
   2465 		struct sockaddr_in *sin = (struct sockaddr_in *)addr;
   2466 		return (ntohl(sin->sin_addr.s_addr) & 0xff000000) == 0x7f000000;
   2467 	} else if (addr->sa_family == AF_INET6) {
   2468 		struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
   2469 		return !memcmp(sin6->sin6_addr.s6_addr, LOOPBACK_S6, 16);
   2470 	}
   2471 	return 0;
   2472 }
   2473 
   2474 int
   2475 evutil_hex_char_to_int_(char c)
   2476 {
   2477 	switch(c)
   2478 	{
   2479 		case '0': return 0;
   2480 		case '1': return 1;
   2481 		case '2': return 2;
   2482 		case '3': return 3;
   2483 		case '4': return 4;
   2484 		case '5': return 5;
   2485 		case '6': return 6;
   2486 		case '7': return 7;
   2487 		case '8': return 8;
   2488 		case '9': return 9;
   2489 		case 'A': case 'a': return 10;
   2490 		case 'B': case 'b': return 11;
   2491 		case 'C': case 'c': return 12;
   2492 		case 'D': case 'd': return 13;
   2493 		case 'E': case 'e': return 14;
   2494 		case 'F': case 'f': return 15;
   2495 	}
   2496 	return -1;
   2497 }
   2498 
   2499 #ifdef _WIN32
   2500 HMODULE
   2501 evutil_load_windows_system_library_(const TCHAR *library_name)
   2502 {
   2503   TCHAR path[MAX_PATH];
   2504   unsigned n;
   2505   n = GetSystemDirectory(path, MAX_PATH);
   2506   if (n == 0 || n + _tcslen(library_name) + 2 >= MAX_PATH)
   2507     return 0;
   2508   _tcscat(path, TEXT("\\"));
   2509   _tcscat(path, library_name);
   2510   return LoadLibrary(path);
   2511 }
   2512 #endif
   2513 
   2514 /* Internal wrapper around 'socket' to provide Linux-style support for
   2515  * syscall-saving methods where available.
   2516  *
   2517  * In addition to regular socket behavior, you can use a bitwise or to set the
   2518  * flags EVUTIL_SOCK_NONBLOCK and EVUTIL_SOCK_CLOEXEC in the 'type' argument,
   2519  * to make the socket nonblocking or close-on-exec with as few syscalls as
   2520  * possible.
   2521  */
   2522 evutil_socket_t
   2523 evutil_socket_(int domain, int type, int protocol)
   2524 {
   2525 	evutil_socket_t r;
   2526 #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC)
   2527 	r = socket(domain, type, protocol);
   2528 	if (r >= 0)
   2529 		return r;
   2530 	else if ((type & (SOCK_NONBLOCK|SOCK_CLOEXEC)) == 0)
   2531 		return -1;
   2532 #endif
   2533 #define SOCKET_TYPE_MASK (~(EVUTIL_SOCK_NONBLOCK|EVUTIL_SOCK_CLOEXEC))
   2534 	r = socket(domain, type & SOCKET_TYPE_MASK, protocol);
   2535 	if (r < 0)
   2536 		return -1;
   2537 	if (type & EVUTIL_SOCK_NONBLOCK) {
   2538 		if (evutil_fast_socket_nonblocking(r) < 0) {
   2539 			evutil_closesocket(r);
   2540 			return -1;
   2541 		}
   2542 	}
   2543 	if (type & EVUTIL_SOCK_CLOEXEC) {
   2544 		if (evutil_fast_socket_closeonexec(r) < 0) {
   2545 			evutil_closesocket(r);
   2546 			return -1;
   2547 		}
   2548 	}
   2549 	return r;
   2550 }
   2551 
   2552 /* Internal wrapper around 'accept' or 'accept4' to provide Linux-style
   2553  * support for syscall-saving methods where available.
   2554  *
   2555  * In addition to regular accept behavior, you can set one or more of flags
   2556  * EVUTIL_SOCK_NONBLOCK and EVUTIL_SOCK_CLOEXEC in the 'flags' argument, to
   2557  * make the socket nonblocking or close-on-exec with as few syscalls as
   2558  * possible.
   2559  */
   2560 evutil_socket_t
   2561 evutil_accept4_(evutil_socket_t sockfd, struct sockaddr *addr,
   2562     ev_socklen_t *addrlen, int flags)
   2563 {
   2564 	evutil_socket_t result;
   2565 #if defined(EVENT__HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK)
   2566 	result = accept4(sockfd, addr, addrlen, flags);
   2567 	if (result >= 0 || (errno != EINVAL && errno != ENOSYS)) {
   2568 		/* A nonnegative result means that we succeeded, so return.
   2569 		 * Failing with EINVAL means that an option wasn't supported,
   2570 		 * and failing with ENOSYS means that the syscall wasn't
   2571 		 * there: in those cases we want to fall back.  Otherwise, we
   2572 		 * got a real error, and we should return. */
   2573 		return result;
   2574 	}
   2575 #endif
   2576 	result = accept(sockfd, addr, addrlen);
   2577 	if (result < 0)
   2578 		return result;
   2579 
   2580 	if (flags & EVUTIL_SOCK_CLOEXEC) {
   2581 		if (evutil_fast_socket_closeonexec(result) < 0) {
   2582 			evutil_closesocket(result);
   2583 			return -1;
   2584 		}
   2585 	}
   2586 	if (flags & EVUTIL_SOCK_NONBLOCK) {
   2587 		if (evutil_fast_socket_nonblocking(result) < 0) {
   2588 			evutil_closesocket(result);
   2589 			return -1;
   2590 		}
   2591 	}
   2592 	return result;
   2593 }
   2594 
   2595 /* Internal function: Set fd[0] and fd[1] to a pair of fds such that writes on
   2596  * fd[0] get read from fd[1].  Make both fds nonblocking and close-on-exec.
   2597  * Return 0 on success, -1 on failure.
   2598  */
   2599 int
   2600 evutil_make_internal_pipe_(evutil_socket_t fd[2])
   2601 {
   2602 	/*
   2603 	  Making the second socket nonblocking is a bit subtle, given that we
   2604 	  ignore any EAGAIN returns when writing to it, and you don't usally
   2605 	  do that for a nonblocking socket. But if the kernel gives us EAGAIN,
   2606 	  then there's no need to add any more data to the buffer, since
   2607 	  the main thread is already either about to wake up and drain it,
   2608 	  or woken up and in the process of draining it.
   2609 	*/
   2610 
   2611 #if defined(EVENT__HAVE_PIPE2)
   2612 	if (pipe2(fd, O_NONBLOCK|O_CLOEXEC) == 0)
   2613 		return 0;
   2614 #endif
   2615 #if defined(EVENT__HAVE_PIPE)
   2616 	if (pipe(fd) == 0) {
   2617 		if (evutil_fast_socket_nonblocking(fd[0]) < 0 ||
   2618 		    evutil_fast_socket_nonblocking(fd[1]) < 0 ||
   2619 		    evutil_fast_socket_closeonexec(fd[0]) < 0 ||
   2620 		    evutil_fast_socket_closeonexec(fd[1]) < 0) {
   2621 			close(fd[0]);
   2622 			close(fd[1]);
   2623 			fd[0] = fd[1] = -1;
   2624 			return -1;
   2625 		}
   2626 		return 0;
   2627 	} else {
   2628 		event_warn("%s: pipe", __func__);
   2629 	}
   2630 #endif
   2631 
   2632 #ifdef _WIN32
   2633 #define LOCAL_SOCKETPAIR_AF AF_INET
   2634 #else
   2635 #define LOCAL_SOCKETPAIR_AF AF_UNIX
   2636 #endif
   2637 	if (evutil_socketpair(LOCAL_SOCKETPAIR_AF, SOCK_STREAM, 0, fd) == 0) {
   2638 		if (evutil_fast_socket_nonblocking(fd[0]) < 0 ||
   2639 		    evutil_fast_socket_nonblocking(fd[1]) < 0 ||
   2640 		    evutil_fast_socket_closeonexec(fd[0]) < 0 ||
   2641 		    evutil_fast_socket_closeonexec(fd[1]) < 0) {
   2642 			evutil_closesocket(fd[0]);
   2643 			evutil_closesocket(fd[1]);
   2644 			fd[0] = fd[1] = -1;
   2645 			return -1;
   2646 		}
   2647 		return 0;
   2648 	}
   2649 	fd[0] = fd[1] = -1;
   2650 	return -1;
   2651 }
   2652 
   2653 /* Wrapper around eventfd on systems that provide it.  Unlike the system
   2654  * eventfd, it always supports EVUTIL_EFD_CLOEXEC and EVUTIL_EFD_NONBLOCK as
   2655  * flags.  Returns -1 on error or if eventfd is not supported.
   2656  */
   2657 evutil_socket_t
   2658 evutil_eventfd_(unsigned initval, int flags)
   2659 {
   2660 #if defined(EVENT__HAVE_EVENTFD) && defined(EVENT__HAVE_SYS_EVENTFD_H)
   2661 	int r;
   2662 #if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK)
   2663 	r = eventfd(initval, flags);
   2664 	if (r >= 0 || flags == 0)
   2665 		return r;
   2666 #endif
   2667 	r = eventfd(initval, 0);
   2668 	if (r < 0)
   2669 		return r;
   2670 	if (flags & EVUTIL_EFD_CLOEXEC) {
   2671 		if (evutil_fast_socket_closeonexec(r) < 0) {
   2672 			evutil_closesocket(r);
   2673 			return -1;
   2674 		}
   2675 	}
   2676 	if (flags & EVUTIL_EFD_NONBLOCK) {
   2677 		if (evutil_fast_socket_nonblocking(r) < 0) {
   2678 			evutil_closesocket(r);
   2679 			return -1;
   2680 		}
   2681 	}
   2682 	return r;
   2683 #else
   2684 	return -1;
   2685 #endif
   2686 }
   2687 
   2688 void
   2689 evutil_free_globals_(void)
   2690 {
   2691 	evutil_free_secure_rng_globals_();
   2692 	evutil_free_sock_err_globals();
   2693 }
   2694