2011-05-15 Ray Satiro <raysatiro@yahoo.com>
+ * connect.c (select_fd) [WINDOWS]: Ensure the socket is blocking.
+ * mswindows.h: Add declaration for set_windows_fd_as_blocking_socket.
+ * mswindows.c (set_windows_fd_as_blocking_socket): New function.
+
* openssl.c (openssl_read): Prevent loops on read errors.
2011-04-24 Giuseppe Scrivano <gscrivano@gnu.org>
tmout.tv_usec = 1000000 * (maxtime - (long) maxtime);
do
+ {
result = select (fd + 1, rd, wr, NULL, &tmout);
+#ifdef WINDOWS
+ /* gnulib select() converts blocking sockets to nonblocking in windows.
+ wget uses blocking sockets so we must convert them back to blocking. */
+ set_windows_fd_as_blocking_socket (fd);
+#endif
+ }
while (result < 0 && errno == EINTR);
return result;
{
fd_set check_set;
struct timeval to;
+ int ret = 0;
/* Check if we still have a valid (non-EOF) connection. From Andrew
* Maholski's code in the Unix Socket FAQ. */
to.tv_sec = 0;
to.tv_usec = 1;
- if (select (sock + 1, &check_set, NULL, NULL, &to) == 0)
+ ret = select (sock + 1, &check_set, NULL, NULL, &to);
+#ifdef WINDOWS
+/* gnulib select() converts blocking sockets to nonblocking in windows.
+wget uses blocking sockets so we must convert them back to blocking
+*/
+ set_windows_fd_as_blocking_socket ( sock );
+#endif
+
+ if ( !ret )
/* We got a timeout, it means we're still connected. */
return true;
else
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
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;
+}
# define gai_strerror strerror
#endif
+/* ioctl needed by set_windows_fd_as_blocking_socket() */
+#include <sys/ioctl.h>
+
/* Public functions. */
void ws_startup (void);
void ws_percenttitle (double);
char *ws_mypath (void);
void windows_main (char **);
+void set_windows_fd_as_blocking_socket (int);
#endif /* MSWINDOWS_H */