Annotation of embedaddon/curl/lib/hostip.h, revision 1.1.1.1

1.1       misho       1: #ifndef HEADER_CURL_HOSTIP_H
                      2: #define HEADER_CURL_HOSTIP_H
                      3: /***************************************************************************
                      4:  *                                  _   _ ____  _
                      5:  *  Project                     ___| | | |  _ \| |
                      6:  *                             / __| | | | |_) | |
                      7:  *                            | (__| |_| |  _ <| |___
                      8:  *                             \___|\___/|_| \_\_____|
                      9:  *
                     10:  * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@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: 
                     25: #include "curl_setup.h"
                     26: #include "hash.h"
                     27: #include "curl_addrinfo.h"
                     28: #include "timeval.h" /* for timediff_t */
                     29: #include "asyn.h"
                     30: 
                     31: #ifdef HAVE_SETJMP_H
                     32: #include <setjmp.h>
                     33: #endif
                     34: 
                     35: #ifdef NETWARE
                     36: #undef in_addr_t
                     37: #define in_addr_t unsigned long
                     38: #endif
                     39: 
                     40: /* Allocate enough memory to hold the full name information structs and
                     41:  * everything. OSF1 is known to require at least 8872 bytes. The buffer
                     42:  * required for storing all possible aliases and IP numbers is according to
                     43:  * Stevens' Unix Network Programming 2nd edition, p. 304: 8192 bytes!
                     44:  */
                     45: #define CURL_HOSTENT_SIZE 9000
                     46: 
                     47: #define CURL_TIMEOUT_RESOLVE 300 /* when using asynch methods, we allow this
                     48:                                     many seconds for a name resolve */
                     49: 
                     50: #define CURL_ASYNC_SUCCESS CURLE_OK
                     51: 
                     52: struct addrinfo;
                     53: struct hostent;
                     54: struct Curl_easy;
                     55: struct connectdata;
                     56: 
                     57: /*
                     58:  * Curl_global_host_cache_init() initializes and sets up a global DNS cache.
                     59:  * Global DNS cache is general badness. Do not use. This will be removed in
                     60:  * a future version. Use the share interface instead!
                     61:  *
                     62:  * Returns a struct curl_hash pointer on success, NULL on failure.
                     63:  */
                     64: struct curl_hash *Curl_global_host_cache_init(void);
                     65: 
                     66: struct Curl_dns_entry {
                     67:   Curl_addrinfo *addr;
                     68:   /* timestamp == 0 -- CURLOPT_RESOLVE entry, doesn't timeout */
                     69:   time_t timestamp;
                     70:   /* use-counter, use Curl_resolv_unlock to release reference */
                     71:   long inuse;
                     72: };
                     73: 
                     74: /*
                     75:  * Curl_resolv() returns an entry with the info for the specified host
                     76:  * and port.
                     77:  *
                     78:  * The returned data *MUST* be "unlocked" with Curl_resolv_unlock() after
                     79:  * use, or we'll leak memory!
                     80:  */
                     81: /* return codes */
                     82: enum resolve_t {
                     83:   CURLRESOLV_TIMEDOUT = -2,
                     84:   CURLRESOLV_ERROR    = -1,
                     85:   CURLRESOLV_RESOLVED =  0,
                     86:   CURLRESOLV_PENDING  =  1
                     87: };
                     88: enum resolve_t Curl_resolv(struct connectdata *conn,
                     89:                            const char *hostname,
                     90:                            int port,
                     91:                            bool allowDOH,
                     92:                            struct Curl_dns_entry **dnsentry);
                     93: enum resolve_t Curl_resolv_timeout(struct connectdata *conn,
                     94:                                    const char *hostname, int port,
                     95:                                    struct Curl_dns_entry **dnsentry,
                     96:                                    timediff_t timeoutms);
                     97: 
                     98: #ifdef CURLRES_IPV6
                     99: /*
                    100:  * Curl_ipv6works() returns TRUE if IPv6 seems to work.
                    101:  */
                    102: bool Curl_ipv6works(struct connectdata *conn);
                    103: #else
                    104: #define Curl_ipv6works(x) FALSE
                    105: #endif
                    106: 
                    107: /*
                    108:  * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've
                    109:  * been set and returns TRUE if they are OK.
                    110:  */
                    111: bool Curl_ipvalid(struct connectdata *conn);
                    112: 
                    113: 
                    114: /*
                    115:  * Curl_getaddrinfo() is the generic low-level name resolve API within this
                    116:  * source file. There are several versions of this function - for different
                    117:  * name resolve layers (selected at build-time). They all take this same set
                    118:  * of arguments
                    119:  */
                    120: Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
                    121:                                 const char *hostname,
                    122:                                 int port,
                    123:                                 int *waitp);
                    124: 
                    125: 
                    126: /* unlock a previously resolved dns entry */
                    127: void Curl_resolv_unlock(struct Curl_easy *data,
                    128:                         struct Curl_dns_entry *dns);
                    129: 
                    130: /* init a new dns cache and return success */
                    131: int Curl_mk_dnscache(struct curl_hash *hash);
                    132: 
                    133: /* prune old entries from the DNS cache */
                    134: void Curl_hostcache_prune(struct Curl_easy *data);
                    135: 
                    136: /* Return # of addresses in a Curl_addrinfo struct */
                    137: int Curl_num_addresses(const Curl_addrinfo *addr);
                    138: 
                    139: #if defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO)
                    140: int curl_dogetnameinfo(GETNAMEINFO_QUAL_ARG1 GETNAMEINFO_TYPE_ARG1 sa,
                    141:                        GETNAMEINFO_TYPE_ARG2 salen,
                    142:                        char *host, GETNAMEINFO_TYPE_ARG46 hostlen,
                    143:                        char *serv, GETNAMEINFO_TYPE_ARG46 servlen,
                    144:                        GETNAMEINFO_TYPE_ARG7 flags,
                    145:                        int line, const char *source);
                    146: #endif
                    147: 
                    148: /* IPv4 threadsafe resolve function used for synch and asynch builds */
                    149: Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname, int port);
                    150: 
                    151: CURLcode Curl_once_resolved(struct connectdata *conn, bool *protocol_connect);
                    152: 
                    153: /*
                    154:  * Curl_addrinfo_callback() is used when we build with any asynch specialty.
                    155:  * Handles end of async request processing. Inserts ai into hostcache when
                    156:  * status is CURL_ASYNC_SUCCESS. Twiddles fields in conn to indicate async
                    157:  * request completed whether successful or failed.
                    158:  */
                    159: CURLcode Curl_addrinfo_callback(struct connectdata *conn,
                    160:                                 int status,
                    161:                                 Curl_addrinfo *ai);
                    162: 
                    163: /*
                    164:  * Curl_printable_address() returns a printable version of the 1st address
                    165:  * given in the 'ip' argument. The result will be stored in the buf that is
                    166:  * bufsize bytes big.
                    167:  */
                    168: const char *Curl_printable_address(const Curl_addrinfo *ip,
                    169:                                    char *buf, size_t bufsize);
                    170: 
                    171: /*
                    172:  * Curl_fetch_addr() fetches a 'Curl_dns_entry' already in the DNS cache.
                    173:  *
                    174:  * Returns the Curl_dns_entry entry pointer or NULL if not in the cache.
                    175:  *
                    176:  * The returned data *MUST* be "unlocked" with Curl_resolv_unlock() after
                    177:  * use, or we'll leak memory!
                    178:  */
                    179: struct Curl_dns_entry *
                    180: Curl_fetch_addr(struct connectdata *conn,
                    181:                 const char *hostname,
                    182:                 int port);
                    183: 
                    184: /*
                    185:  * Curl_cache_addr() stores a 'Curl_addrinfo' struct in the DNS cache.
                    186:  *
                    187:  * Returns the Curl_dns_entry entry pointer or NULL if the storage failed.
                    188:  */
                    189: struct Curl_dns_entry *
                    190: Curl_cache_addr(struct Curl_easy *data, Curl_addrinfo *addr,
                    191:                 const char *hostname, int port);
                    192: 
                    193: #ifndef INADDR_NONE
                    194: #define CURL_INADDR_NONE (in_addr_t) ~0
                    195: #else
                    196: #define CURL_INADDR_NONE INADDR_NONE
                    197: #endif
                    198: 
                    199: #ifdef HAVE_SIGSETJMP
                    200: /* Forward-declaration of variable defined in hostip.c. Beware this
                    201:  * is a global and unique instance. This is used to store the return
                    202:  * address that we can jump back to from inside a signal handler.
                    203:  * This is not thread-safe stuff.
                    204:  */
                    205: extern sigjmp_buf curl_jmpenv;
                    206: #endif
                    207: 
                    208: /*
                    209:  * Function provided by the resolver backend to set DNS servers to use.
                    210:  */
                    211: CURLcode Curl_set_dns_servers(struct Curl_easy *data, char *servers);
                    212: 
                    213: /*
                    214:  * Function provided by the resolver backend to set
                    215:  * outgoing interface to use for DNS requests
                    216:  */
                    217: CURLcode Curl_set_dns_interface(struct Curl_easy *data,
                    218:                                 const char *interf);
                    219: 
                    220: /*
                    221:  * Function provided by the resolver backend to set
                    222:  * local IPv4 address to use as source address for DNS requests
                    223:  */
                    224: CURLcode Curl_set_dns_local_ip4(struct Curl_easy *data,
                    225:                                 const char *local_ip4);
                    226: 
                    227: /*
                    228:  * Function provided by the resolver backend to set
                    229:  * local IPv6 address to use as source address for DNS requests
                    230:  */
                    231: CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data,
                    232:                                 const char *local_ip6);
                    233: 
                    234: /*
                    235:  * Clean off entries from the cache
                    236:  */
                    237: void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash);
                    238: 
                    239: /*
                    240:  * Populate the cache with specified entries from CURLOPT_RESOLVE.
                    241:  */
                    242: CURLcode Curl_loadhostpairs(struct Curl_easy *data);
                    243: 
                    244: CURLcode Curl_resolv_check(struct connectdata *conn,
                    245:                            struct Curl_dns_entry **dns);
                    246: int Curl_resolv_getsock(struct connectdata *conn,
                    247:                         curl_socket_t *socks);
                    248: 
                    249: #endif /* HEADER_CURL_HOSTIP_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>