From 064eebeaf1c0fa4db0300e54ecd0b839711ffbbe Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Wed, 20 Feb 2008 17:17:18 +0000 Subject: Avoid timeout restart when signal caught while awaiting socket and stdin events --- tests/server/sockfilt.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'tests') diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c index aeefb23bd..5780e794f 100644 --- a/tests/server/sockfilt.c +++ b/tests/server/sockfilt.c @@ -164,6 +164,7 @@ static bool juggle(curl_socket_t *sockfdp, curl_socket_t listenfd, enum sockmode *mode) { + struct timeval initial_tv; struct timeval timeout; fd_set fds_read; fd_set fds_write; @@ -175,6 +176,8 @@ static bool juggle(curl_socket_t *sockfdp, ssize_t nread_socket; ssize_t bytes_written; ssize_t buffer_len; + long pending_ms; + long timeout_ms = 120 * 1000; /* 'buffer' is this excessively large only to be able to support things like test 1003 which tests exceedingly large server response lines */ @@ -188,9 +191,6 @@ static bool juggle(curl_socket_t *sockfdp, return FALSE; #endif - timeout.tv_sec = 120; - timeout.tv_usec = 0; - FD_ZERO(&fds_read); FD_ZERO(&fds_write); FD_ZERO(&fds_err); @@ -246,9 +246,23 @@ static bool juggle(curl_socket_t *sockfdp, } /* switch(*mode) */ + pending_ms = timeout_ms; + initial_tv = curlx_tvnow(); + do { - rc = select(maxfd + 1, &fds_read, &fds_write, &fds_err, &timeout); - } while((rc == -1) && (SOCKERRNO == EINTR)); + timeout.tv_sec = pending_ms / 1000; + timeout.tv_usec = (pending_ms % 1000) * 1000; + rc = select((int)maxfd + 1, &fds_read, &fds_write, &fds_err, &timeout); + if(rc != -1) + break; + if(SOCKERRNO != EINTR) + break; + pending_ms = timeout_ms - curlx_tvdiff(curlx_tvnow(), initial_tv); + if(pending_ms <= 0) { + rc = 0; + break; + } + } while(rc == -1); switch(rc) { case -1: -- cgit v1.2.3