aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/url.c24
1 files changed, 24 insertions, 0 deletions
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 */