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