]> sjero.net Git - wget/blobdiff - src/gnutls.c
Fix some compiler warnings.
[wget] / src / gnutls.c
index 2db5a90c5806d65b6d45eaf9b1dc45e66ed0416b..7cc2e7187f4e6d0b2827ebf3c87c89e82aaecb9b 100644 (file)
@@ -54,6 +54,22 @@ as that of the covered work.  */
 # include "w32sock.h"
 #endif
 
+#include "host.h"
+
+static int
+key_type_to_gnutls_type (enum keyfile_type type)
+{
+  switch (type)
+    {
+    case keyfile_pem:
+      return GNUTLS_X509_FMT_PEM;
+    case keyfile_asn1:
+      return GNUTLS_X509_FMT_DER;
+    default:
+      abort ();
+    }
+}
+
 /* Note: some of the functions private to this file have names that
    begin with "wgnutls_" (e.g. wgnutls_read) so that they wouldn't be
    confused with actual gnutls functions -- such as the gnutls_read
@@ -61,7 +77,7 @@ as that of the covered work.  */
 
 static gnutls_certificate_credentials credentials;
 bool
-ssl_init ()
+ssl_init (void)
 {
   /* Becomes true if GnuTLS is initialized. */
   static bool ssl_initialized = false;
@@ -108,6 +124,36 @@ ssl_init ()
       closedir (dir);
     }
 
+  /* Use the private key from the cert file unless otherwise specified. */
+  if (opt.cert_file && !opt.private_key)
+    {
+      opt.private_key = opt.cert_file;
+      opt.private_key_type = opt.cert_type;
+    }
+  /* Use the cert from the private key file unless otherwise specified. */
+  if (!opt.cert_file && opt.private_key)
+    {
+      opt.cert_file = opt.private_key;
+      opt.cert_type = opt.private_key_type;
+    }
+
+  if (opt.cert_file && opt.private_key)
+    {
+      int type;
+      if (opt.private_key_type != opt.cert_type)
+       {
+         /* GnuTLS can't handle this */
+         logprintf (LOG_NOTQUIET, _("ERROR: GnuTLS requires the key and the \
+cert to be of the same type.\n"));
+       }
+
+      type = key_type_to_gnutls_type (opt.private_key_type);
+
+      gnutls_certificate_set_x509_key_file (credentials, opt.cert_file,
+                                           opt.private_key,
+                                           type);
+    }
+
   if (opt.ca_cert)
     gnutls_certificate_set_x509_trust_file (credentials, opt.ca_cert,
                                             GNUTLS_X509_FMT_PEM);
@@ -175,15 +221,13 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
           if (timeout)
             {
 #ifdef F_GETFL
-              ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
-              if (ret < 0)
-                return ret;
+              if (fcntl (fd, F_SETFL, flags | O_NONBLOCK))
+               break;
 #else
               /* XXX: Assume it was blocking before.  */
               const int one = 1;
-              ret = ioctl (fd, FIONBIO, &one);
-              if (ret < 0)
-                return ret;
+              if (ioctl (fd, FIONBIO, &one) < 0)
+               break;
 #endif
             }
 
@@ -191,16 +235,13 @@ wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
 
           if (timeout)
             {
-              int status;
 #ifdef F_GETFL
-              status = fcntl (fd, F_SETFL, flags);
-              if (status < 0)
-                return status;
+              if (fcntl (fd, F_SETFL, flags) < 0)
+               break;
 #else
               const int zero = 0;
-              status = ioctl (fd, FIONBIO, &zero);
-              if (status < 0)
-                return status;
+              if (ioctl (fd, FIONBIO, &zero) < 0)
+               break;
 #endif
             }
         }
@@ -330,12 +371,20 @@ static struct transport_implementation wgnutls_transport =
 };
 
 bool
-ssl_connect_wget (int fd)
+ssl_connect_wget (int fd, const char *hostname)
 {
   struct wgnutls_transport_context *ctx;
   gnutls_session session;
   int err;
   gnutls_init (&session, GNUTLS_CLIENT);
+
+  /* We set the server name but only if it's not an IP address. */
+  if (! is_valid_ip_address (hostname))
+    {
+      gnutls_server_name_set (session, GNUTLS_NAME_DNS, hostname,
+                             strlen (hostname));
+    }
+
   gnutls_set_default_priority (session);
   gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, credentials);
 #ifndef FD_TO_SOCKET