From 022099266ea8d2cbe2abef54f39b1df1322f4d68 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 11 Apr 2001 06:41:54 +0000 Subject: SM made the connection timeout work for windows boxes! --- lib/url.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'lib/url.c') diff --git a/lib/url.c b/lib/url.c index 80469587e..7e771e75f 100644 --- 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 */ -- cgit v1.2.3