aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDirk Manske <dm@nonitor.de>2010-08-21 00:29:35 +0200
committerDaniel Stenberg <daniel@haxx.se>2010-08-21 00:29:35 +0200
commitab6681c2c89ad985984e964c5d121340be011a91 (patch)
tree4b4459d2c6b3ad62c695849780fa8a9493313b56 /lib
parenteeb2cb05a1012d8aa61174c762698b39d19c3d5d (diff)
Curl_is_connected: use correct errno
The correctly extracted errno contents were mistakenly overwritten by a newer value that wasn't the correct error value. Bug: http://curl.haxx.se/mail/lib-2010-08/0242.html
Diffstat (limited to 'lib')
-rw-r--r--lib/connect.c45
1 files changed, 22 insertions, 23 deletions
diff --git a/lib/connect.c b/lib/connect.c
index 0495887b0..771129b5a 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -627,6 +627,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
CURLcode code = CURLE_OK;
curl_socket_t sockfd = conn->sock[sockindex];
long allow = DEFAULT_CONNECT_TIMEOUT;
+ int error = 0;
DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET);
@@ -658,9 +659,11 @@ CURLcode Curl_is_connected(struct connectdata *conn,
/* check for connect without timeout as we want to return immediately */
rc = waitconnect(conn, sockfd, 0);
+ if(WAITCONN_TIMEOUT == rc)
+ /* not an error, but also no connection yet */
+ return code;
if(WAITCONN_CONNECTED == rc) {
- int error;
if(verifyconnect(sockfd, &error)) {
/* we are connected, awesome! */
conn->bits.tcpconnect = TRUE;
@@ -672,38 +675,34 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OK;
}
/* nope, not connected for real */
- data->state.os_errno = error;
- infof(data, "Connection failed\n");
- code = trynextip(conn, sockindex, connected);
- if(code)
- failf(data, "Failed connect to %s:%ld; %s",
- conn->host.name, conn->port, Curl_strerror(conn, error));
}
- else if(WAITCONN_TIMEOUT != rc) {
- int error = 0;
-
+ else {
/* nope, not connected */
if(WAITCONN_FDSET_ERROR == rc) {
(void)verifyconnect(sockfd, &error);
- data->state.os_errno = error;
- infof(data, "%s\n",Curl_strerror(conn,error));
+ infof(data, "%s\n",Curl_strerror(conn, error));
}
else
infof(data, "Connection failed\n");
-
- code = trynextip(conn, sockindex, connected);
-
- if(code) {
- error = SOCKERRNO;
- data->state.os_errno = error;
- failf(data, "Failed connect to %s:%ld; %s",
- conn->host.name, conn->port, Curl_strerror(conn, error));
- }
}
+
/*
- * If the connection failed here, we should attempt to connect to the "next
- * address" for the given host.
+ * The connection failed here, we should attempt to connect to the "next
+ * address" for the given host. But first remember the latest error.
*/
+ if(error) {
+ data->state.os_errno = error;
+ SET_SOCKERRNO(error);
+ }
+
+ code = trynextip(conn, sockindex, connected);
+
+ if(code) {
+ error = SOCKERRNO;
+ data->state.os_errno = error;
+ failf(data, "Failed connect to %s:%ld; %s",
+ conn->host.name, conn->port, Curl_strerror(conn, error));
+ }
return code;
}