1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

SOCKOPTFUNCTION: callback can say already-connected

Introducing a few CURL_SOCKOPT* defines for conveniance. The new
CURL_SOCKOPT_ALREADY_CONNECTED signals to libcurl that the socket is to
be treated as already connected and thus it will skip the connect()
call.
This commit is contained in:
Daniel Stenberg 2011-02-09 15:46:41 +01:00
parent a40f58d2ef
commit 1c3c0162c6
3 changed files with 16 additions and 5 deletions

View File

@ -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:

View File

@ -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);

View File

@ -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! */