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
evutil_open_closeonexec_(const char * pathname,int flags,unsigned mode)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
evutil_read_file_(const char * filename,char ** content_out,size_t * len_out,int is_binary)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
evutil_socketpair(int family,int type,int protocol,evutil_socket_t fd[2])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
evutil_ersatz_socketpair_(int family,int type,int protocol,evutil_socket_t fd[2])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
evutil_make_socket_nonblocking(evutil_socket_t fd)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
evutil_fast_socket_nonblocking(evutil_socket_t fd)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
evutil_make_listen_socket_reuseable(evutil_socket_t sock)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
evutil_make_listen_socket_reuseable_port(evutil_socket_t sock)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
evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock)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
evutil_make_socket_closeonexec(evutil_socket_t fd)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
evutil_fast_socket_closeonexec(evutil_socket_t fd)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
evutil_closesocket(evutil_socket_t sock)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
evutil_strtoll(const char * s,char ** endptr,int base)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
evutil_socket_geterror(evutil_socket_t sock)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
evutil_socket_connect_(evutil_socket_t * fd_ptr,struct sockaddr * sa,int socklen)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
evutil_socket_finished_connecting_(evutil_socket_t fd)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
evutil_found_ifaddr(const struct sockaddr * sa)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
evutil_check_ifaddrs(void)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
evutil_check_interfaces(int force_recheck)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 *
evutil_new_addrinfo_(struct sockaddr * sa,ev_socklen_t socklen,const struct evutil_addrinfo * hints)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 *
evutil_addrinfo_append_(struct evutil_addrinfo * first,struct evutil_addrinfo * append)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
parse_numeric_servname(const char * servname)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
evutil_parse_servname(const char * servname,const char * protocol,const struct evutil_addrinfo * hints)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 *
evutil_unparse_protoname(int proto)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
evutil_getaddrinfo_infer_protocols(struct evutil_addrinfo * hints)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
evutil_getaddrinfo_common_(const char * nodename,const char * servname,struct evutil_addrinfo * hints,struct evutil_addrinfo ** res,int * portnum)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 *
addrinfo_from_hostent(const struct hostent * ent,int port,const struct evutil_addrinfo * hints)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
evutil_adjust_hints_for_addrconfig_(struct evutil_addrinfo * hints)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
test_for_getaddrinfo_hacks(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
need_numeric_port_hack(void)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
need_socktype_protocol_hack(void)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
apply_numeric_port_hack(int port,struct evutil_addrinfo ** ai)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
apply_socktype_protocol_hack(struct evutil_addrinfo * ai)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
evutil_getaddrinfo(const char * nodename,const char * servname,const struct evutil_addrinfo * hints_in,struct evutil_addrinfo ** res)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
evutil_freeaddrinfo(struct evutil_addrinfo * ai)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
evutil_set_evdns_getaddrinfo_fn_(evdns_getaddrinfo_fn fn)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
evutil_getaddrinfo_async_(struct evdns_base * dns_base,const char * nodename,const char * servname,const struct evutil_addrinfo * hints_in,void (* cb)(int,struct evutil_addrinfo *,void *),void * arg)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 *
evutil_gai_strerror(int err)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
chomp(char * s)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
hash_cached_sock_errs(const struct cached_sock_errs_entry * e)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
eq_cached_sock_errs(const struct cached_sock_errs_entry * a,const struct cached_sock_errs_entry * b)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 *
evutil_socket_error_to_string(int errcode)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
evutil_global_setup_locks_(const int enable_locks)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
evutil_free_sock_err_globals(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
evutil_global_setup_locks_(const int enable_locks)1781 evutil_global_setup_locks_(const int enable_locks)
1782 {
1783 return 0;
1784 }
1785 #endif
1786
1787 static void
evutil_free_sock_err_globals(void)1788 evutil_free_sock_err_globals(void)
1789 {
1790 }
1791
1792 #endif
1793
1794 int
evutil_snprintf(char * buf,size_t buflen,const char * format,...)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
evutil_vsnprintf(char * buf,size_t buflen,const char * format,va_list ap)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 *
evutil_inet_ntop(int af,const void * src,char * dst,size_t len)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
evutil_inet_pton(int af,const char * src,void * dst)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
evutil_parse_sockaddr_port(const char * ip_as_string,struct sockaddr * out,int * outlen)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 *
evutil_format_sockaddr_port_(const struct sockaddr * sa,char * out,size_t outlen)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
evutil_sockaddr_cmp(const struct sockaddr * sa1,const struct sockaddr * sa2,int include_port)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)
IMPL_CTYPE_FN(ISALNUM)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 }
EVUTIL_TOUPPER_(char c)2285 char EVUTIL_TOUPPER_(char c)
2286 {
2287 return ((char)EVUTIL_TOUPPER_TABLE[(ev_uint8_t)c]);
2288 }
2289 int
evutil_ascii_strcasecmp(const char * s1,const char * s2)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 }
evutil_ascii_strncasecmp(const char * s1,const char * s2,size_t n)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
evutil_rtrim_lws_(char * str)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
evutil_issetugid(void)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 *
evutil_getenv_(const char * varname)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
evutil_weakrand_seed_(struct evutil_weakrand_state * state,ev_uint32_t seed)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
evutil_weakrand_(struct evutil_weakrand_state * state)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
evutil_weakrand_range_(struct evutil_weakrand_state * state,ev_int32_t top)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
evutil_memclear_(void * mem,size_t len)2424 evutil_memclear_(void *mem, size_t len)
2425 {
2426 evutil_memset_volatile_(mem, 0, len);
2427 }
2428
2429 int
evutil_sockaddr_is_loopback_(const struct sockaddr * addr)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
evutil_hex_char_to_int_(char c)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
evutil_load_windows_system_library_(const TCHAR * library_name)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
evutil_socket_(int domain,int type,int protocol)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
evutil_accept4_(evutil_socket_t sockfd,struct sockaddr * addr,ev_socklen_t * addrlen,int flags)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
evutil_make_internal_pipe_(evutil_socket_t fd[2])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
evutil_eventfd_(unsigned initval,int flags)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
evutil_free_globals_(void)2659 evutil_free_globals_(void)
2660 {
2661 evutil_free_secure_rng_globals_();
2662 evutil_free_sock_err_globals();
2663 }
2664