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