]> sjero.net Git - wget/blobdiff - src/gnutls.c
gnutls: Remove two unused variables.
[wget] / src / gnutls.c
index 064410737bcf0d857783a0bc43986e532c20050b..2a1d22b9ed3ad91a942d5a0261a961e776b6371d 100644 (file)
@@ -48,6 +48,8 @@ as that of the covered work.  */
 #include "ptimer.h"
 #include "ssl.h"
 
+#include <sys/fcntl.h>
+
 #ifdef WIN32
 # include "w32sock.h"
 #endif
@@ -61,6 +63,13 @@ static gnutls_certificate_credentials credentials;
 bool
 ssl_init ()
 {
+  /* Becomes true if GnuTLS is initialized. */
+  static bool ssl_initialized = false;
+
+  /* GnuTLS should be initialized only once. */
+  if (ssl_initialized)
+    return true;
+
   const char *ca_directory;
   DIR *dir;
 
@@ -102,6 +111,9 @@ ssl_init ()
   if (opt.ca_cert)
     gnutls_certificate_set_x509_trust_file (credentials, opt.ca_cert,
                                             GNUTLS_X509_FMT_PEM);
+
+  ssl_initialized = true;
+
   return true;
 }
 
@@ -139,17 +151,7 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
 #ifdef F_GETFL
       flags = fcntl (fd, F_GETFL, 0);
       if (flags < 0)
-        return ret;
-
-      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;
+        return flags;
 #endif
       timer = ptimer_new ();
       if (timer == 0)
@@ -158,34 +160,56 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
 
   do
     {
-      double timeout = timeout - ptimer_measure (timer);
-      if (timeout < 0)
+      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, timeout, WAIT_FOR_READ))
-        ret = gnutls_record_recv (ctx->session, buf, bufsize);
+          || select_fd (fd, next_timeout, WAIT_FOR_READ))
+        {
+          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
+            }
 
-      timed_out = timeout && ptimer_measure (timer) >= timeout;
-    }
-  while (ret == GNUTLS_E_INTERRUPTED || (ret == GNUTLS_E_AGAIN && !timed_out));
+          ret = gnutls_record_recv (ctx->session, buf, bufsize);
 
-  if (timeout)
-    {
-      int status;
-      ptimer_destroy (timer);
+          if (timeout)
+            {
+              int status;
 #ifdef F_GETFL
-      status = fcntl (fd, F_SETFL, flags);
-      if (status < 0)
-        return status;
+              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;
+              const int zero = 0;
+              status = ioctl (fd, FIONBIO, &zero);
+              if (status < 0)
+                return status;
 #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;
 }
@@ -193,11 +217,7 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
 static int
 wgnutls_read (int fd, char *buf, int bufsize, void *arg)
 {
-#ifdef F_GETFL
-  int flags = 0;
-#endif
   int ret = 0;
-  struct ptimer *timer;
   struct wgnutls_transport_context *ctx = arg;
 
   if (ctx->peeklen)
@@ -259,7 +279,7 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg)
         read = 0;
       else
         read = wgnutls_read_timeout (fd, buf + offset, bufsize - offset,
-                                     ctx->session, opt.read_timeout);
+                                     ctx, opt.read_timeout);
       if (read < 0)
         {
           if (offset)