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:
parent
a40f58d2ef
commit
1c3c0162c6
@ -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:
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user