]> sjero.net Git - wget/commitdiff
gnutls: do not call fcntl in a loop.
authorTim Ruehsen <tim.ruehsen@gmx.de>
Mon, 14 May 2012 12:52:44 +0000 (14:52 +0200)
committerGiuseppe Scrivano <gscrivano@gnu.org>
Mon, 14 May 2012 20:18:41 +0000 (22:18 +0200)
* gnutls.c (wgnutls_read_timeout): removed warnings, moved fcntl stuff
outside loop.

src/ChangeLog
src/gnutls.c

index 87e4b75e8b865d3e9244766a61a0f1c57b09035e..8c6f4c8086457114225d7318670b17bbfa5912cf 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-14  Tim Ruehsen  <tim.ruehsen@gmx.de>
+
+       * gnutls.c: wgnutls_read_timeout (wgnutls_read_timeout): removed
+       warnings, moved fcntl stuff outside loop.
+
 2012-05-13  Tim Ruehsen  <tim.ruehsen@gmx.de>
 
        * gnutls.c (credentials): Change type to
index 2b13875fb87c75966efaf41e92ca9eb6e42133a1..9847ab47b20de280a1bf048813d292bce8c9035a 100644 (file)
@@ -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;
 }