]> sjero.net Git - wget/blobdiff - src/mswindows.c
Fix build when libpsl is not available
[wget] / src / mswindows.c
index de031cb0117c2aeae3ea7909e4790ad0acb3a58c..179773e05fccfd99a9d566b6385540ca0ddbc9c5 100644 (file)
@@ -1,6 +1,7 @@
 /* mswindows.c -- Windows-specific support
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+   Inc.
 
 This file is part of GNU Wget.
 
@@ -17,28 +18,28 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with Wget.  If not, see <http://www.gnu.org/licenses/>.
 
-In addition, as a special exception, the Free Software Foundation
-gives permission to link the code of its release of Wget with the
-OpenSSL project's "OpenSSL" library (or with modified versions of it
-that use the same license as the "OpenSSL" library), and distribute
-the linked executables.  You must obey the GNU General Public License
-in all respects for all of the code used other than "OpenSSL".  If you
-modify this file, you may extend this exception to your version of the
-file, but you are not obligated to do so.  If you do not wish to do
-so, delete this exception statement from your version.  */
+Additional permission under GNU GPL version 3 section 7
 
-#include <config.h>
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work.  */
+
+#define INHIBIT_WRAP /* avoid wrapping of socket, bind, ... */
+
+#include "wget.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
 #include <errno.h>
 #include <math.h>
 
-#define INHIBIT_WRAP /* avoid wrapping of socket, bind, ... */
 
-#include "wget.h"
 #include "utils.h"
 #include "url.h"
 
@@ -59,7 +60,7 @@ void log_request_redirect_output (const char *);
 void
 xsleep (double seconds)
 {
-#ifdef HAVE_USLEEP
+#if defined(HAVE_USLEEP) && defined(HAVE_SLEEP)
   if (seconds > 1000)
     {
       /* Explained in utils.c. */
@@ -73,7 +74,7 @@ xsleep (double seconds)
 }
 
 void
-windows_main (int *argc, char **argv, char **exec_name)
+windows_main (char **exec_name)
 {
   char *p;
 
@@ -87,6 +88,7 @@ windows_main (int *argc, char **argv, char **exec_name)
 static void
 ws_cleanup (void)
 {
+  xfree ((char*)exec_name);
   WSACleanup ();
 }
 
@@ -155,7 +157,7 @@ fake_fork_child (void)
   event = info->event;
 
   info->logfile_changed = false;
-  if (!opt.lfilename)
+  if (!opt.lfilename && (!opt.quiet || opt.server_response))
     {
       /* See utils:fork_to_background for explanation. */
       FILE *new_log_fp = unique_create (DEFAULT_LOGFILE, false, &opt.lfilename);
@@ -289,7 +291,7 @@ fake_fork (void)
 
   printf (_("Continuing in background, pid %lu.\n"), pi.dwProcessId);
   if (info->logfile_changed)
-    printf (_("Output will be written to `%s'.\n"), info->lfilename);
+    printf (_("Output will be written to %s.\n"), quote (info->lfilename));
 
   UnmapViewOfFile (info);
 
@@ -321,7 +323,7 @@ fork_to_background (void)
   rv = fake_fork_child ();
   if (rv < 0)
     {
-      fprintf (stderr, "fake_fork_child() failed\n");
+      fprintf (stderr, _("fake_fork_child() failed\n"));
       abort ();
     }
   else if (rv == 0)
@@ -329,7 +331,7 @@ fork_to_background (void)
       /* We're the parent.  */
       fake_fork ();
       /* If fake_fork() returns, it failed.  */
-      fprintf (stderr, "fake_fork() failed\n");
+      fprintf (stderr, _("fake_fork() failed\n"));
       abort ();
     }
   /* If we get here, we're the child.  */
@@ -570,124 +572,8 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg)
   thread_hnd = NULL;
   return rc;
 }
-\f
-/* Wget expects network calls such as connect, recv, send, etc., to set
-   errno on failure.  To achieve that, Winsock calls are wrapped with code
-   that, in case of error, sets errno to the value of WSAGetLastError().
-   In addition, we provide a wrapper around strerror, which recognizes
-   Winsock errors and prints the appropriate error message. */
-
-/* Define a macro that creates a function definition that wraps FUN into
-   a function that sets errno the way the rest of the code expects. */
-
-#define WRAP(fun, decl, call) int wrapped_##fun decl {  \
-  int retval = fun call;                                \
-  if (retval < 0)                                       \
-    errno = WSAGetLastError ();                         \
-  return retval;                                        \
-}
 
-WRAP (socket, (int domain, int type, int protocol), (domain, type, protocol))
-WRAP (bind, (int s, struct sockaddr *a, int alen), (s, a, alen))
-WRAP (connect, (int s, const struct sockaddr *a, int alen), (s, a, alen))
-WRAP (listen, (int s, int backlog), (s, backlog))
-WRAP (accept, (int s, struct sockaddr *a, int *alen), (s, a, alen))
-WRAP (recv, (int s, void *buf, int len, int flags), (s, buf, len, flags))
-WRAP (send, (int s, const void *buf, int len, int flags), (s, buf, len, flags))
-WRAP (select, (int n, fd_set *r, fd_set *w, fd_set *e, const struct timeval *tm),
-              (n, r, w, e, tm))
-WRAP (getsockname, (int s, struct sockaddr *n, int *nlen), (s, n, nlen))
-WRAP (getpeername, (int s, struct sockaddr *n, int *nlen), (s, n, nlen))
-WRAP (setsockopt, (int s, int level, int opt, const void *val, int len),
-                  (s, level, opt, val, len))
-WRAP (closesocket, (int s), (s))
-
-/* Return the text of the error message for Winsock error WSERR. */
-
-static const char *
-get_winsock_error (int wserr)
-{
-  switch (wserr) {
-  case WSAEINTR:           return "Interrupted system call";
-  case WSAEBADF:           return "Bad file number";
-  case WSAEACCES:          return "Permission denied";
-  case WSAEFAULT:          return "Bad address";
-  case WSAEINVAL:          return "Invalid argument";
-  case WSAEMFILE:          return "Too many open files";
-  case WSAEWOULDBLOCK:     return "Resource temporarily unavailable";
-  case WSAEINPROGRESS:     return "Operation now in progress";
-  case WSAEALREADY:        return "Operation already in progress";
-  case WSAENOTSOCK:        return "Socket operation on nonsocket";
-  case WSAEDESTADDRREQ:    return "Destination address required";
-  case WSAEMSGSIZE:        return "Message too long";
-  case WSAEPROTOTYPE:      return "Protocol wrong type for socket";
-  case WSAENOPROTOOPT:     return "Bad protocol option";
-  case WSAEPROTONOSUPPORT: return "Protocol not supported";
-  case WSAESOCKTNOSUPPORT: return "Socket type not supported";
-  case WSAEOPNOTSUPP:      return "Operation not supported";
-  case WSAEPFNOSUPPORT:    return "Protocol family not supported";
-  case WSAEAFNOSUPPORT:    return "Address family not supported by protocol family";
-  case WSAEADDRINUSE:      return "Address already in use";
-  case WSAEADDRNOTAVAIL:   return "Cannot assign requested address";
-  case WSAENETDOWN:        return "Network is down";
-  case WSAENETUNREACH:     return "Network is unreachable";
-  case WSAENETRESET:       return "Network dropped connection on reset";
-  case WSAECONNABORTED:    return "Software caused connection abort";
-  case WSAECONNRESET:      return "Connection reset by peer";
-  case WSAENOBUFS:         return "No buffer space available";
-  case WSAEISCONN:         return "Socket is already connected";
-  case WSAENOTCONN:        return "Socket is not connected";
-  case WSAESHUTDOWN:       return "Cannot send after socket shutdown";
-  case WSAETOOMANYREFS:    return "Too many references";
-  case WSAETIMEDOUT:       return "Connection timed out";
-  case WSAECONNREFUSED:    return "Connection refused";
-  case WSAELOOP:           return "Too many levels of symbolic links";
-  case WSAENAMETOOLONG:    return "File name too long";
-  case WSAEHOSTDOWN:       return "Host is down";
-  case WSAEHOSTUNREACH:    return "No route to host";
-  case WSAENOTEMPTY:       return "Not empty";
-  case WSAEPROCLIM:        return "Too many processes";
-  case WSAEUSERS:          return "Too many users";
-  case WSAEDQUOT:          return "Bad quota";
-  case WSAESTALE:          return "Something is stale";
-  case WSAEREMOTE:         return "Remote error";
-  case WSAEDISCON:         return "Disconnected";
-
-  /* Extended Winsock errors */
-  case WSASYSNOTREADY:     return "Winsock library is not ready";
-  case WSANOTINITIALISED:  return "Winsock library not initalised";
-  case WSAVERNOTSUPPORTED: return "Winsock version not supported";
-
-  case WSAHOST_NOT_FOUND: return "Host not found";
-  case WSATRY_AGAIN:      return "Host not found, try again";
-  case WSANO_RECOVERY:    return "Unrecoverable error in call to nameserver";
-  case WSANO_DATA:        return "No data record of requested type";
-
-  default:
-    return NULL;
-  }
-}
 
-/* Return the error message corresponding to ERR.  This is different
-   from Windows libc strerror() in that it handles Winsock errors
-   correctly.  */
-
-const char *
-windows_strerror (int err)
-{
-  const char *p;
-  if (err >= 0 && err < sys_nerr)
-    return strerror (err);
-  else if ((p = get_winsock_error (err)) != NULL)
-    return p;
-  else
-    {
-      static char buf[32];
-      snprintf (buf, sizeof (buf), "Unknown error %d (%#x)", err, err);
-      return buf;
-    }
-}
-\f
 #ifdef ENABLE_IPV6
 /* An inet_ntop implementation that uses WSAAddressToString.
    Prototype complies with POSIX 1003.1-2004.  This is only used under
@@ -729,3 +615,40 @@ inet_ntop (int af, const void *src, char *dst, socklen_t cnt)
   return (const char *) dst;
 }
 #endif
+
+
+void
+set_windows_fd_as_blocking_socket (int fd)
+{
+    /* 04/2011
+     gnulib select() converts blocking sockets to nonblocking in windows
+     discussed here:
+     http://old.nabble.com/blocking-socket-is-nonblocking-after-calling-gnulib-
+     select%28%29-in-windows-td31432857.html
+
+     wget uses blocking sockets so we must convert them back to blocking.
+    */
+    int ret = 0;
+    int wsagle = 0;
+    const int zero = 0;
+
+    do
+    {
+        if(wsagle == WSAEINPROGRESS)
+          Sleep(1);  /* use windows sleep */
+
+        WSASetLastError (0);
+        ret = ioctl (fd, FIONBIO, &zero);
+        wsagle = WSAGetLastError ();
+    }
+  while (ret && (wsagle == WSAEINPROGRESS));
+
+  if(ret)
+    {
+      fprintf (stderr,
+               _("ioctl() failed.  The socket could not be set as blocking.\n") );
+      DEBUGP (("Winsock error: %d\n", WSAGetLastError ()));
+      abort ();
+    }
+  return;
+}