diff -rc curl-7.19.3-orig/lib/connect.c curl-7.19.3/lib/connect.c *** curl-7.19.3-orig/lib/connect.c 2009-01-02 23:30:50.000000000 +0100 --- curl-7.19.3/lib/connect.c 2009-01-21 15:04:08.000000000 +0100 *************** *** 115,121 **** singleipconnect(struct connectdata *conn, const Curl_addrinfo *ai, /* start connecting to this */ long timeout_ms, ! bool *connected); /* * Curl_timeleft() returns the amount of milliseconds left allowed for the --- 115,122 ---- singleipconnect(struct connectdata *conn, const Curl_addrinfo *ai, /* start connecting to this */ long timeout_ms, ! bool *connected, ! bool *timed_out); /* * Curl_timeleft() returns the amount of milliseconds left allowed for the *************** *** 541,546 **** --- 542,548 ---- { curl_socket_t sockfd; Curl_addrinfo *ai; + bool timed_out; /* first close the failed socket */ sclose(conn->sock[sockindex]); *************** *** 554,560 **** ai = conn->ip_addr->ai_next; while(ai) { ! sockfd = singleipconnect(conn, ai, 0L, connected); if(sockfd != CURL_SOCKET_BAD) { /* store the new socket descriptor */ conn->sock[sockindex] = sockfd; --- 556,562 ---- ai = conn->ip_addr->ai_next; while(ai) { ! sockfd = singleipconnect(conn, ai, 0L, connected, &timed_out); if(sockfd != CURL_SOCKET_BAD) { /* store the new socket descriptor */ conn->sock[sockindex] = sockfd; *************** *** 714,720 **** singleipconnect(struct connectdata *conn, const Curl_addrinfo *ai, long timeout_ms, ! bool *connected) { struct Curl_sockaddr_ex addr; char addr_buf[128]; --- 716,723 ---- singleipconnect(struct connectdata *conn, const Curl_addrinfo *ai, long timeout_ms, ! bool *connected, ! bool *timed_out) { struct Curl_sockaddr_ex addr; char addr_buf[128]; *************** *** 730,735 **** --- 733,740 ---- struct sockaddr_in6 * const sa6 = (void *)&addr.sa_addr; #endif + *timed_out = FALSE; + /* * The Curl_sockaddr_ex structure is basically libcurl's external API * curl_sockaddr structure with enough space available to directly hold *************** *** 880,887 **** infof(data, "connected\n"); return sockfd; } ! else if(WAITCONN_TIMEOUT == rc) infof(data, "Timeout\n"); else { data->state.os_errno = error; infof(data, "%s\n", Curl_strerror(conn, error)); --- 885,894 ---- infof(data, "connected\n"); return sockfd; } ! else if(WAITCONN_TIMEOUT == rc) { ! *timed_out = TRUE; infof(data, "Timeout\n"); + } else { data->state.os_errno = error; infof(data, "%s\n", Curl_strerror(conn, error)); *************** *** 911,918 **** int num_addr; Curl_addrinfo *ai; Curl_addrinfo *curr_addr; - struct timeval after; struct timeval before = Curl_tvnow(); /************************************************************* --- 918,925 ---- int num_addr; Curl_addrinfo *ai; Curl_addrinfo *curr_addr; + bool timed_out; struct timeval before = Curl_tvnow(); /************************************************************* *************** *** 955,973 **** curr_addr = curr_addr->ai_next, aliasindex++) { /* start connecting to the IP curr_addr points to */ ! sockfd = singleipconnect(conn, curr_addr, timeout_per_addr, connected); if(sockfd != CURL_SOCKET_BAD) break; ! /* get a new timeout for next attempt */ ! after = Curl_tvnow(); ! timeout_ms -= Curl_tvdiff(after, before); ! if(timeout_ms < 0) { failf(data, "connect() timed out!"); return CURLE_OPERATION_TIMEDOUT; } - before = after; } /* end of connect-to-each-address loop */ *sockconn = sockfd; /* the socket descriptor we've connected */ --- 962,978 ---- curr_addr = curr_addr->ai_next, aliasindex++) { /* start connecting to the IP curr_addr points to */ ! sockfd = singleipconnect(conn, curr_addr, timeout_per_addr, connected, &timed_out); if(sockfd != CURL_SOCKET_BAD) break; ! /* if this is the last address and it timed out, propagate the ! timeout to the caller */ ! if(!curr_addr->ai_next && timed_out) { failf(data, "connect() timed out!"); return CURLE_OPERATION_TIMEDOUT; } } /* end of connect-to-each-address loop */ *sockconn = sockfd; /* the socket descriptor we've connected */