1
0
mirror of https://github.com/moparisthebest/curl synced 2025-01-03 18:08:02 -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: This release includes the following changes:
o o SOCKOPTFUNCTION: callback can say already-connected
This release includes the following bugfixes: This release includes the following bugfixes:

View File

@ -315,6 +315,13 @@ typedef enum {
CURLSOCKTYPE_LAST /* never use */ CURLSOCKTYPE_LAST /* never use */
} curlsocktype; } 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, typedef int (*curl_sockopt_callback)(void *clientp,
curl_socket_t curlfd, curl_socket_t curlfd,
curlsocktype purpose); curlsocktype purpose);

View File

@ -837,7 +837,7 @@ singleipconnect(struct connectdata *conn,
struct Curl_sockaddr_ex addr; struct Curl_sockaddr_ex addr;
int rc; int rc;
int error; int error;
bool isconnected; bool isconnected = FALSE;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
curl_socket_t sockfd; curl_socket_t sockfd;
CURLcode res = CURLE_OK; CURLcode res = CURLE_OK;
@ -924,7 +924,10 @@ singleipconnect(struct connectdata *conn,
error = data->set.fsockopt(data->set.sockopt_client, error = data->set.fsockopt(data->set.sockopt_client,
sockfd, sockfd,
CURLSOCKTYPE_IPCXN); CURLSOCKTYPE_IPCXN);
if(error) {
if(error == CURL_SOCKOPT_ALREADY_CONNECTED)
isconnected = TRUE;
else if(error) {
sclose(sockfd); /* close the socket and bail out */ sclose(sockfd); /* close the socket and bail out */
return CURLE_ABORTED_BY_CALLBACK; return CURLE_ABORTED_BY_CALLBACK;
} }
@ -941,7 +944,7 @@ singleipconnect(struct connectdata *conn,
curlx_nonblock(sockfd, TRUE); curlx_nonblock(sockfd, TRUE);
/* Connect TCP sockets, bind UDP */ /* Connect TCP sockets, bind UDP */
if(conn->socktype == SOCK_STREAM) { if(!isconnected && (conn->socktype == SOCK_STREAM)) {
rc = connect(sockfd, &addr.sa_addr, addr.addrlen); rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
conn->connecttime = Curl_tvnow(); conn->connecttime = Curl_tvnow();
if(conn->num_addr > 1) if(conn->num_addr > 1)
@ -989,6 +992,7 @@ singleipconnect(struct connectdata *conn,
return CURLE_OK; return CURLE_OK;
} }
if(!isconnected)
isconnected = verifyconnect(sockfd, &error); isconnected = verifyconnect(sockfd, &error);
if(!rc && isconnected) { if(!rc && isconnected) {