Commit 1c3c0162 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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.
parent a40f58d2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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:

+7 −0
Original line number Diff line number Diff line
@@ -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);
+8 −4
Original line number Diff line number Diff line
@@ -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) {