/* mswindows.c -- Windows-specific support
- Copyright (C) 1996-2006 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.
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"
void
xsleep (double seconds)
{
-#ifdef HAVE_USLEEP
+#if defined(HAVE_USLEEP) && defined(HAVE_SLEEP)
if (seconds > 1000)
{
/* Explained in utils.c. */
}
void
-windows_main (int *argc, char **argv, char **exec_name)
+windows_main (char **exec_name)
{
char *p;
static void
ws_cleanup (void)
{
+ xfree ((char*)exec_name);
WSACleanup ();
}
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);
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);
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.