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:
parent
a40f58d2ef
commit
1c3c0162c6
@ -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:
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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,6 +992,7 @@ singleipconnect(struct connectdata *conn,
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
if(!isconnected)
|
||||
isconnected = verifyconnect(sockfd, &error);
|
||||
|
||||
if(!rc && isconnected) {
|
||||
|
Loading…
Reference in New Issue
Block a user