Use sleep_ms instead of select in httpfetch when max_fd == -1, fixes WSAEINVAL
authorKahrl <kahrl@gmx.net>
Tue, 24 Dec 2013 18:28:09 +0000 (19:28 +0100)
committerKahrl <kahrl@gmx.net>
Tue, 24 Dec 2013 18:28:09 +0000 (19:28 +0100)
src/httpfetch.cpp

index b48d00764d736cfa4833647cd247badc4bd89264..60e4591a921444c57137dbc14f72bdebee124350 100644 (file)
@@ -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);
                        }
                }
        }