From 3aa28bc7a2014dcefd9f24517ff32223bec32a35 Mon Sep 17 00:00:00 2001
From: Kahrl <kahrl@gmx.net>
Date: Tue, 24 Dec 2013 19:28:09 +0100
Subject: Use sleep_ms instead of select in httpfetch when max_fd == -1, fixes
 WSAEINVAL

---
 src/httpfetch.cpp | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

(limited to 'src')

diff --git a/src/httpfetch.cpp b/src/httpfetch.cpp
index b48d00764..60e4591a9 100644
--- a/src/httpfetch.cpp
+++ b/src/httpfetch.cpp
@@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "socket.h" // for select()
+#include "porting.h" // for sleep_ms()
 #include "httpfetch.h"
 #include <iostream>
 #include <sstream>
@@ -520,19 +521,26 @@ protected:
 			select_timeout = timeout;
 
 		if (select_timeout > 0) {
-			select_tv.tv_sec = select_timeout / 1000;
-			select_tv.tv_usec = (select_timeout % 1000) * 1000;
-			int retval = select(max_fd + 1, &read_fd_set,
-					&write_fd_set, &exc_fd_set,
-					&select_tv);
-			if (retval == -1) {
-				#ifdef _WIN32
-				errorstream<<"select returned error code "
-					<<WSAGetLastError()<<std::endl;
-				#else
-				errorstream<<"select returned error code "
-					<<errno<<std::endl;
-				#endif
+			// in Winsock it is forbidden to pass three empty
+			// fd_sets to select(), so in that case use sleep_ms
+			if (max_fd == -1) {
+				select_tv.tv_sec = select_timeout / 1000;
+				select_tv.tv_usec = (select_timeout % 1000) * 1000;
+				int retval = select(max_fd + 1, &read_fd_set,
+						&write_fd_set, &exc_fd_set,
+						&select_tv);
+				if (retval == -1) {
+					#ifdef _WIN32
+					errorstream<<"select returned error code "
+						<<WSAGetLastError()<<std::endl;
+					#else
+					errorstream<<"select returned error code "
+						<<errno<<std::endl;
+					#endif
+				}
+			}
+			else {
+				sleep_ms(select_timeout);
 			}
 		}
 	}
-- 
cgit v1.2.3