File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / lib / hostip.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:15 2020 UTC (4 years, 1 month ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    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>