Home | History | Annotate | Download | only in lib
      1 #ifndef HEADER_CURL_CONNECT_H
      2 #define HEADER_CURL_CONNECT_H
      3 /***************************************************************************
      4  *                                  _   _ ____  _
      5  *  Project                     ___| | | |  _ \| |
      6  *                             / __| | | | |_) | |
      7  *                            | (__| |_| |  _ <| |___
      8  *                             \___|\___/|_| \_\_____|
      9  *
     10  * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel (at) haxx.se>, et al.
     11  *
     12  * This software is licensed as described in the file COPYING, which
     13  * you should have received as part of this distribution. The terms
     14  * are also available at https://curl.haxx.se/docs/copyright.html.
     15  *
     16  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     17  * copies of the Software, and permit persons to whom the Software is
     18  * furnished to do so, under the terms of the COPYING file.
     19  *
     20  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     21  * KIND, either express or implied.
     22  *
     23  ***************************************************************************/
     24 #include "curl_setup.h"
     25 
     26 #include "nonblock.h" /* for curlx_nonblock(), formerly Curl_nonblock() */
     27 #include "sockaddr.h"
     28 
     29 CURLcode Curl_is_connected(struct connectdata *conn,
     30                            int sockindex,
     31                            bool *connected);
     32 
     33 CURLcode Curl_connecthost(struct connectdata *conn,
     34                           const struct Curl_dns_entry *host);
     35 
     36 /* generic function that returns how much time there's left to run, according
     37    to the timeouts set */
     38 long Curl_timeleft(struct Curl_easy *data,
     39                    struct timeval *nowp,
     40                    bool duringconnect);
     41 
     42 #define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */
     43 #define HAPPY_EYEBALLS_TIMEOUT     200 /* milliseconds to wait between
     44                                           IPv4/IPv6 connection attempts */
     45 
     46 /*
     47  * Used to extract socket and connectdata struct for the most recent
     48  * transfer on the given Curl_easy.
     49  *
     50  * The returned socket will be CURL_SOCKET_BAD in case of failure!
     51  */
     52 curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
     53                                   struct connectdata **connp);
     54 
     55 #ifdef USE_WINSOCK
     56 /* When you run a program that uses the Windows Sockets API, you may
     57    experience slow performance when you copy data to a TCP server.
     58 
     59    https://support.microsoft.com/kb/823764
     60 
     61    Work-around: Make the Socket Send Buffer Size Larger Than the Program Send
     62    Buffer Size
     63 
     64 */
     65 void Curl_sndbufset(curl_socket_t sockfd);
     66 #else
     67 #define Curl_sndbufset(y) Curl_nop_stmt
     68 #endif
     69 
     70 void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd);
     71 void Curl_persistconninfo(struct connectdata *conn);
     72 int Curl_closesocket(struct connectdata *conn, curl_socket_t sock);
     73 
     74 /*
     75  * The Curl_sockaddr_ex structure is basically libcurl's external API
     76  * curl_sockaddr structure with enough space available to directly hold any
     77  * protocol-specific address structures. The variable declared here will be
     78  * used to pass / receive data to/from the fopensocket callback if this has
     79  * been set, before that, it is initialized from parameters.
     80  */
     81 struct Curl_sockaddr_ex {
     82   int family;
     83   int socktype;
     84   int protocol;
     85   unsigned int addrlen;
     86   union {
     87     struct sockaddr addr;
     88     struct Curl_sockaddr_storage buff;
     89   } _sa_ex_u;
     90 };
     91 #define sa_addr _sa_ex_u.addr
     92 
     93 /*
     94  * Create a socket based on info from 'conn' and 'ai'.
     95  *
     96  * Fill in 'addr' and 'sockfd' accordingly if OK is returned. If the open
     97  * socket callback is set, used that!
     98  *
     99  */
    100 CURLcode Curl_socket(struct connectdata *conn,
    101                      const Curl_addrinfo *ai,
    102                      struct Curl_sockaddr_ex *addr,
    103                      curl_socket_t *sockfd);
    104 
    105 void Curl_tcpnodelay(struct connectdata *conn, curl_socket_t sockfd);
    106 
    107 #ifdef CURLDEBUG
    108 /*
    109  * Curl_connclose() sets the bit.close bit to TRUE with an explanation.
    110  * Nothing else.
    111  */
    112 void Curl_conncontrol(struct connectdata *conn,
    113                       bool closeit,
    114                       const char *reason);
    115 #define connclose(x,y) Curl_conncontrol(x,TRUE, y)
    116 #define connkeep(x,y) Curl_conncontrol(x, FALSE, y)
    117 #else /* if !CURLDEBUG */
    118 
    119 #define connclose(x,y) (x)->bits.close = TRUE
    120 #define connkeep(x,y) (x)->bits.close = FALSE
    121 
    122 #endif
    123 
    124 #endif /* HEADER_CURL_CONNECT_H */
    125