X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fmswindows.c;h=179773e05fccfd99a9d566b6385540ca0ddbc9c5;hp=f3ee0152be276f3e80016d47bdc68752919723f5;hb=HEAD;hpb=663b1b33679640e7bce44a4a13b2061296fc5e29 diff --git a/src/mswindows.c b/src/mswindows.c index f3ee0152..179773e0 100644 --- a/src/mswindows.c +++ b/src/mswindows.c @@ -1,6 +1,7 @@ /* mswindows.c -- Windows-specific support Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, + Inc. This file is part of GNU Wget. @@ -322,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) @@ -330,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. */ @@ -571,39 +572,8 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg) thread_hnd = NULL; return rc; } - -/* 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)) - #ifdef ENABLE_IPV6 /* An inet_ntop implementation that uses WSAAddressToString. Prototype complies with POSIX 1003.1-2004. This is only used under @@ -645,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; +}