15ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*************************************************************************** 25ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * _ _ ____ _ 35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Project ___| | | | _ \| | 45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * / __| | | | |_) | | 55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * | (__| |_| | _ <| |___ 65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * \___|\___/|_| \_\_____| 75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2015, 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 12d15eaac64ca1a7244824d660ea84e8815a23d058Alex 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 */ 545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define elapsed_ms (int)curlx_tvdiff(curlx_tvnow(), initial_tv) 565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 57e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint Curl_ack_eintr = 0; 58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define error_not_EINTR (Curl_ack_eintr || error != EINTR) 595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Internal function used for waiting a specific amount of ms 625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * in Curl_socket_ready() and Curl_poll() when no file descriptor 635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * is provided to wait on, just being used to delay execution. 645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * WinSock select() and poll() timeout mechanisms need a valid 655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * socket descriptor in a not null file descriptor set to work. 665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Waiting indefinitely with this function is not allowed, a 675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * zero or negative timeout value will return immediately. 685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Timeout resolution, accuracy, as well as maximum supported 695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * value is system dependent, neither factor is a citical issue 705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * for the intended use of this function in the library. 715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values: 735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * -1 = system call error, invalid timeout value, or interrupted 745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 0 = specified timeout has elapsed 755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 76e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint Curl_wait_ms(int timeout_ms) 775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if !defined(MSDOS) && !defined(USE_WINSOCK) 795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef HAVE_POLL_FINE 805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval pending_tv; 815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval initial_tv; 835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int pending_ms; 845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int error; 855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int r = 0; 875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(!timeout_ms) 895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms < 0) { 915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen SET_SOCKERRNO(EINVAL); 925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(MSDOS) 955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen delay(timeout_ms); 965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#elif defined(USE_WINSOCK) 975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen Sleep(timeout_ms); 985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms; 1005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen initial_tv = curlx_tvnow(); 1015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 1025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(HAVE_POLL_FINE) 1035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = poll(NULL, 0, pending_ms); 1045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 1055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = pending_ms / 1000; 1065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = (pending_ms % 1000) * 1000; 1075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = select(0, NULL, NULL, NULL, &pending_tv); 1085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_POLL_FINE */ 1095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 1105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 1115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 1125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(error && error_not_EINTR) 1135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 1145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms - elapsed_ms; 115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 116e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 1175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 118e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 1195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 1205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* USE_WINSOCK */ 1215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r) 1225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = -1; 1235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 1245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 1255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 127e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Wait for read or write events on a set of file descriptors. It uses poll() 128e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * when a fine poll() is available, in order to avoid limits with FD_SETSIZE, 129e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * otherwise select() is used. An error is returned if select() is being used 130e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * and a file descriptor is too large for FD_SETSIZE. 131e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 1325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * A negative timeout value makes this function wait indefinitely, 1335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * unles no valid file descriptor is given, when this happens the 1345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * negative timeout is ignored and the function times out immediately. 1355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 1365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values: 1375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * -1 = system call error or fd >= FD_SETSIZE 1385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 0 = timeout 139e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * [bitmask] = action as described below 140e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 141e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_IN - first socket is readable 142e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_IN2 - second socket is readable 143e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_OUT - write socket is writable 144e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * CURL_CSELECT_ERR - an error condition occurred 1455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 146e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint Curl_socket_check(curl_socket_t readfd0, /* two sockets to read from */ 147e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket_t readfd1, 148e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket_t writefd, /* socket to write to */ 149e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET long timeout_ms) /* milliseconds to wait */ 1505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 1515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_POLL_FINE 152e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct pollfd pfd[3]; 1535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int num; 1545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 1555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval pending_tv; 1565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval *ptimeout; 1575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_read; 1585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_write; 1595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_err; 1605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_socket_t maxfd; 1615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 162e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct timeval initial_tv = {0, 0}; 1635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int pending_ms = 0; 1645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int error; 1655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int r; 1665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int ret; 1675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 168e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if((readfd0 == CURL_SOCKET_BAD) && (readfd1 == CURL_SOCKET_BAD) && 169e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET (writefd == CURL_SOCKET_BAD)) { 170e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* no sockets, just wait */ 171e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = Curl_wait_ms((int)timeout_ms); 1725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 1735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 1745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed 1765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen time in this function does not need to be measured. This happens 1775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen when function is called with a zero timeout or a negative timeout 1785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen value indicating a blocking call should be performed. */ 1795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 181e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pending_ms = (int)timeout_ms; 1825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen initial_tv = curlx_tvnow(); 1835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 1845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_POLL_FINE 1865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num = 0; 188e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 189e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].fd = readfd0; 190e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].events = POLLRDNORM|POLLIN|POLLRDBAND|POLLPRI; 191e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].revents = 0; 192e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET num++; 193e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 194e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 195e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pfd[num].fd = readfd1; 1965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].events = POLLRDNORM|POLLIN|POLLRDBAND|POLLPRI; 1975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].revents = 0; 1985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num++; 1995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 2015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].fd = writefd; 2025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].events = POLLWRNORM|POLLOUT; 2035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pfd[num].revents = 0; 2045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num++; 2055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 2085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms < 0) 2095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = -1; 2105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) 2115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = 0; 2125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = poll(pfd, num, pending_ms); 2135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 2145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 2155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 2165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(error && error_not_EINTR) 2175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 2185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 219e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET pending_ms = (int)(timeout_ms - elapsed_ms); 220e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 221e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 2225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 223e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 2245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 2265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 2285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 2295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 2305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 2315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret = 0; 2335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num = 0; 234e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 2355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP)) 2365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_IN; 2375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL)) 2385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 2395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen num++; 2405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 241e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 242e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP)) 243e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_IN2; 244e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL)) 245e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_ERR; 246e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET num++; 247e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 2485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 2495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLWRNORM|POLLOUT)) 2505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_OUT; 2515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(pfd[num].revents & (POLLERR|POLLHUP|POLLNVAL)) 2525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 2535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return ret; 2565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else /* HAVE_POLL_FINE */ 2585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_err); 2605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = (curl_socket_t)-1; 2615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_read); 263e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 264e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET VERIFY_SOCK(readfd0); 265e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd0, &fds_read); 266e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd0, &fds_err); 267e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET maxfd = readfd0; 268e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 269e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 270e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET VERIFY_SOCK(readfd1); 271e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd1, &fds_read); 272e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET FD_SET(readfd1, &fds_err); 273e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 > maxfd) 274e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET maxfd = readfd1; 2755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_write); 2785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 2795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen VERIFY_SOCK(writefd); 2805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(writefd, &fds_write); 2815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(writefd, &fds_err); 2825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd > maxfd) 2835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = writefd; 2845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ptimeout = (timeout_ms < 0) ? NULL : &pending_tv; 2875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 2895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 2905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = pending_ms / 1000; 2915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = (pending_ms % 1000) * 1000; 2925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 2935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) { 2945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = 0; 2955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = 0; 2965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 297e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 298e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* WinSock select() must not be called with an fd_set that contains zero 299e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fd flags, or it will return WSAEINVAL. But, it also can't be called 300e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET with no fd_sets at all! From the documentation: 301e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 302e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Any two of the parameters, readfds, writefds, or exceptfds, can be 303e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET given as null. At least one must be non-null, and any non-null 304e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET descriptor set must contain at least one handle to a socket. 305e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 306e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET We know that we have at least one bit set in at least two fd_sets in 307e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET this case, but we may have no bits set in either fds_read or fd_write, 308e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET so check for that and handle it. Luckily, with WinSock, we can _also_ 309e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ask how many bits are set on an fd_set. 310e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 311e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET It is unclear why WinSock doesn't just handle this for us instead of 312e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET calling this an error. 313e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 314e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Note also that WinSock ignores the first argument, so we don't worry 315e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET about the fact that maxfd is computed incorrectly with WinSock (since 316e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_socket_t is unsigned in such cases and thus -1 is the largest 317e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET value). 318e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 319d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#ifdef USE_WINSOCK 320e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = select((int)maxfd + 1, 321e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_read.fd_count ? &fds_read : NULL, 322e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_write.fd_count ? &fds_write : NULL, 323e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET &fds_err, ptimeout); 324d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#else 325d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); 326d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#endif 327d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo 3285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 3295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 3305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 3315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(error && error_not_EINTR) 3325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 3335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 3345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms - elapsed_ms; 335e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 336e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 3375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 338e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 3395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 3405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 3415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 3435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 3445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 3455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 3465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret = 0; 348e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd0 != CURL_SOCKET_BAD) { 349e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd0, &fds_read)) 3505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_IN; 351e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd0, &fds_err)) 352e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_ERR; 353e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 354e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(readfd1 != CURL_SOCKET_BAD) { 355e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd1, &fds_read)) 356e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ret |= CURL_CSELECT_IN2; 357e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(FD_ISSET(readfd1, &fds_err)) 3585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 3595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 3605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(writefd != CURL_SOCKET_BAD) { 3615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(writefd, &fds_write)) 3625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_OUT; 3635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(writefd, &fds_err)) 3645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ret |= CURL_CSELECT_ERR; 3655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 3665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return ret; 3685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_POLL_FINE */ 3705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 3725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 3735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 3745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This is a wrapper around poll(). If poll() does not exist, then 3755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * select() is used instead. An error is returned if select() is 3765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * being used and a file descriptor is too large for FD_SETSIZE. 3775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * A negative timeout value makes this function wait indefinitely, 3785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * unles no valid file descriptor is given, when this happens the 3795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * negative timeout is ignored and the function times out immediately. 3805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 3815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values: 3825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * -1 = system call error or fd >= FD_SETSIZE 3835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 0 = timeout 3845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * N = number of structures with non zero revent fields 3855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 3865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenint Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms) 3875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 3885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef HAVE_POLL_FINE 3895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval pending_tv; 3905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval *ptimeout; 3915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_read; 3925ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_write; 3935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set fds_err; 3945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_socket_t maxfd; 3955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 396e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct timeval initial_tv = {0, 0}; 3975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen bool fds_none = TRUE; 3985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen unsigned int i; 3995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int pending_ms = 0; 4005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int error; 4015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int r; 4025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds) { 404e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 4055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd != CURL_SOCKET_BAD) { 4065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fds_none = FALSE; 4075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 4085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(fds_none) { 412e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = Curl_wait_ms(timeout_ms); 4135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 4145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* Avoid initial timestamp, avoid curlx_tvnow() call, when elapsed 4175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen time in this function does not need to be measured. This happens 4185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen when function is called with a zero timeout or a negative timeout 4195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen value indicating a blocking call should be performed. */ 4205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 4225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms; 4235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen initial_tv = curlx_tvnow(); 4245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_POLL_FINE 4275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 4295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms < 0) 4305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = -1; 4315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) 4325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = 0; 4335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = poll(ufds, nfds, pending_ms); 4345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 4355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 4365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 4375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(error && error_not_EINTR) 4385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 4395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 4405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms - elapsed_ms; 441e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 442e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 4435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 444e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 4455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 4475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 4495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 4505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 4515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 4525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 453e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 4545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd == CURL_SOCKET_BAD) 4555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen continue; 4565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].revents & POLLHUP) 4575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLIN; 4585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].revents & POLLERR) 4595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= (POLLIN|POLLOUT); 4605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else /* HAVE_POLL_FINE */ 4635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_read); 4655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_write); 4665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_ZERO(&fds_err); 4675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = (curl_socket_t)-1; 4685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 469e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 4705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents = 0; 4715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd == CURL_SOCKET_BAD) 4725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen continue; 4735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen VERIFY_SOCK(ufds[i].fd); 4745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLIN|POLLOUT|POLLPRI| 4755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen POLLRDNORM|POLLWRNORM|POLLRDBAND)) { 4765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd > maxfd) 4775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen maxfd = ufds[i].fd; 4785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLRDNORM|POLLIN)) 4795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(ufds[i].fd, &fds_read); 4805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLWRNORM|POLLOUT)) 4815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(ufds[i].fd, &fds_write); 4825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].events & (POLLRDBAND|POLLPRI)) 4835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen FD_SET(ufds[i].fd, &fds_err); 4845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 4865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 487e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef USE_WINSOCK 488e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* WinSock select() can't handle zero events. See the comment about this in 489e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_check_socket(). */ 490e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(fds_read.fd_count == 0 && fds_write.fd_count == 0 491e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET && fds_err.fd_count == 0) { 492e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = Curl_wait_ms(timeout_ms); 493e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return r; 494e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 495e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 496e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 4975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ptimeout = (timeout_ms < 0) ? NULL : &pending_tv; 4985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 4995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen do { 5005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 5015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = pending_ms / 1000; 5025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = (pending_ms % 1000) * 1000; 5035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 5045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else if(!timeout_ms) { 5055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_sec = 0; 5065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_tv.tv_usec = 0; 5075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 508d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo 509d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#ifdef USE_WINSOCK 510e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = select((int)maxfd + 1, 511e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* WinSock select() can't handle fd_sets with zero bits set, so 512e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET don't give it such arguments. See the comment about this in 513e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_check_socket(). 514e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 515e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_read.fd_count ? &fds_read : NULL, 516e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET fds_write.fd_count ? &fds_write : NULL, 517d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo fds_err.fd_count ? &fds_err : NULL, ptimeout); 518d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo#else 519d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout); 520e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 5215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r != -1) 5225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 5235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen error = SOCKERRNO; 5245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(error && error_not_EINTR) 5255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 5265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(timeout_ms > 0) { 5275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen pending_ms = timeout_ms - elapsed_ms; 528e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(pending_ms <= 0) { 529e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET r = 0; /* Simulate a "call timed out" case */ 5305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen break; 531e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 5325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 5335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } while(r == -1); 5345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r < 0) 5365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return -1; 5375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(r == 0) 5385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; 5395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r = 0; 541e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i = 0; i < nfds; i++) { 5425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents = 0; 5435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].fd == CURL_SOCKET_BAD) 5445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen continue; 5455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(ufds[i].fd, &fds_read)) 5465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLIN; 5475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(ufds[i].fd, &fds_write)) 5485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLOUT; 5495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(FD_ISSET(ufds[i].fd, &fds_err)) 5505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ufds[i].revents |= POLLPRI; 5515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(ufds[i].revents != 0) 5525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen r++; 5535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 5545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* HAVE_POLL_FINE */ 5565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return r; 5585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 5595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef TPF 5615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 5625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This is a replacement for select() on the TPF platform. 5635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * It is used whenever libcurl calls select(). 5645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * The call below to tpf_process_signals() is required because 5655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * TPF's select calls are not signal interruptible. 5665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 5675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Return values are the same as select's. 5685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 5695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenint tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes, 5705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen fd_set* excepts, struct timeval* tv) 5715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 5725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int rc; 5735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 5745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen rc = tpf_select_bsd(maxfds, reads, writes, excepts, tv); 5755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen tpf_process_signals(); 576e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return rc; 5775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 5785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* TPF */ 579