SM made the connection timeout work for windows boxes!
authorDaniel Stenberg <daniel@haxx.se>
Wed, 11 Apr 2001 06:41:54 +0000 (06:41 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 11 Apr 2001 06:41:54 +0000 (06:41 +0000)
lib/url.c

index 80469587e9ef6cc9b51963ae3ec9ec44acfcbbc6..7e771e75f18c9e290865eb4ae7be87fc8771c75f 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -1060,6 +1060,11 @@ ConnectionStore(struct UrlData *data,
 static CURLcode ConnectPlease(struct UrlData *data,
                               struct connectdata *conn)
 {
+#if defined(WIN32)
+  unsigned long nonblock = 0;
+  fd_set connectfd;
+  struct timeval conntimeout;
+#endif
 
 #ifndef ENABLE_IPV6
   conn->firstsocket = socket(AF_INET, SOCK_STREAM, 0);
@@ -1222,10 +1227,29 @@ static CURLcode ConnectPlease(struct UrlData *data,
     return CURLE_COULDNT_CONNECT;
   }
 #else
+  /* non-zero nonblock value sets socket as nonblocking under Win32 */
+#if defined(WIN32)
+  FD_ZERO (&connectfd);
+  FD_SET(conn->firstsocket, &connectfd);
+  if (conn->data->connecttimeout > 0) {
+       nonblock = 1;
+  }
+  ioctlsocket(conn->firstsocket, FIONBIO, &nonblock);
+#endif
   if (connect(conn->firstsocket,
               (struct sockaddr *) &(conn->serv_addr),
               sizeof(conn->serv_addr)
               ) < 0) {
+#if defined(WIN32)
+         conntimeout.tv_sec = conn->data->connecttimeout;
+         conntimeout.tv_usec = 0;      
+         if(-1 != select (conn->firstsocket + 1, NULL, &connectfd, NULL, &conntimeout)) {
+                 if (FD_ISSET(conn->firstsocket, &connectfd))
+                         return CURLE_OK;
+                 else
+                         errno = EINTR;
+         }
+#endif
     switch(errno) {
 #ifdef ECONNREFUSED
       /* this should be made nicer */