socket.c (21987B)
1 /* Copyright (c) 2003-2004, Roger Dingledine 2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 3 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 4 /* See LICENSE for licensing information */ 5 6 /** 7 * \file socket.c 8 * \brief Compatibility and utility functions for working with network 9 * sockets. 10 **/ 11 12 #include "lib/net/socket.h" 13 #include "lib/net/socketpair.h" 14 #include "lib/net/address.h" 15 #include "lib/cc/compat_compiler.h" 16 #include "lib/err/torerr.h" 17 #include "lib/lock/compat_mutex.h" 18 #include "lib/log/log.h" 19 #include "lib/log/util_bug.h" 20 21 #ifdef _WIN32 22 #include <winsock2.h> 23 #include <windows.h> 24 #endif 25 #ifdef HAVE_UNISTD_H 26 #include <unistd.h> 27 #endif 28 #ifdef HAVE_FCNTL_H 29 #include <fcntl.h> 30 #endif 31 #include <stddef.h> 32 #include <string.h> 33 #ifdef __FreeBSD__ 34 #include <sys/sysctl.h> 35 #endif 36 37 /** Called before we make any calls to network-related functions. 38 * (Some operating systems require their network libraries to be 39 * initialized.) */ 40 int 41 network_init(void) 42 { 43 #ifdef _WIN32 44 /* This silly exercise is necessary before windows will allow 45 * gethostbyname to work. */ 46 WSADATA WSAData; 47 int r; 48 r = WSAStartup(0x101,&WSAData); 49 if (r) { 50 log_warn(LD_NET,"Error initializing windows network layer: code was %d",r); 51 return -1; 52 } 53 if (sizeof(SOCKET) != sizeof(tor_socket_t)) { 54 log_warn(LD_BUG,"The tor_socket_t type does not match SOCKET in size; Tor " 55 "might not work. (Sizes are %d and %d respectively.)", 56 (int)sizeof(tor_socket_t), (int)sizeof(SOCKET)); 57 } 58 /* WSAData.iMaxSockets might show the max sockets we're allowed to use. 59 * We might use it to complain if we're trying to be a server but have 60 * too few sockets available. */ 61 #endif /* defined(_WIN32) */ 62 return 0; 63 } 64 65 /** 66 * Warn the user if any system network parameters should be changed. 67 */ 68 void 69 check_network_configuration(bool server_mode) 70 { 71 #ifdef __FreeBSD__ 72 if (server_mode) { 73 int random_id_state; 74 size_t state_size = sizeof(random_id_state); 75 76 if (sysctlbyname("net.inet.ip.random_id", &random_id_state, 77 &state_size, NULL, 0)) { 78 log_warn(LD_CONFIG, 79 "Failed to figure out if IP ids are randomized."); 80 } else if (random_id_state == 0) { 81 log_warn(LD_CONFIG, "Looks like IP ids are not randomized. " 82 "Please consider setting the net.inet.ip.random_id sysctl, " 83 "so your relay makes it harder to figure out how busy it is."); 84 } 85 } 86 #else /* !defined(__FreeBSD__) */ 87 (void) server_mode; 88 #endif /* defined(__FreeBSD__) */ 89 } 90 91 /* When set_max_file_sockets() is called, update this with the max file 92 * descriptor value so we can use it to check the limit when opening a new 93 * socket. Default value is what Debian sets as the default hard limit. */ 94 static int max_sockets = 1024; 95 96 /** Return the maximum number of allowed sockets. */ 97 int 98 get_max_sockets(void) 99 { 100 return max_sockets; 101 } 102 103 /** Set the maximum number of allowed sockets to <b>n</b> */ 104 void 105 set_max_sockets(int n) 106 { 107 max_sockets = n; 108 } 109 110 #undef DEBUG_SOCKET_COUNTING 111 #ifdef DEBUG_SOCKET_COUNTING 112 #include "lib/container/bitarray.h" 113 114 /** A bitarray of all fds that should be passed to tor_socket_close(). Only 115 * used if DEBUG_SOCKET_COUNTING is defined. */ 116 static bitarray_t *open_sockets = NULL; 117 /** The size of <b>open_sockets</b>, in bits. */ 118 static int max_socket = -1; 119 #endif /* defined(DEBUG_SOCKET_COUNTING) */ 120 121 /** Count of number of sockets currently open. (Undercounts sockets opened by 122 * eventdns and libevent.) */ 123 static int n_sockets_open = 0; 124 125 /** Mutex to protect open_sockets, max_socket, and n_sockets_open. */ 126 static tor_mutex_t *socket_accounting_mutex = NULL; 127 128 /** Helper: acquire the socket accounting lock. */ 129 static inline void 130 socket_accounting_lock(void) 131 { 132 if (PREDICT_UNLIKELY(!socket_accounting_mutex)) 133 socket_accounting_mutex = tor_mutex_new(); 134 tor_mutex_acquire(socket_accounting_mutex); 135 } 136 137 /** Helper: release the socket accounting lock. */ 138 static inline void 139 socket_accounting_unlock(void) 140 { 141 tor_mutex_release(socket_accounting_mutex); 142 } 143 144 /** As close(), but guaranteed to work for sockets across platforms (including 145 * Windows, where close()ing a socket doesn't work. Returns 0 on success and 146 * the socket error code on failure. */ 147 int 148 tor_close_socket_simple(tor_socket_t s) 149 { 150 int r = 0; 151 152 /* On Windows, you have to call close() on fds returned by open(), 153 * and closesocket() on fds returned by socket(). On Unix, everything 154 * gets close()'d. We abstract this difference by always using 155 * tor_close_socket to close sockets, and always using close() on 156 * files. 157 */ 158 #if defined(_WIN32) 159 r = closesocket(s); 160 #else 161 r = close(s); 162 #endif 163 164 if (r != 0) { 165 int err = tor_socket_errno(-1); 166 log_info(LD_NET, "Close returned an error: %s", tor_socket_strerror(err)); 167 return err; 168 } 169 170 return r; 171 } 172 173 /** @{ */ 174 #ifdef DEBUG_SOCKET_COUNTING 175 /** Helper: if DEBUG_SOCKET_COUNTING is enabled, remember that <b>s</b> is 176 * now an open socket. */ 177 static inline void 178 mark_socket_open(tor_socket_t s) 179 { 180 /* XXXX This bitarray business will NOT work on windows: sockets aren't 181 small ints there. */ 182 if (s > max_socket) { 183 if (max_socket == -1) { 184 open_sockets = bitarray_init_zero(s+128); 185 max_socket = s+128; 186 } else { 187 open_sockets = bitarray_expand(open_sockets, max_socket, s+128); 188 max_socket = s+128; 189 } 190 } 191 if (bitarray_is_set(open_sockets, s)) { 192 log_warn(LD_BUG, "I thought that %d was already open, but socket() just " 193 "gave it to me!", s); 194 } 195 bitarray_set(open_sockets, s); 196 } 197 static inline void 198 mark_socket_closed(tor_socket_t s) 199 { 200 if (s > max_socket || ! bitarray_is_set(open_sockets, s)) { 201 log_warn(LD_BUG, "Closing a socket (%d) that wasn't returned by tor_open_" 202 "socket(), or that was already closed or something.", s); 203 } else { 204 tor_assert(open_sockets && s <= max_socket); 205 bitarray_clear(open_sockets, s); 206 } 207 } 208 #else /* !defined(DEBUG_SOCKET_COUNTING) */ 209 #define mark_socket_open(s) ((void) (s)) 210 #define mark_socket_closed(s) ((void) (s)) 211 #endif /* defined(DEBUG_SOCKET_COUNTING) */ 212 /** @} */ 213 214 /** As tor_close_socket_simple(), but keeps track of the number 215 * of open sockets. Returns 0 on success, -1 on failure. */ 216 MOCK_IMPL(int, 217 tor_close_socket,(tor_socket_t s)) 218 { 219 int r = tor_close_socket_simple(s); 220 221 socket_accounting_lock(); 222 mark_socket_closed(s); 223 if (r == 0) { 224 --n_sockets_open; 225 } else { 226 #ifdef _WIN32 227 if (r != WSAENOTSOCK) 228 --n_sockets_open; 229 #else 230 if (r != EBADF) 231 --n_sockets_open; // LCOV_EXCL_LINE -- EIO and EINTR too hard to force. 232 #endif /* defined(_WIN32) */ 233 r = -1; 234 } 235 236 tor_assert_nonfatal(n_sockets_open >= 0); 237 socket_accounting_unlock(); 238 return r; 239 } 240 241 /** As socket(), but counts the number of open sockets. */ 242 MOCK_IMPL(tor_socket_t, 243 tor_open_socket,(int domain, int type, int protocol)) 244 { 245 return tor_open_socket_with_extensions(domain, type, protocol, 1, 0); 246 } 247 248 /** Mockable wrapper for connect(). */ 249 MOCK_IMPL(tor_socket_t, 250 tor_connect_socket,(tor_socket_t sock, const struct sockaddr *address, 251 socklen_t address_len)) 252 { 253 return connect(sock,address,address_len); 254 } 255 256 /** As socket(), but creates a nonblocking socket and 257 * counts the number of open sockets. */ 258 tor_socket_t 259 tor_open_socket_nonblocking(int domain, int type, int protocol) 260 { 261 return tor_open_socket_with_extensions(domain, type, protocol, 1, 1); 262 } 263 264 /** As socket(), but counts the number of open sockets and handles 265 * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified. 266 * <b>cloexec</b> and <b>nonblock</b> should be either 0 or 1 to indicate 267 * if the corresponding extension should be used.*/ 268 tor_socket_t 269 tor_open_socket_with_extensions(int domain, int type, int protocol, 270 int cloexec, int nonblock) 271 { 272 tor_socket_t s; 273 274 /* We are about to create a new file descriptor so make sure we have 275 * enough of them. */ 276 if (get_n_open_sockets() >= max_sockets - 1) { 277 #ifdef _WIN32 278 WSASetLastError(WSAEMFILE); 279 #else 280 errno = EMFILE; 281 #endif 282 return TOR_INVALID_SOCKET; 283 } 284 285 #if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) 286 int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) | 287 (nonblock ? SOCK_NONBLOCK : 0); 288 s = socket(domain, type|ext_flags, protocol); 289 if (SOCKET_OK(s)) 290 goto socket_ok; 291 /* If we got an error, see if it is EINVAL. EINVAL might indicate that, 292 * even though we were built on a system with SOCK_CLOEXEC and SOCK_NONBLOCK 293 * support, we are running on one without. */ 294 if (errno != EINVAL) 295 return s; 296 #endif /* defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) */ 297 298 s = socket(domain, type, protocol); 299 if (! SOCKET_OK(s)) 300 return s; 301 302 #if defined(FD_CLOEXEC) 303 if (cloexec) { 304 if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) { 305 log_warn(LD_FS,"Couldn't set FD_CLOEXEC: %s", strerror(errno)); 306 tor_close_socket_simple(s); 307 return TOR_INVALID_SOCKET; 308 } 309 } 310 #else /* !defined(FD_CLOEXEC) */ 311 (void)cloexec; 312 #endif /* defined(FD_CLOEXEC) */ 313 314 if (nonblock) { 315 if (set_socket_nonblocking(s) == -1) { 316 tor_close_socket_simple(s); 317 return TOR_INVALID_SOCKET; 318 } 319 } 320 321 goto socket_ok; /* So that socket_ok will not be unused. */ 322 323 socket_ok: 324 tor_take_socket_ownership(s); 325 return s; 326 } 327 328 /** 329 * For socket accounting: remember that we are the owner of the socket 330 * <b>s</b>. This will prevent us from overallocating sockets, and prevent us 331 * from asserting later when we close the socket <b>s</b>. 332 */ 333 void 334 tor_take_socket_ownership(tor_socket_t s) 335 { 336 socket_accounting_lock(); 337 ++n_sockets_open; 338 mark_socket_open(s); 339 socket_accounting_unlock(); 340 } 341 342 /** 343 * For socket accounting: declare that we are no longer the owner of the 344 * socket <b>s</b>. This will prevent us from overallocating sockets, and 345 * prevent us from asserting later when we close the socket <b>s</b>. 346 */ 347 void 348 tor_release_socket_ownership(tor_socket_t s) 349 { 350 socket_accounting_lock(); 351 --n_sockets_open; 352 mark_socket_closed(s); 353 socket_accounting_unlock(); 354 } 355 356 /** As accept(), but counts the number of open sockets. */ 357 tor_socket_t 358 tor_accept_socket(tor_socket_t sockfd, struct sockaddr *addr, socklen_t *len) 359 { 360 return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 0); 361 } 362 363 /** As accept(), but returns a nonblocking socket and 364 * counts the number of open sockets. */ 365 tor_socket_t 366 tor_accept_socket_nonblocking(tor_socket_t sockfd, struct sockaddr *addr, 367 socklen_t *len) 368 { 369 return tor_accept_socket_with_extensions(sockfd, addr, len, 1, 1); 370 } 371 372 /** As accept(), but counts the number of open sockets and handles 373 * socket creation with either of SOCK_CLOEXEC and SOCK_NONBLOCK specified. 374 * <b>cloexec</b> and <b>nonblock</b> should be either 0 or 1 to indicate 375 * if the corresponding extension should be used.*/ 376 tor_socket_t 377 tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr, 378 socklen_t *len, int cloexec, int nonblock) 379 { 380 tor_socket_t s; 381 382 /* We are about to create a new file descriptor so make sure we have 383 * enough of them. */ 384 if (get_n_open_sockets() >= max_sockets - 1) { 385 #ifdef _WIN32 386 WSASetLastError(WSAEMFILE); 387 #else 388 errno = EMFILE; 389 #endif 390 return TOR_INVALID_SOCKET; 391 } 392 393 #if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) \ 394 && defined(SOCK_NONBLOCK) 395 int ext_flags = (cloexec ? SOCK_CLOEXEC : 0) | 396 (nonblock ? SOCK_NONBLOCK : 0); 397 s = accept4(sockfd, addr, len, ext_flags); 398 if (SOCKET_OK(s)) 399 goto socket_ok; 400 /* If we got an error, see if it is ENOSYS. ENOSYS indicates that, 401 * even though we were built on a system with accept4 support, we 402 * are running on one without. Also, check for EINVAL, which indicates that 403 * we are missing SOCK_CLOEXEC/SOCK_NONBLOCK support. */ 404 if (errno != EINVAL && errno != ENOSYS) 405 return s; 406 #endif /* defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) ... */ 407 408 s = accept(sockfd, addr, len); 409 if (!SOCKET_OK(s)) 410 return s; 411 412 #if defined(FD_CLOEXEC) 413 if (cloexec) { 414 if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) { 415 log_warn(LD_NET, "Couldn't set FD_CLOEXEC: %s", strerror(errno)); 416 tor_close_socket_simple(s); 417 return TOR_INVALID_SOCKET; 418 } 419 } 420 #else /* !defined(FD_CLOEXEC) */ 421 (void)cloexec; 422 #endif /* defined(FD_CLOEXEC) */ 423 424 if (nonblock) { 425 if (set_socket_nonblocking(s) == -1) { 426 tor_close_socket_simple(s); 427 return TOR_INVALID_SOCKET; 428 } 429 } 430 431 goto socket_ok; /* So that socket_ok will not be unused. */ 432 433 socket_ok: 434 tor_take_socket_ownership(s); 435 return s; 436 } 437 438 /** Return the number of sockets we currently have opened. */ 439 int 440 get_n_open_sockets(void) 441 { 442 int n; 443 socket_accounting_lock(); 444 n = n_sockets_open; 445 socket_accounting_unlock(); 446 return n; 447 } 448 449 /** 450 * Allocate a pair of connected sockets. (Like socketpair(family, 451 * type,protocol,fd), but works on systems that don't have 452 * socketpair.) 453 * 454 * Currently, only (AF_UNIX, SOCK_STREAM, 0) sockets are supported. 455 * 456 * Note that on systems without socketpair, this call will fail if 457 * localhost is inaccessible (for example, if the networking 458 * stack is down). And even if it succeeds, the socket pair will not 459 * be able to read while localhost is down later (the socket pair may 460 * even close, depending on OS-specific timeouts). The socket pair 461 * should work on IPv4-only, IPv6-only, and dual-stack systems, as long 462 * as they have the standard localhost addresses. 463 * 464 * Returns 0 on success and -errno on failure; do not rely on the value 465 * of errno or WSAGetLastError(). 466 **/ 467 /* It would be nicer just to set errno, but that won't work for windows. */ 468 int 469 tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]) 470 { 471 int r; 472 //don't use win32 socketpairs (they are always bad) 473 #if defined(HAVE_SOCKETPAIR) && !defined(_WIN32) 474 475 #ifdef SOCK_CLOEXEC 476 r = socketpair(family, type|SOCK_CLOEXEC, protocol, fd); 477 if (r == 0) 478 goto sockets_ok; 479 /* If we got an error, see if it is EINVAL. EINVAL might indicate that, 480 * even though we were built on a system with SOCK_CLOEXEC support, we 481 * are running on one without. */ 482 if (errno != EINVAL) 483 return -errno; 484 #endif /* defined(SOCK_CLOEXEC) */ 485 486 r = socketpair(family, type, protocol, fd); 487 if (r < 0) 488 return -errno; 489 #else /* !(defined(HAVE_SOCKETPAIR) && !defined(_WIN32)) */ 490 r = tor_ersatz_socketpair(family, type, protocol, fd); 491 if (r < 0) 492 return -r; 493 #endif /* defined(HAVE_SOCKETPAIR) && !defined(_WIN32) */ 494 495 #if defined(FD_CLOEXEC) 496 if (SOCKET_OK(fd[0])) { 497 r = fcntl(fd[0], F_SETFD, FD_CLOEXEC); 498 if (r == -1) { 499 close(fd[0]); 500 close(fd[1]); 501 return -errno; 502 } 503 } 504 if (SOCKET_OK(fd[1])) { 505 r = fcntl(fd[1], F_SETFD, FD_CLOEXEC); 506 if (r == -1) { 507 close(fd[0]); 508 close(fd[1]); 509 return -errno; 510 } 511 } 512 #endif /* defined(FD_CLOEXEC) */ 513 goto sockets_ok; /* So that sockets_ok will not be unused. */ 514 515 sockets_ok: 516 socket_accounting_lock(); 517 if (SOCKET_OK(fd[0])) { 518 ++n_sockets_open; 519 mark_socket_open(fd[0]); 520 } 521 if (SOCKET_OK(fd[1])) { 522 ++n_sockets_open; 523 mark_socket_open(fd[1]); 524 } 525 socket_accounting_unlock(); 526 527 return 0; 528 } 529 530 /** Mockable wrapper for getsockname(). */ 531 MOCK_IMPL(int, 532 tor_getsockname,(tor_socket_t sock, struct sockaddr *address, 533 socklen_t *address_len)) 534 { 535 return getsockname(sock, address, address_len); 536 } 537 538 /** 539 * Find the local address associated with the socket <b>sock</b>, and 540 * place it in *<b>addr_out</b>. Return 0 on success, -1 on failure. 541 * 542 * (As tor_getsockname, but instead places the result in a tor_addr_t.) */ 543 int 544 tor_addr_from_getsockname(struct tor_addr_t *addr_out, tor_socket_t sock) 545 { 546 struct sockaddr_storage ss; 547 socklen_t ss_len = sizeof(ss); 548 memset(&ss, 0, sizeof(ss)); 549 550 if (tor_getsockname(sock, (struct sockaddr *) &ss, &ss_len) < 0) 551 return -1; 552 553 return tor_addr_from_sockaddr(addr_out, (struct sockaddr *)&ss, NULL); 554 } 555 556 /** Turn <b>socket</b> into a nonblocking socket. Return 0 on success, -1 557 * on failure. 558 */ 559 int 560 set_socket_nonblocking(tor_socket_t sock) 561 { 562 #if defined(_WIN32) 563 unsigned long nonblocking = 1; 564 ioctlsocket(sock, FIONBIO, (unsigned long*) &nonblocking); 565 #else 566 int flags; 567 568 flags = fcntl(sock, F_GETFL, 0); 569 if (flags == -1) { 570 log_warn(LD_NET, "Couldn't get file status flags: %s", strerror(errno)); 571 return -1; 572 } 573 flags |= O_NONBLOCK; 574 if (fcntl(sock, F_SETFL, flags) == -1) { 575 log_warn(LD_NET, "Couldn't set file status flags: %s", strerror(errno)); 576 return -1; 577 } 578 #endif /* defined(_WIN32) */ 579 580 return 0; 581 } 582 583 /** Read from <b>sock</b> to <b>buf</b>, until we get <b>count</b> bytes or 584 * reach the end of the file. Return the number of bytes read, or -1 on 585 * error. Only use if fd is a blocking fd. */ 586 ssize_t 587 read_all_from_socket(tor_socket_t sock, char *buf, size_t count) 588 { 589 size_t numread = 0; 590 ssize_t result; 591 592 if (count > SIZE_T_CEILING || count > SSIZE_MAX) { 593 errno = EINVAL; 594 return -1; 595 } 596 597 while (numread < count) { 598 result = tor_socket_recv(sock, buf+numread, count-numread, 0); 599 if (result<0) 600 return -1; 601 else if (result == 0) 602 break; 603 numread += result; 604 } 605 return (ssize_t)numread; 606 } 607 608 /** Write <b>count</b> bytes from <b>buf</b> to <b>sock</b>. Return the number 609 * of bytes written, or -1 on error. Only use if fd is a blocking fd. */ 610 ssize_t 611 write_all_to_socket(tor_socket_t fd, const char *buf, size_t count) 612 { 613 size_t written = 0; 614 ssize_t result; 615 raw_assert(count < SSIZE_MAX); 616 617 while (written != count) { 618 result = tor_socket_send(fd, buf+written, count-written, 0); 619 if (result<0) 620 return -1; 621 written += result; 622 } 623 return (ssize_t)count; 624 } 625 626 /** 627 * On Windows, WSAEWOULDBLOCK is not always correct: when you see it, 628 * you need to ask the socket for its actual errno. Also, you need to 629 * get your errors from WSAGetLastError, not errno. (If you supply a 630 * socket of -1, we check WSAGetLastError, but don't correct 631 * WSAEWOULDBLOCKs.) 632 * 633 * The upshot of all of this is that when a socket call fails, you 634 * should call tor_socket_errno <em>at most once</em> on the failing 635 * socket to get the error. 636 */ 637 #if defined(_WIN32) 638 int 639 tor_socket_errno(tor_socket_t sock) 640 { 641 int optval, optvallen=sizeof(optval); 642 int err = WSAGetLastError(); 643 if (err == WSAEWOULDBLOCK && SOCKET_OK(sock)) { 644 if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&optval, &optvallen)) 645 return err; 646 if (optval) 647 return optval; 648 } 649 return err; 650 } 651 #endif /* defined(_WIN32) */ 652 653 #if defined(_WIN32) 654 #define E(code, s) { code, (s " [" #code " ]") } 655 656 typedef struct windows_socket_error { 657 int code; 658 const char *msg; 659 } windows_socket_error_t; 660 661 static windows_socket_error_t windows_socket_errors[] = { 662 E(WSAEINTR, "Interrupted function call"), 663 E(WSAEACCES, "Permission denied"), 664 E(WSAEFAULT, "Bad address"), 665 E(WSAEINVAL, "Invalid argument"), 666 E(WSAEMFILE, "Too many open files"), 667 E(WSAEWOULDBLOCK, "Resource temporarily unavailable"), 668 E(WSAEINPROGRESS, "Operation now in progress"), 669 E(WSAEALREADY, "Operation already in progress"), 670 E(WSAENOTSOCK, "Socket operation on nonsocket"), 671 E(WSAEDESTADDRREQ, "Destination address required"), 672 E(WSAEMSGSIZE, "Message too long"), 673 E(WSAEPROTOTYPE, "Protocol wrong for socket"), 674 E(WSAENOPROTOOPT, "Bad protocol option"), 675 E(WSAEPROTONOSUPPORT, "Protocol not supported"), 676 E(WSAESOCKTNOSUPPORT, "Socket type not supported"), 677 /* What's the difference between NOTSUPP and NOSUPPORT? :) */ 678 E(WSAEOPNOTSUPP, "Operation not supported"), 679 E(WSAEPFNOSUPPORT, "Protocol family not supported"), 680 E(WSAEAFNOSUPPORT, "Address family not supported by protocol family"), 681 E(WSAEADDRINUSE, "Address already in use"), 682 E(WSAEADDRNOTAVAIL, "Cannot assign requested address"), 683 E(WSAENETDOWN, "Network is down"), 684 E(WSAENETUNREACH, "Network is unreachable"), 685 E(WSAENETRESET, "Network dropped connection on reset"), 686 E(WSAECONNABORTED, "Software caused connection abort"), 687 E(WSAECONNRESET, "Connection reset by peer"), 688 E(WSAENOBUFS, "No buffer space available"), 689 E(WSAEISCONN, "Socket is already connected"), 690 E(WSAENOTCONN, "Socket is not connected"), 691 E(WSAESHUTDOWN, "Cannot send after socket shutdown"), 692 E(WSAETIMEDOUT, "Connection timed out"), 693 E(WSAECONNREFUSED, "Connection refused"), 694 E(WSAEHOSTDOWN, "Host is down"), 695 E(WSAEHOSTUNREACH, "No route to host"), 696 E(WSAEPROCLIM, "Too many processes"), 697 /* Yes, some of these start with WSA, not WSAE. No, I don't know why. */ 698 E(WSASYSNOTREADY, "Network subsystem is unavailable"), 699 E(WSAVERNOTSUPPORTED, "Winsock.dll out of range"), 700 E(WSANOTINITIALISED, "Successful WSAStartup not yet performed"), 701 E(WSAEDISCON, "Graceful shutdown now in progress"), 702 #ifdef WSATYPE_NOT_FOUND 703 E(WSATYPE_NOT_FOUND, "Class type not found"), 704 #endif 705 E(WSAHOST_NOT_FOUND, "Host not found"), 706 E(WSATRY_AGAIN, "Nonauthoritative host not found"), 707 E(WSANO_RECOVERY, "This is a nonrecoverable error"), 708 E(WSANO_DATA, "Valid name, no data record of requested type)"), 709 710 /* There are some more error codes whose numeric values are marked 711 * <b>OS dependent</b>. They start with WSA_, apparently for the same 712 * reason that practitioners of some craft traditions deliberately 713 * introduce imperfections into their baskets and rugs "to allow the 714 * evil spirits to escape." If we catch them, then our binaries 715 * might not report consistent results across versions of Windows. 716 * Thus, I'm going to let them all fall through. 717 */ 718 { -1, NULL }, 719 }; 720 /** There does not seem to be a strerror equivalent for Winsock errors. 721 * Naturally, we have to roll our own. 722 */ 723 const char * 724 tor_socket_strerror(int e) 725 { 726 int i; 727 for (i=0; windows_socket_errors[i].code >= 0; ++i) { 728 if (e == windows_socket_errors[i].code) 729 return windows_socket_errors[i].msg; 730 } 731 return strerror(e); 732 } 733 #endif /* defined(_WIN32) */