18
18
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
19
* KIND, either express or implied.
21
* $Id: select.c,v 1.48 2007-10-03 16:58:10 yangtse Exp $
21
* $Id: select.c,v 1.49 2007-11-05 09:45:09 bagder Exp $
22
22
***************************************************************************/
52
52
/* Winsock and TPF sockets are not in range [0..FD_SETSIZE-1] */
54
54
#if defined(USE_WINSOCK) || defined(TPF)
55
#define VERIFY_SOCK(x) do { } while (0)
55
#define VERIFY_SOCK(x) do { } while(0)
57
57
#define VALID_SOCK(s) (((s) >= 0) && ((s) < FD_SETSIZE))
58
58
#define VERIFY_SOCK(x) do { \
126
126
pending_tv.tv_usec = (pending_ms % 1000) * 1000;
127
127
r = select(0, NULL, NULL, NULL, &pending_tv);
128
128
#endif /* HAVE_POLL_FINE */
131
131
error = SOCKERRNO;
132
if ((error == EINVAL) || error_is_EINTR)
132
if((error == EINVAL) || error_is_EINTR)
134
134
pending_ms = timeout_ms - elapsed_ms;
138
138
#endif /* USE_WINSOCK */
197
197
#ifdef HAVE_POLL_FINE
200
if (readfd != CURL_SOCKET_BAD) {
200
if(readfd != CURL_SOCKET_BAD) {
201
201
pfd[num].fd = readfd;
202
202
pfd[num].events = POLLRDNORM|POLLIN|POLLRDBAND|POLLPRI;
203
203
pfd[num].revents = 0;
206
if (writefd != CURL_SOCKET_BAD) {
206
if(writefd != CURL_SOCKET_BAD) {
207
207
pfd[num].fd = writefd;
208
208
pfd[num].events = POLLWRNORM|POLLOUT;
209
209
pfd[num].revents = 0;
216
else if (!timeout_ms)
218
218
r = poll(pfd, num, pending_ms);
221
221
error = SOCKERRNO;
222
if ((error == EINVAL) || error_is_EINTR)
222
if((error == EINVAL) || error_is_EINTR)
224
if (timeout_ms > 0) {
225
225
pending_ms = timeout_ms - elapsed_ms;
238
if (readfd != CURL_SOCKET_BAD) {
239
if (pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP))
238
if(readfd != CURL_SOCKET_BAD) {
239
if(pfd[num].revents & (POLLRDNORM|POLLIN|POLLERR|POLLHUP))
240
240
ret |= CURL_CSELECT_IN;
241
if (pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL))
241
if(pfd[num].revents & (POLLRDBAND|POLLPRI|POLLNVAL))
242
242
ret |= CURL_CSELECT_ERR;
245
if (writefd != CURL_SOCKET_BAD) {
246
if (pfd[num].revents & (POLLWRNORM|POLLOUT))
245
if(writefd != CURL_SOCKET_BAD) {
246
if(pfd[num].revents & (POLLWRNORM|POLLOUT))
247
247
ret |= CURL_CSELECT_OUT;
248
if (pfd[num].revents & (POLLERR|POLLHUP|POLLNVAL))
248
if(pfd[num].revents & (POLLERR|POLLHUP|POLLNVAL))
249
249
ret |= CURL_CSELECT_ERR;
257
257
maxfd = (curl_socket_t)-1;
259
259
FD_ZERO(&fds_read);
260
if (readfd != CURL_SOCKET_BAD) {
260
if(readfd != CURL_SOCKET_BAD) {
261
261
VERIFY_SOCK(readfd);
262
262
FD_SET(readfd, &fds_read);
263
263
FD_SET(readfd, &fds_err);
267
267
FD_ZERO(&fds_write);
268
if (writefd != CURL_SOCKET_BAD) {
268
if(writefd != CURL_SOCKET_BAD) {
269
269
VERIFY_SOCK(writefd);
270
270
FD_SET(writefd, &fds_write);
271
271
FD_SET(writefd, &fds_err);
276
276
ptimeout = (timeout_ms < 0) ? NULL : &pending_tv;
279
if (timeout_ms > 0) {
280
280
pending_tv.tv_sec = pending_ms / 1000;
281
281
pending_tv.tv_usec = (pending_ms % 1000) * 1000;
283
else if (!timeout_ms) {
283
else if(!timeout_ms) {
284
284
pending_tv.tv_sec = 0;
285
285
pending_tv.tv_usec = 0;
287
287
r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
290
290
error = SOCKERRNO;
291
if ((error == EINVAL) || (error == EBADF) || error_is_EINTR)
291
if((error == EINVAL) || (error == EBADF) || error_is_EINTR)
293
if (timeout_ms > 0) {
294
294
pending_ms = timeout_ms - elapsed_ms;
306
if (readfd != CURL_SOCKET_BAD) {
307
if (FD_ISSET(readfd, &fds_read))
306
if(readfd != CURL_SOCKET_BAD) {
307
if(FD_ISSET(readfd, &fds_read))
308
308
ret |= CURL_CSELECT_IN;
309
if (FD_ISSET(readfd, &fds_err))
309
if(FD_ISSET(readfd, &fds_err))
310
310
ret |= CURL_CSELECT_ERR;
312
if (writefd != CURL_SOCKET_BAD) {
313
if (FD_ISSET(writefd, &fds_write))
312
if(writefd != CURL_SOCKET_BAD) {
313
if(FD_ISSET(writefd, &fds_write))
314
314
ret |= CURL_CSELECT_OUT;
315
if (FD_ISSET(writefd, &fds_err))
315
if(FD_ISSET(writefd, &fds_err))
316
316
ret |= CURL_CSELECT_ERR;
381
381
#ifdef HAVE_POLL_FINE
386
else if (!timeout_ms)
388
388
r = poll(ufds, nfds, pending_ms);
391
391
error = SOCKERRNO;
392
if ((error == EINVAL) || error_is_EINTR)
392
if((error == EINVAL) || error_is_EINTR)
394
if (timeout_ms > 0) {
395
395
pending_ms = timeout_ms - elapsed_ms;
401
401
#else /* HAVE_POLL_FINE */
408
408
for (i = 0; i < nfds; i++) {
409
409
ufds[i].revents = 0;
410
if (ufds[i].fd == CURL_SOCKET_BAD)
410
if(ufds[i].fd == CURL_SOCKET_BAD)
412
412
VERIFY_SOCK(ufds[i].fd);
413
if (ufds[i].events & (POLLIN|POLLOUT|POLLPRI|
413
if(ufds[i].events & (POLLIN|POLLOUT|POLLPRI|
414
414
POLLRDNORM|POLLWRNORM|POLLRDBAND)) {
415
if (ufds[i].fd > maxfd)
415
if(ufds[i].fd > maxfd)
416
416
maxfd = ufds[i].fd;
417
if (ufds[i].events & (POLLRDNORM|POLLIN))
417
if(ufds[i].events & (POLLRDNORM|POLLIN))
418
418
FD_SET(ufds[i].fd, &fds_read);
419
if (ufds[i].events & (POLLWRNORM|POLLOUT))
419
if(ufds[i].events & (POLLWRNORM|POLLOUT))
420
420
FD_SET(ufds[i].fd, &fds_write);
421
if (ufds[i].events & (POLLRDBAND|POLLPRI))
421
if(ufds[i].events & (POLLRDBAND|POLLPRI))
422
422
FD_SET(ufds[i].fd, &fds_err);
426
426
ptimeout = (timeout_ms < 0) ? NULL : &pending_tv;
429
if (timeout_ms > 0) {
430
430
pending_tv.tv_sec = pending_ms / 1000;
431
431
pending_tv.tv_usec = (pending_ms % 1000) * 1000;
433
else if (!timeout_ms) {
433
else if(!timeout_ms) {
434
434
pending_tv.tv_sec = 0;
435
435
pending_tv.tv_usec = 0;
437
437
r = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, ptimeout);
440
440
error = SOCKERRNO;
441
if ((error == EINVAL) || (error == EBADF) || error_is_EINTR)
441
if((error == EINVAL) || (error == EBADF) || error_is_EINTR)
443
if (timeout_ms > 0) {
444
444
pending_ms = timeout_ms - elapsed_ms;
456
456
for (i = 0; i < nfds; i++) {
457
457
ufds[i].revents = 0;
458
if (ufds[i].fd == CURL_SOCKET_BAD)
458
if(ufds[i].fd == CURL_SOCKET_BAD)
460
if (FD_ISSET(ufds[i].fd, &fds_read))
460
if(FD_ISSET(ufds[i].fd, &fds_read))
461
461
ufds[i].revents |= POLLIN;
462
if (FD_ISSET(ufds[i].fd, &fds_write))
462
if(FD_ISSET(ufds[i].fd, &fds_write))
463
463
ufds[i].revents |= POLLOUT;
464
if (FD_ISSET(ufds[i].fd, &fds_err))
464
if(FD_ISSET(ufds[i].fd, &fds_err))
465
465
ufds[i].revents |= POLLPRI;
466
if (ufds[i].revents != 0)
466
if(ufds[i].revents != 0)