From d19cc259cb9dadfa55f1065a4cdfe338eec28b9d Mon Sep 17 00:00:00 2001 From: Tim Ruehsen Date: Mon, 14 May 2012 14:52:44 +0200 Subject: [PATCH] gnutls: do not call fcntl in a loop. * gnutls.c (wgnutls_read_timeout): removed warnings, moved fcntl stuff outside loop. --- src/ChangeLog | 5 ++++ src/gnutls.c | 63 +++++++++++++++++++++++---------------------------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 87e4b75e..8c6f4c80 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-05-14 Tim Ruehsen + + * gnutls.c: wgnutls_read_timeout (wgnutls_read_timeout): removed + warnings, moved fcntl stuff outside loop. + 2012-05-13 Tim Ruehsen * gnutls.c (credentials): Change type to diff --git a/src/gnutls.c b/src/gnutls.c index 2b13875f..9847ab47 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -188,7 +188,7 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout) int flags = 0; #endif int ret = 0; - struct ptimer *timer; + struct ptimer *timer = NULL; struct wgnutls_transport_context *ctx = arg; int timed_out = 0; @@ -198,19 +198,27 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout) flags = fcntl (fd, F_GETFL, 0); if (flags < 0) return flags; + if (fcntl (fd, F_SETFL, flags | O_NONBLOCK)) + return -1; +#else + /* XXX: Assume it was blocking before. */ + const int one = 1; + if (ioctl (fd, FIONBIO, &one) < 0) + return -1; #endif + timer = ptimer_new (); - if (timer == 0) + if (timer == NULL) return -1; } do { - double next_timeout; - if (timeout > 0.0) + double next_timeout = 0; + if (timeout) { next_timeout = timeout - ptimer_measure (timer); - if (next_timeout < 0.0) + if (next_timeout < 0) break; } @@ -218,43 +226,28 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout) if (timeout == 0 || gnutls_record_check_pending (ctx->session) || select_fd (fd, next_timeout, WAIT_FOR_READ)) { - if (timeout) - { -#ifdef F_GETFL - if (fcntl (fd, F_SETFL, flags | O_NONBLOCK)) - break; -#else - /* XXX: Assume it was blocking before. */ - const int one = 1; - if (ioctl (fd, FIONBIO, &one) < 0) - break; -#endif - } - ret = gnutls_record_recv (ctx->session, buf, bufsize); - - if (timeout) - { -#ifdef F_GETFL - if (fcntl (fd, F_SETFL, flags) < 0) - break; -#else - const int zero = 0; - if (ioctl (fd, FIONBIO, &zero) < 0) - break; -#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)); if (timeout) - ptimer_destroy (timer); + { + ptimer_destroy (timer); + +#ifdef F_GETFL + if (fcntl (fd, F_SETFL, flags) < 0) + return -1; +#else + const int zero = 0; + if (ioctl (fd, FIONBIO, &zero) < 0) + return -1; +#endif - if (timeout && timed_out && ret == GNUTLS_E_AGAIN) - errno = ETIMEDOUT; + if (timed_out && ret == GNUTLS_E_AGAIN) + errno = ETIMEDOUT; + } return ret; } -- 2.39.2