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