Marked all unused args on non-W32 platforms.
[gnupg.git] / common / http.c
index 3720b00..96e2a9e 100644 (file)
@@ -6,7 +6,7 @@
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /* Simple HTTP client implementation.  We try to keep the code as
   - With HTTP_USE_ESTREAM defined, all I/O is done through estream.
   - With HTTP_USE_GNUTLS support for https is provided (this also
     requires estream).
+  - With HTTP_NO_WSASTARTUP the socket initialization is not done
+    under Windows.  This is useful if the socket layer has already
+    been initialized elsewhere.  This also avoids the installation of
+    an exit handler to cleanup the socket layer.
 */
 
 #ifdef HAVE_CONFIG_H
 #include <string.h>
 #include <ctype.h>
 #include <errno.h>
+#include <unistd.h>
 
 #ifdef HAVE_W32_SYSTEM
 # include <windows.h>
 #else /*!HAVE_W32_SYSTEM*/
-# include <unistd.h>
 # include <sys/types.h>
 # include <sys/socket.h>
 # include <sys/time.h>
@@ -70,6 +72,7 @@ typedef gnutls_transport_ptr gnutls_transport_ptr_t;
 #endif
 
 #include "util.h"
+#include "i18n.h"
 #include "http.h"
 #ifdef USE_DNS_SRV
 #include "srv.h"
@@ -199,7 +202,7 @@ struct http_context_s
 
 
 \f
-#ifdef HAVE_W32_SYSTEM
+#if defined(HAVE_W32_SYSTEM) && !defined(HTTP_NO_WSASTARTUP)
 
 #if GNUPG_MAJOR_VERSION == 1
 #define REQ_WINSOCK_MAJOR  1
@@ -235,7 +238,7 @@ init_sockets (void)
        || HIBYTE(wsdata.wVersion) != REQ_WINSOCK_MINOR ) 
     {
       log_error ("socket library version is %x.%x - but %d.%d needed\n",
-                 LOBYTE(wsdata.wVersion), HIBYTE(wsdata.wVersion)
+                 LOBYTE(wsdata.wVersion), HIBYTE(wsdata.wVersion),
                  REQ_WINSOCK_MAJOR, REQ_WINSOCK_MINOR);
       WSACleanup();
       return;
@@ -243,7 +246,7 @@ init_sockets (void)
   atexit ( deinit_sockets );
   initialized = 1;
 }
-#endif /*HAVE_W32_SYSTEM*/
+#endif /*HAVE_W32_SYSTEM && !HTTP_NO_WSASTARTUP*/
 
 
 
@@ -301,6 +304,8 @@ http_register_tls_callback ( gpg_error_t (*cb) (http_t, void *, int) )
 {
 #ifdef HTTP_USE_GNUTLS
   tls_callback = (gpg_error_t (*) (http_t, gnutls_session_t, int))cb;
+#else
+  (void)cb;
 #endif  
 }
 
@@ -393,7 +398,16 @@ http_wait_response (http_t hd)
   else
 #endif /*HTTP_USE_ESTREAM*/
     {
+#ifdef HAVE_W32_SYSTEM
+      HANDLE handle = (HANDLE)hd->sock;
+      if (!DuplicateHandle (GetCurrentProcess(), handle,
+                           GetCurrentProcess(), &handle, 0,
+                           TRUE, DUPLICATE_SAME_ACCESS ))
+       return gpg_error_from_syserror ();
+      hd->sock = (int)handle;
+#else
       hd->sock = dup (hd->sock);
+#endif
       if (hd->sock == -1)
         return gpg_error_from_syserror ();
     }
@@ -583,8 +597,6 @@ do_parse_uri (parsed_uri_t uri, int only_local_part)
           uri->use_tls = 1;
         }
 #endif
-      else if (!strcmp (uri->scheme, "hkp"))
-        uri->port = 11371;
       else
        return gpg_error (GPG_ERR_INV_URI); /* Unsupported scheme */
 
@@ -1489,7 +1501,7 @@ start_server ()
 }
 #endif
 
-/* Actually connect to a server.  Returns the file descripto or -1 on
+/* Actually connect to a server.  Returns the file descriptor or -1 on
    error.  ERRNO is set on error. */
 static int
 connect_server (const char *server, unsigned short port,
@@ -1505,7 +1517,9 @@ connect_server (const char *server, unsigned short port,
 #ifdef HAVE_W32_SYSTEM
   unsigned long inaddr;
 
-  init_sockets();
+#ifndef HTTP_NO_WSASTARTUP
+  init_sockets ();
+#endif
   /* Win32 gethostbyname doesn't handle IP addresses internally, so we
      try inet_addr first on that platform only. */
   inaddr = inet_addr(server);
@@ -1694,7 +1708,7 @@ write_server (int sock, const char *data, size_t length)
       if ( nwritten == SOCKET_ERROR ) 
         {
           log_info ("network write failed: ec=%d\n", (int)WSAGetLastError ());
-          return G10ERR_NETWORK;
+          return gpg_error (GPG_ERR_NETWORK);
         }
 #else /*!HAVE_W32_SYSTEM*/
       int nwritten = write (sock, data, nleft);
@@ -1762,7 +1776,12 @@ cookie_read (void *cookie, void *buffer, size_t size)
     {
       do
         {
+#ifdef HAVE_W32_SYSTEM
+          /* Under Windows we need to use recv for a socket.  */
+          nread = recv (c->fd, buffer, size, 0);
+#else          
           nread = read (c->fd, buffer, size);
+#endif
         }
       while (nread == -1 && errno == EINTR);
     }
@@ -1830,14 +1849,14 @@ cookie_close (void *cookie)
   if (!c)
     return 0;
 
- #ifdef HTTP_USE_GNUTLS
+#ifdef HTTP_USE_GNUTLS
   if (c->tls_session && !c->keep_socket)
     {
       gnutls_bye (c->tls_session, GNUTLS_SHUT_RDWR);
     }
 #endif /*HTTP_USE_GNUTLS*/
   if (c->fd != -1 && !c->keep_socket)
-    close (c->fd);
+    sock_close (c->fd);
 
   xfree (c);
   return 0;