]> sjero.net Git - wget/blobdiff - src/mswindows.c
Ensure sockets are not blocking after a select under Windows.
[wget] / src / mswindows.c
index d7749fa2ab35313d10bc078e041d70b86a5afb9b..51342300c206668f7448a85523f34eb9c1b9389e 100644 (file)
@@ -573,7 +573,7 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg)
   return rc;
 }
 
-\f
+
 #ifdef ENABLE_IPV6
 /* An inet_ntop implementation that uses WSAAddressToString.
    Prototype complies with POSIX 1003.1-2004.  This is only used under
@@ -615,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;
+}