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