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,17 +139,7 @@ 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;
ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
if (ret < 0)
return ret;
#else
/* XXX: Assume it was blocking before. */
const int one = 1;
ret = ioctl (fd, FIONBIO, &one);
if (ret < 0)
return ret;
#endif #endif
timer = ptimer_new (); timer = ptimer_new ();
if (timer == 0) if (timer == 0)
@ -158,34 +148,56 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
do do
{ {
double timeout = timeout - ptimer_measure (timer); double next_timeout = timeout - ptimer_measure (timer);
if (timeout < 0) if (timeout && next_timeout < 0)
break; break;
ret = GNUTLS_E_AGAIN; ret = GNUTLS_E_AGAIN;
if (timeout == 0 || gnutls_record_check_pending (ctx->session) if (timeout == 0 || gnutls_record_check_pending (ctx->session)
|| select_fd (fd, timeout, WAIT_FOR_READ)) || select_fd (fd, next_timeout, WAIT_FOR_READ))
ret = gnutls_record_recv (ctx->session, buf, bufsize); {
if (timeout)
{
#ifdef F_GETFL
ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
if (ret < 0)
return ret;
#else
/* XXX: Assume it was blocking before. */
const int one = 1;
ret = ioctl (fd, FIONBIO, &one);
if (ret < 0)
return ret;
#endif
}
ret = gnutls_record_recv (ctx->session, buf, bufsize);
if (timeout)
{
int status;
#ifdef F_GETFL
status = fcntl (fd, F_SETFL, flags);
if (status < 0)
return status;
#else
const int zero = 0;
status = ioctl (fd, FIONBIO, &zero);
if (status < 0)
return status;
#endif
}
}
timed_out = timeout && ptimer_measure (timer) >= timeout; timed_out = timeout && ptimer_measure (timer) >= timeout;
} }
while (ret == GNUTLS_E_INTERRUPTED || (ret == GNUTLS_E_AGAIN && !timed_out)); while (ret == GNUTLS_E_INTERRUPTED || (ret == GNUTLS_E_AGAIN && !timed_out));
if (timeout) if (timeout)
{ ptimer_destroy (timer);
int status;
ptimer_destroy (timer); if (timeout && timed_out && ret == GNUTLS_E_AGAIN)
#ifdef F_GETFL errno = ETIMEDOUT;
status = fcntl (fd, F_SETFL, flags);
if (status < 0)
return status;
#else
const int zero = 0;
status = ioctl (fd, FIONBIO, &zero);
if (status < 0)
return status;
#endif
}
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)