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