diff --git a/RELEASE-NOTES b/RELEASE-NOTES index ccd2eba80..363352a2b 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -9,7 +9,7 @@ Curl and libcurl 7.21.5 This release includes the following changes: - o + o SOCKOPTFUNCTION: callback can say already-connected This release includes the following bugfixes: diff --git a/include/curl/curl.h b/include/curl/curl.h index 4744f4830..73713dd07 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -315,6 +315,13 @@ typedef enum { CURLSOCKTYPE_LAST /* never use */ } curlsocktype; +/* The return code from the sockopt_callback can signal information back + to libcurl: */ +#define CURL_SOCKOPT_OK 0 +#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return + CURLE_ABORTED_BY_CALLBACK */ +#define CURL_SOCKOPT_ALREADY_CONNECTED 2 + typedef int (*curl_sockopt_callback)(void *clientp, curl_socket_t curlfd, curlsocktype purpose); diff --git a/lib/connect.c b/lib/connect.c index fb21fb7df..261b2150e 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -837,7 +837,7 @@ singleipconnect(struct connectdata *conn, struct Curl_sockaddr_ex addr; int rc; int error; - bool isconnected; + bool isconnected = FALSE; struct SessionHandle *data = conn->data; curl_socket_t sockfd; CURLcode res = CURLE_OK; @@ -924,7 +924,10 @@ singleipconnect(struct connectdata *conn, error = data->set.fsockopt(data->set.sockopt_client, sockfd, CURLSOCKTYPE_IPCXN); - if(error) { + + if(error == CURL_SOCKOPT_ALREADY_CONNECTED) + isconnected = TRUE; + else if(error) { sclose(sockfd); /* close the socket and bail out */ return CURLE_ABORTED_BY_CALLBACK; } @@ -941,7 +944,7 @@ singleipconnect(struct connectdata *conn, curlx_nonblock(sockfd, TRUE); /* Connect TCP sockets, bind UDP */ - if(conn->socktype == SOCK_STREAM) { + if(!isconnected && (conn->socktype == SOCK_STREAM)) { rc = connect(sockfd, &addr.sa_addr, addr.addrlen); conn->connecttime = Curl_tvnow(); if(conn->num_addr > 1) @@ -989,7 +992,8 @@ singleipconnect(struct connectdata *conn, return CURLE_OK; } - isconnected = verifyconnect(sockfd, &error); + if(!isconnected) + isconnected = verifyconnect(sockfd, &error); if(!rc && isconnected) { /* we are connected, awesome! */