1
0
mirror of https://github.com/moparisthebest/wget synced 2024-07-03 16:38:41 -04:00

Fix some other problems with GNU TLS and non blocking sockets.

This commit is contained in:
Giuseppe Scrivano 2011-08-30 16:43:25 +02:00
parent 66bbc5bc63
commit d23ce97885
2 changed files with 47 additions and 30 deletions

View File

@ -1,3 +1,8 @@
2011-08-30 Giuseppe Scrivano <gscrivano@gnu.org>
* gnutls.c (wgnutls_read_timeout): Use the non blocking socket only for
`gnutls_record_recv'. Set errno to ETIMEDOUT on a read timeout.
2011-08-29 Giuseppe Scrivano <gscrivano@gnu.org> 2011-08-29 Giuseppe Scrivano <gscrivano@gnu.org>
* gnutls.c (wgnutls_read_timeout): New function. * gnutls.c (wgnutls_read_timeout): New function.

View File

@ -139,8 +139,26 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
#ifdef F_GETFL #ifdef F_GETFL
flags = fcntl (fd, F_GETFL, 0); flags = fcntl (fd, F_GETFL, 0);
if (flags < 0) if (flags < 0)
return ret; return flags;
#endif
timer = ptimer_new ();
if (timer == 0)
return -1;
}
do
{
double next_timeout = timeout - ptimer_measure (timer);
if (timeout && next_timeout < 0)
break;
ret = GNUTLS_E_AGAIN;
if (timeout == 0 || gnutls_record_check_pending (ctx->session)
|| select_fd (fd, next_timeout, WAIT_FOR_READ))
{
if (timeout)
{
#ifdef F_GETFL
ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK); ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -151,30 +169,13 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
if (ret < 0) if (ret < 0)
return ret; return ret;
#endif #endif
timer = ptimer_new ();
if (timer == 0)
return -1;
} }
do
{
double timeout = timeout - ptimer_measure (timer);
if (timeout < 0)
break;
ret = GNUTLS_E_AGAIN;
if (timeout == 0 || gnutls_record_check_pending (ctx->session)
|| select_fd (fd, timeout, WAIT_FOR_READ))
ret = gnutls_record_recv (ctx->session, buf, bufsize); ret = gnutls_record_recv (ctx->session, buf, bufsize);
timed_out = timeout && ptimer_measure (timer) >= timeout;
}
while (ret == GNUTLS_E_INTERRUPTED || (ret == GNUTLS_E_AGAIN && !timed_out));
if (timeout) if (timeout)
{ {
int status; int status;
ptimer_destroy (timer);
#ifdef F_GETFL #ifdef F_GETFL
status = fcntl (fd, F_SETFL, flags); status = fcntl (fd, F_SETFL, flags);
if (status < 0) if (status < 0)
@ -186,6 +187,17 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
return status; return status;
#endif #endif
} }
}
timed_out = timeout && ptimer_measure (timer) >= timeout;
}
while (ret == GNUTLS_E_INTERRUPTED || (ret == GNUTLS_E_AGAIN && !timed_out));
if (timeout)
ptimer_destroy (timer);
if (timeout && timed_out && ret == GNUTLS_E_AGAIN)
errno = ETIMEDOUT;
return ret; return ret;
} }
@ -259,7 +271,7 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
read = 0; read = 0;
else else
read = wgnutls_read_timeout (fd, buf + offset, bufsize - offset, read = wgnutls_read_timeout (fd, buf + offset, bufsize - offset,
ctx->session, opt.read_timeout); ctx, opt.read_timeout);
if (read < 0) if (read < 0)
{ {
if (offset) if (offset)