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