diff options
| author | Yang Tse <yangsita@gmail.com> | 2008-02-20 17:17:18 +0000 | 
|---|---|---|
| committer | Yang Tse <yangsita@gmail.com> | 2008-02-20 17:17:18 +0000 | 
| commit | 064eebeaf1c0fa4db0300e54ecd0b839711ffbbe (patch) | |
| tree | bf7fc8cc1dd71591df9d0377e1a5a47953583af4 /tests/server/sockfilt.c | |
| parent | 4ae644e427a685f5777c93130c3d5831d168c5b4 (diff) | |
Avoid timeout restart when signal caught while awaiting socket and stdin events
Diffstat (limited to 'tests/server/sockfilt.c')
| -rw-r--r-- | tests/server/sockfilt.c | 24 | 
1 files changed, 19 insertions, 5 deletions
| 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: | 
