thanks again for your contribution! The patch seems ok to me. Could you please also provide a complete entry for the ChangeLog file?
> Subject: [PATCH] * gnutls.c fix infinite read timeout As a side note, if you would like to include the ChangeLog entry in the commit message, please keep a simple description of the change as the first line. Giuseppe Tim Ruehsen <[email protected]> writes: > Hi, > > I finally got --timeout=0 working together with gnutls. > > After all it is about two lines in wgnutls_peek(). > > I lost a few hours in debugging the polling/select/peek/blocking mechanism of > wget which came together with reading into gnutls. But who knows what it is > good for ;-) > > Tim > > From 20638ef4da3a53ddc962e36a2b1aba6a89da6dd0 Mon Sep 17 00:00:00 2001 > From: Tim Ruehsen <[email protected]> > Date: Fri, 18 May 2012 13:23:56 +0200 > > --- > src/gnutls.c | 30 +++++++++++++++++++----------- > 1 file changed, 19 insertions(+), 11 deletions(-) > > diff --git a/src/gnutls.c b/src/gnutls.c > index 9847ab4..32c6d17 100644 > --- a/src/gnutls.c > +++ b/src/gnutls.c > @@ -216,11 +216,11 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, > void *arg, double timeout) > { > double next_timeout = 0; > if (timeout) > - { > - next_timeout = timeout - ptimer_measure (timer); > - if (next_timeout < 0) > - break; > - } > + { > + next_timeout = timeout - ptimer_measure (timer); > + if (next_timeout < 0) > + break; > + } > > ret = GNUTLS_E_AGAIN; > if (timeout == 0 || gnutls_record_check_pending (ctx->session) > @@ -294,8 +294,12 @@ static int > wgnutls_poll (int fd, double timeout, int wait_for, void *arg) > { > struct wgnutls_transport_context *ctx = arg; > - return ctx->peeklen || gnutls_record_check_pending (ctx->session) > - || select_fd (fd, timeout, wait_for); > + > + if (timeout) > + return ctx->peeklen || gnutls_record_check_pending (ctx->session) > + || select_fd (fd, timeout, wait_for); > + else > + return ctx->peeklen || gnutls_record_check_pending (ctx->session); > } > > static int > @@ -304,15 +308,19 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) > int read = 0; > struct wgnutls_transport_context *ctx = arg; > int offset = MIN (bufsize, ctx->peeklen); > - if (bufsize > sizeof ctx->peekbuf) > - bufsize = sizeof ctx->peekbuf; > > if (ctx->peeklen) > - memcpy (buf, ctx->peekbuf, offset); > + { > + memcpy (buf, ctx->peekbuf, offset); > + return offset; > + } > + > + if (bufsize > sizeof ctx->peekbuf) > + bufsize = sizeof ctx->peekbuf; > > if (bufsize > offset) > { > - if (gnutls_record_check_pending (ctx->session) <= 0 > + if (opt.read_timeout && gnutls_record_check_pending (ctx->session) == 0 > && select_fd (fd, 0.0, WAIT_FOR_READ) <= 0) > read = 0; > else
