15ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*************************************************************************** 25ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * _ _ ____ _ 35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Project ___| | | | _ \| | 45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * / __| | | | |_) | | 55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * | (__| |_| | _ <| |___ 65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * \___|\___/|_| \_\_____| 75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 8cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. 95ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is licensed as described in the file COPYING, which 115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * you should have received as part of this distribution. The terms 128f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html. 135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * You may opt to use, copy, modify, merge, publish, distribute and/or sell 155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * copies of the Software, and permit persons to whom the Software is 165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * furnished to do so, under the terms of the COPYING file. 175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * KIND, either express or implied. 205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/ 225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 23e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curl_setup.h" 245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_SYS_SELECT_H 265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <sys/select.h> 275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if !defined(HAVE_SELECT) && !defined(HAVE_POLL_FINE) 305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#error "We can't compile without select() or poll() support." 315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(__BEOS__) && !defined(__HAIKU__) 345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* BeOS has FD_SET defined in socket.h */ 355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <socket.h> 365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef MSDOS 395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <dos.h> /* delay() */ 405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef __VXWORKS__ 43e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include <strings.h> /* bzero() in FD_SET */ 44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <curl/curl.h> 475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "urldata.h" 495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "connect.h" 505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "select.h" 51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "warnless.h" 525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* Convenience local macros */ 54cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes#define ELAPSED_MS() (int)curlx_tvdiff(curlx_tvnow(), initial_tv) 555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 56e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint Curl_ack_eintr = 0; 57cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes#define ERROR_NOT_EINTR(error) (Curl_ack_eintr || error != EINTR) 585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Internal function used for waiting a specific amount of ms 61cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes * in Curl_socket_check() and Curl_poll() when no file descriptor 625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * is provided to wait on, just being used to delay execution. 635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * WinSock select() and poll() timeout mechanisms need a valid 645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * socket descriptor in a not null file descriptor set to work. 655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Waiting indefinitely with this function is not allowed, a 665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * zero or negative timeout value will return immediately. 675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Timeout resolution, accuracy, as well as maximum supported 685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * value is system dependent, neither factor is a citical issue 695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * for the intended use of this function in the library. 705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values: 725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * -1 = system call error, invalid timeout value, or interrupted 735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 0 = specified timeout has elapsed 745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint Curl_wait_ms(int timeout_ms) 765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if !defined(MSDOS) && !defined(USE_WINSOCK) 785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef HAVE_POLL_FINE 795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval pending_tv; 805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval initial_tv; 825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int pending_ms; 835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int error; 845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int r = 0; 865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(!timeout_ms) 885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms < 0) { 905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen SET_SOCKERRNO(EINVAL); 915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(MSDOS) 945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen delay(timeout_ms); 955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#elif defined(USE_WINSOCK) 965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen Sleep(timeout_ms); 975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms; 995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen initial_tv = curlx_tvnow(); 1005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 1015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(HAVE_POLL_FINE) 1025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = poll(NULL, 0, pending_ms); 1035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 1045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = pending_ms / 1000; 1055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = (pending_ms % 1000) * 1000; 1065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = select(0, NULL, NULL, NULL, &pending_tv); 1075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_POLL_FINE */ 1085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 1095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 1105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 111cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes if(error && ERROR_NOT_EINTR(error)) 1125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 113cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes pending_ms = timeout_ms - ELAPSED_MS(); 114e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 1165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 117e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 1185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 1195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* USE_WINSOCK */ 1205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r) 1215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = -1; 1225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 1235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 1245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 126e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Wait for read or write events on a set of file descriptors. It uses poll() 127e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * when a fine poll() is available, in order to avoid limits with FD_SETSIZE, 128e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * otherwise select() is used. An error is returned if select() is being used 129e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * and a file descriptor is too large for FD_SETSIZE. 130e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 1315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * A negative timeout value makes this function wait indefinitely, 1325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * unles no valid file descriptor is given, when this happens the 1335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * negative timeout is ignored and the function times out immediately. 1345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 1355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values: 1365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * -1 = system call error or fd >= FD_SETSIZE 1375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 0 = timeout 138e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * [bitmask] = action as described below 139e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 140e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_IN - first socket is readable 141e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_IN2 - second socket is readable 142e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_OUT - write socket is writable 143e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_ERR - an error condition occurred 1445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 145e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ 146e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket_t readfd1, 147e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket_t writefd, /* socket to write to */ 148cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes time_t timeout_ms) /* milliseconds to wait */ 1495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 1505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_POLL_FINE 151e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct pollfd pfd[3]; 1525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int num; 1535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 1545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval pending_tv; 1555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval *ptimeout; 1565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_read; 1575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_write; 1585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_err; 1595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_socket_t maxfd; 1605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 161e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct timeval initial_tv = {0, 0}; 1625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int pending_ms = 0; 1635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int error; 1645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int r; 1655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int ret; 1665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 167cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes#if SIZEOF_LONG != SIZEOF_INT 168cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes /* wrap-around precaution */ 169cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes if(timeout_ms >= INT_MAX) 170cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes timeout_ms = INT_MAX; 171cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes#endif 172cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes 173e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if((readfd0 == CURL_SOCKET_BAD) && (readfd1 == CURL_SOCKET_BAD) && 174e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET (writefd == CURL_SOCKET_BAD)) { 175e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* no sockets, just wait */ 176e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = Curl_wait_ms((int)timeout_ms); 1775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 1785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 1795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed 1815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen time in this function does not need to be measured. This happens 1825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen when function is called with a zero timeout or a negative timeout 1835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen value indicating a blocking call should be performed. */ 1845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 186e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pending_ms = (int)timeout_ms; 1875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen initial_tv = curlx_tvnow(); 1885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 1895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_POLL_FINE 1915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num = 0; 193e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 194e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].fd = readfd0; 195e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].events = POLLRDNORM|POLLIN|POLLRDBAND|POLLPRI; 196e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].revents = 0; 197e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET num++; 198e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 199e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 200e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].fd = readfd1; 2015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].events = POLLRDNORM|POLLIN|POLLRDBAND|POLLPRI; 2025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].revents = 0; 2035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num++; 2045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 2065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].fd = writefd; 2075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].events = POLLWRNORM|POLLOUT; 2085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].revents = 0; 2095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num++; 2105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 2135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms < 0) 2145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = -1; 2155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) 2165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = 0; 2175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = poll(pfd, num, pending_ms); 2185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 2195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 2205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 221cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes if(error && ERROR_NOT_EINTR(error)) 2225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 2235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 224cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes pending_ms = (int)(timeout_ms - ELAPSED_MS()); 225e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 226e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 2275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 228e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 2295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 2315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 2335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 2345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 2355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 2365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret = 0; 2385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num = 0; 239e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 2405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP)) 2415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_IN; 2425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL)) 2435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 2445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num++; 2455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 246e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 247e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP)) 248e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_IN2; 249e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL)) 250e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_ERR; 251e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET num++; 252e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 2535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 2545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLWRNORM|POLLOUT)) 2555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_OUT; 2565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLERR|POLLHUP|POLLNVAL)) 2575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 2585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return ret; 2615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else /* HAVE_POLL_FINE */ 2635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_err); 2655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = (curl_socket_t)-1; 2665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_read); 268e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 269e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET VERIFY_SOCK(readfd0); 270e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd0, &fds_read); 271e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd0, &fds_err); 272e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET maxfd = readfd0; 273e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 274e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 275e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET VERIFY_SOCK(readfd1); 276e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd1, &fds_read); 277e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd1, &fds_err); 278e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 > maxfd) 279e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET maxfd = readfd1; 2805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_write); 2835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 2845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen VERIFY_SOCK(writefd); 2855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(writefd, &fds_write); 2865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(writefd, &fds_err); 2875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd > maxfd) 2885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = writefd; 2895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ptimeout = (timeout_ms < 0) ? NULL : &pending_tv; 2925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 2945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 2955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = pending_ms / 1000; 2965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = (pending_ms % 1000) * 1000; 2975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) { 2995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = 0; 3005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = 0; 3015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 302e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 303e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* WinSock select() must not be called with an fd_set that contains zero 304e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fd flags, or it will return WSAEINVAL. But, it also can't be called 305e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET with no fd_sets at all! From the documentation: 306e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 307e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Any two of the parameters, readfds, writefds, or exceptfds, can be 308e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET given as null. At least one must be non-null, and any non-null 309e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET descriptor set must contain at least one handle to a socket. 310e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 311e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET We know that we have at least one bit set in at least two fd_sets in 312e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET this case, but we may have no bits set in either fds_read or fd_write, 313e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET so check for that and handle it. Luckily, with WinSock, we can _also_ 314e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ask how many bits are set on an fd_set. 315e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 316e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET It is unclear why WinSock doesn't just handle this for us instead of 317e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET calling this an error. 318e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 319e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Note also that WinSock ignores the first argument, so we don't worry 320e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET about the fact that maxfd is computed incorrectly with WinSock (since 321e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket_t is unsigned in such cases and thus -1 is the largest 322e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET value). 323e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 3248f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#ifdef USE_WINSOCK 325e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = select((int)maxfd + 1, 326e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_read.fd_count ? &fds_read : NULL, 327e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_write.fd_count ? &fds_write : NULL, 328e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET &fds_err, ptimeout); 3298f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#else 3308f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); 3318f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#endif 3328f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo 3335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 3345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 3355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 336cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes if(error && ERROR_NOT_EINTR(error)) 3375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 3385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 339cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes pending_ms = (int)(timeout_ms - ELAPSED_MS()); 340e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 341e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 3425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 343e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 3445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 3455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 3465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 3485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 3495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 3505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 3515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret = 0; 353e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 354e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd0, &fds_read)) 3555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_IN; 356e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd0, &fds_err)) 357e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_ERR; 358e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 359e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 360e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd1, &fds_read)) 361e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_IN2; 362e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd1, &fds_err)) 3635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 3645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 3655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 3665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(writefd, &fds_write)) 3675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_OUT; 3685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(writefd, &fds_err)) 3695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 3705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 3715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return ret; 3735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_POLL_FINE */ 3755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 3775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 3795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This is a wrapper around poll(). If poll() does not exist, then 3805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * select() is used instead. An error is returned if select() is 3815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * being used and a file descriptor is too large for FD_SETSIZE. 3825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * A negative timeout value makes this function wait indefinitely, 3835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * unles no valid file descriptor is given, when this happens the 3845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * negative timeout is ignored and the function times out immediately. 3855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 3865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values: 3875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * -1 = system call error or fd >= FD_SETSIZE 3885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 0 = timeout 3895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * N = number of structures with non zero revent fields 3905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 3915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenint Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) 3925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 3935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef HAVE_POLL_FINE 3945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval pending_tv; 3955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval *ptimeout; 3965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_read; 3975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_write; 3985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_err; 3995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_socket_t maxfd; 4005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 401e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct timeval initial_tv = {0, 0}; 4025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen bool fds_none = TRUE; 4035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen unsigned int i; 4045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int pending_ms = 0; 4055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int error; 4065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int r; 4075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds) { 409e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 4105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd != CURL_SOCKET_BAD) { 4115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fds_none = FALSE; 4125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 4135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(fds_none) { 417e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = Curl_wait_ms(timeout_ms); 4185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 4195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed 4225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen time in this function does not need to be measured. This happens 4235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen when function is called with a zero timeout or a negative timeout 4245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen value indicating a blocking call should be performed. */ 4255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 4275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms; 4285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen initial_tv = curlx_tvnow(); 4295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_POLL_FINE 4325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 4345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms < 0) 4355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = -1; 4365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) 4375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = 0; 4385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = poll(ufds, nfds, pending_ms); 4395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 4405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 4415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 442cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes if(error && ERROR_NOT_EINTR(error)) 4435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 4445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 445cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes pending_ms = (int)(timeout_ms - ELAPSED_MS()); 446e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 447e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 4485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 449e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 4505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 4525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 4545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 4555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 4565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 4575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 458e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 4595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd == CURL_SOCKET_BAD) 4605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen continue; 4615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].revents & POLLHUP) 4625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLIN; 4635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].revents & POLLERR) 4645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= (POLLIN|POLLOUT); 4655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else /* HAVE_POLL_FINE */ 4685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_read); 4705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_write); 4715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_err); 4725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = (curl_socket_t)-1; 4735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 474e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 4755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents = 0; 4765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd == CURL_SOCKET_BAD) 4775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen continue; 4785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen VERIFY_SOCK(ufds[i].fd); 4795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLIN|POLLOUT|POLLPRI| 4805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen POLLRDNORM|POLLWRNORM|POLLRDBAND)) { 4815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd > maxfd) 4825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = ufds[i].fd; 4835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLRDNORM|POLLIN)) 4845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(ufds[i].fd, &fds_read); 4855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLWRNORM|POLLOUT)) 4865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(ufds[i].fd, &fds_write); 4875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLRDBAND|POLLPRI)) 4885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(ufds[i].fd, &fds_err); 4895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 492e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef USE_WINSOCK 493e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* WinSock select() can't handle zero events. See the comment about this in 494e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_check_socket(). */ 495e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(fds_read.fd_count == 0 && fds_write.fd_count == 0 496e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET && fds_err.fd_count == 0) { 497e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = Curl_wait_ms(timeout_ms); 498e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return r; 499e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 500e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 501e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 5025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ptimeout = (timeout_ms < 0) ? NULL : &pending_tv; 5035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 5055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 5065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = pending_ms / 1000; 5075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = (pending_ms % 1000) * 1000; 5085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 5095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) { 5105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = 0; 5115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = 0; 5125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 5138f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo 5148f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#ifdef USE_WINSOCK 515e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = select((int)maxfd + 1, 516e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* WinSock select() can't handle fd_sets with zero bits set, so 517e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET don't give it such arguments. See the comment about this in 518e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_check_socket(). 519e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 520e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_read.fd_count ? &fds_read : NULL, 521e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_write.fd_count ? &fds_write : NULL, 5228f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo fds_err.fd_count ? &fds_err : NULL, ptimeout); 5238f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo#else 5248f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); 525e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 5265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 5275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 5285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 529cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes if(error && ERROR_NOT_EINTR(error)) 5305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 5315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 532cee0338be80bb81b15101686d6f60864455f1e6eElliott Hughes pending_ms = timeout_ms - ELAPSED_MS(); 533e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 534e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 5355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 536e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 5375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 5385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 5395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 5415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 5425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 5435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 5445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = 0; 546e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 5475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents = 0; 5485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd == CURL_SOCKET_BAD) 5495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen continue; 5505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(ufds[i].fd, &fds_read)) 5515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLIN; 5525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(ufds[i].fd, &fds_write)) 5535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLOUT; 5545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(ufds[i].fd, &fds_err)) 5555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLPRI; 5565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].revents != 0) 5575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r++; 5585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 5595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_POLL_FINE */ 5615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 5635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 5645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef TPF 5665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 5675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This is a replacement for select() on the TPF platform. 5685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * It is used whenever libcurl calls select(). 5695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * The call below to tpf_process_signals() is required because 5705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * TPF's select calls are not signal interruptible. 5715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 5725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values are the same as select's. 5735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 5745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenint tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes, 5755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set* excepts, struct timeval* tv) 5765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 5775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int rc; 5785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen rc = tpf_select_bsd(maxfds, reads, writes, excepts, tv); 5805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen tpf_process_signals(); 581e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return rc; 5825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 5835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* TPF */ 584