1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_HOSTIP_H 2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_HOSTIP_H 3*6236dae4SAndroid Build Coastguard Worker /*************************************************************************** 4*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 5*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 6*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 7*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 8*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 9*6236dae4SAndroid Build Coastguard Worker * 10*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 11*6236dae4SAndroid Build Coastguard Worker * 12*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 13*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 14*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 15*6236dae4SAndroid Build Coastguard Worker * 16*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 18*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 19*6236dae4SAndroid Build Coastguard Worker * 20*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 22*6236dae4SAndroid Build Coastguard Worker * 23*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 24*6236dae4SAndroid Build Coastguard Worker * 25*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h" 28*6236dae4SAndroid Build Coastguard Worker #include "hash.h" 29*6236dae4SAndroid Build Coastguard Worker #include "curl_addrinfo.h" 30*6236dae4SAndroid Build Coastguard Worker #include "timeval.h" /* for timediff_t */ 31*6236dae4SAndroid Build Coastguard Worker #include "asyn.h" 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Worker #include <setjmp.h> 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTPSRR 36*6236dae4SAndroid Build Coastguard Worker # include <stdint.h> 37*6236dae4SAndroid Build Coastguard Worker #endif 38*6236dae4SAndroid Build Coastguard Worker 39*6236dae4SAndroid Build Coastguard Worker /* Allocate enough memory to hold the full name information structs and 40*6236dae4SAndroid Build Coastguard Worker * everything. OSF1 is known to require at least 8872 bytes. The buffer 41*6236dae4SAndroid Build Coastguard Worker * required for storing all possible aliases and IP numbers is according to 42*6236dae4SAndroid Build Coastguard Worker * Stevens' Unix Network Programming 2nd edition, p. 304: 8192 bytes! 43*6236dae4SAndroid Build Coastguard Worker */ 44*6236dae4SAndroid Build Coastguard Worker #define CURL_HOSTENT_SIZE 9000 45*6236dae4SAndroid Build Coastguard Worker 46*6236dae4SAndroid Build Coastguard Worker #define CURL_TIMEOUT_RESOLVE 300 /* when using asynch methods, we allow this 47*6236dae4SAndroid Build Coastguard Worker many seconds for a name resolve */ 48*6236dae4SAndroid Build Coastguard Worker 49*6236dae4SAndroid Build Coastguard Worker #define CURL_ASYNC_SUCCESS CURLE_OK 50*6236dae4SAndroid Build Coastguard Worker 51*6236dae4SAndroid Build Coastguard Worker struct addrinfo; 52*6236dae4SAndroid Build Coastguard Worker struct hostent; 53*6236dae4SAndroid Build Coastguard Worker struct Curl_easy; 54*6236dae4SAndroid Build Coastguard Worker struct connectdata; 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard Worker /* 57*6236dae4SAndroid Build Coastguard Worker * Curl_global_host_cache_init() initializes and sets up a global DNS cache. 58*6236dae4SAndroid Build Coastguard Worker * Global DNS cache is general badness. Do not use. This will be removed in 59*6236dae4SAndroid Build Coastguard Worker * a future version. Use the share interface instead! 60*6236dae4SAndroid Build Coastguard Worker * 61*6236dae4SAndroid Build Coastguard Worker * Returns a struct Curl_hash pointer on success, NULL on failure. 62*6236dae4SAndroid Build Coastguard Worker */ 63*6236dae4SAndroid Build Coastguard Worker struct Curl_hash *Curl_global_host_cache_init(void); 64*6236dae4SAndroid Build Coastguard Worker 65*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTPSRR 66*6236dae4SAndroid Build Coastguard Worker 67*6236dae4SAndroid Build Coastguard Worker #define CURL_MAXLEN_host_name 253 68*6236dae4SAndroid Build Coastguard Worker 69*6236dae4SAndroid Build Coastguard Worker struct Curl_https_rrinfo { 70*6236dae4SAndroid Build Coastguard Worker size_t len; /* raw encoded length */ 71*6236dae4SAndroid Build Coastguard Worker unsigned char *val; /* raw encoded octets */ 72*6236dae4SAndroid Build Coastguard Worker /* 73*6236dae4SAndroid Build Coastguard Worker * fields from HTTPS RR, with the mandatory fields 74*6236dae4SAndroid Build Coastguard Worker * first (priority, target), then the others in the 75*6236dae4SAndroid Build Coastguard Worker * order of the keytag numbers defined at 76*6236dae4SAndroid Build Coastguard Worker * https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2 77*6236dae4SAndroid Build Coastguard Worker */ 78*6236dae4SAndroid Build Coastguard Worker uint16_t priority; 79*6236dae4SAndroid Build Coastguard Worker char *target; 80*6236dae4SAndroid Build Coastguard Worker char *alpns; /* keytag = 1 */ 81*6236dae4SAndroid Build Coastguard Worker bool no_def_alpn; /* keytag = 2 */ 82*6236dae4SAndroid Build Coastguard Worker /* 83*6236dae4SAndroid Build Coastguard Worker * we do not support ports (keytag = 3) as we do not support 84*6236dae4SAndroid Build Coastguard Worker * port-switching yet 85*6236dae4SAndroid Build Coastguard Worker */ 86*6236dae4SAndroid Build Coastguard Worker unsigned char *ipv4hints; /* keytag = 4 */ 87*6236dae4SAndroid Build Coastguard Worker size_t ipv4hints_len; 88*6236dae4SAndroid Build Coastguard Worker unsigned char *echconfiglist; /* keytag = 5 */ 89*6236dae4SAndroid Build Coastguard Worker size_t echconfiglist_len; 90*6236dae4SAndroid Build Coastguard Worker unsigned char *ipv6hints; /* keytag = 6 */ 91*6236dae4SAndroid Build Coastguard Worker size_t ipv6hints_len; 92*6236dae4SAndroid Build Coastguard Worker }; 93*6236dae4SAndroid Build Coastguard Worker #endif 94*6236dae4SAndroid Build Coastguard Worker 95*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry { 96*6236dae4SAndroid Build Coastguard Worker struct Curl_addrinfo *addr; 97*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTPSRR 98*6236dae4SAndroid Build Coastguard Worker struct Curl_https_rrinfo *hinfo; 99*6236dae4SAndroid Build Coastguard Worker #endif 100*6236dae4SAndroid Build Coastguard Worker /* timestamp == 0 -- permanent CURLOPT_RESOLVE entry (does not time out) */ 101*6236dae4SAndroid Build Coastguard Worker time_t timestamp; 102*6236dae4SAndroid Build Coastguard Worker /* reference counter, entry is freed on reaching 0 */ 103*6236dae4SAndroid Build Coastguard Worker size_t refcount; 104*6236dae4SAndroid Build Coastguard Worker /* hostname port number that resolved to addr. */ 105*6236dae4SAndroid Build Coastguard Worker int hostport; 106*6236dae4SAndroid Build Coastguard Worker /* hostname that resolved to addr. may be NULL (Unix domain sockets). */ 107*6236dae4SAndroid Build Coastguard Worker char hostname[1]; 108*6236dae4SAndroid Build Coastguard Worker }; 109*6236dae4SAndroid Build Coastguard Worker 110*6236dae4SAndroid Build Coastguard Worker bool Curl_host_is_ipnum(const char *hostname); 111*6236dae4SAndroid Build Coastguard Worker 112*6236dae4SAndroid Build Coastguard Worker /* 113*6236dae4SAndroid Build Coastguard Worker * Curl_resolv() returns an entry with the info for the specified host 114*6236dae4SAndroid Build Coastguard Worker * and port. 115*6236dae4SAndroid Build Coastguard Worker * 116*6236dae4SAndroid Build Coastguard Worker * The returned data *MUST* be "released" with Curl_resolv_unlink() after 117*6236dae4SAndroid Build Coastguard Worker * use, or we will leak memory! 118*6236dae4SAndroid Build Coastguard Worker */ 119*6236dae4SAndroid Build Coastguard Worker /* return codes */ 120*6236dae4SAndroid Build Coastguard Worker enum resolve_t { 121*6236dae4SAndroid Build Coastguard Worker CURLRESOLV_TIMEDOUT = -2, 122*6236dae4SAndroid Build Coastguard Worker CURLRESOLV_ERROR = -1, 123*6236dae4SAndroid Build Coastguard Worker CURLRESOLV_RESOLVED = 0, 124*6236dae4SAndroid Build Coastguard Worker CURLRESOLV_PENDING = 1 125*6236dae4SAndroid Build Coastguard Worker }; 126*6236dae4SAndroid Build Coastguard Worker enum resolve_t Curl_resolv(struct Curl_easy *data, 127*6236dae4SAndroid Build Coastguard Worker const char *hostname, 128*6236dae4SAndroid Build Coastguard Worker int port, 129*6236dae4SAndroid Build Coastguard Worker bool allowDOH, 130*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry **dnsentry); 131*6236dae4SAndroid Build Coastguard Worker enum resolve_t Curl_resolv_timeout(struct Curl_easy *data, 132*6236dae4SAndroid Build Coastguard Worker const char *hostname, int port, 133*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry **dnsentry, 134*6236dae4SAndroid Build Coastguard Worker timediff_t timeoutms); 135*6236dae4SAndroid Build Coastguard Worker 136*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IPV6 137*6236dae4SAndroid Build Coastguard Worker /* 138*6236dae4SAndroid Build Coastguard Worker * Curl_ipv6works() returns TRUE if IPv6 seems to work. 139*6236dae4SAndroid Build Coastguard Worker */ 140*6236dae4SAndroid Build Coastguard Worker bool Curl_ipv6works(struct Curl_easy *data); 141*6236dae4SAndroid Build Coastguard Worker #else 142*6236dae4SAndroid Build Coastguard Worker #define Curl_ipv6works(x) FALSE 143*6236dae4SAndroid Build Coastguard Worker #endif 144*6236dae4SAndroid Build Coastguard Worker 145*6236dae4SAndroid Build Coastguard Worker /* 146*6236dae4SAndroid Build Coastguard Worker * Curl_ipvalid() checks what CURL_IPRESOLVE_* requirements that might've 147*6236dae4SAndroid Build Coastguard Worker * been set and returns TRUE if they are OK. 148*6236dae4SAndroid Build Coastguard Worker */ 149*6236dae4SAndroid Build Coastguard Worker bool Curl_ipvalid(struct Curl_easy *data, struct connectdata *conn); 150*6236dae4SAndroid Build Coastguard Worker 151*6236dae4SAndroid Build Coastguard Worker 152*6236dae4SAndroid Build Coastguard Worker /* 153*6236dae4SAndroid Build Coastguard Worker * Curl_getaddrinfo() is the generic low-level name resolve API within this 154*6236dae4SAndroid Build Coastguard Worker * source file. There are several versions of this function - for different 155*6236dae4SAndroid Build Coastguard Worker * name resolve layers (selected at build-time). They all take this same set 156*6236dae4SAndroid Build Coastguard Worker * of arguments 157*6236dae4SAndroid Build Coastguard Worker */ 158*6236dae4SAndroid Build Coastguard Worker struct Curl_addrinfo *Curl_getaddrinfo(struct Curl_easy *data, 159*6236dae4SAndroid Build Coastguard Worker const char *hostname, 160*6236dae4SAndroid Build Coastguard Worker int port, 161*6236dae4SAndroid Build Coastguard Worker int *waitp); 162*6236dae4SAndroid Build Coastguard Worker 163*6236dae4SAndroid Build Coastguard Worker 164*6236dae4SAndroid Build Coastguard Worker /* unlink a dns entry, potentially shared with a cache */ 165*6236dae4SAndroid Build Coastguard Worker void Curl_resolv_unlink(struct Curl_easy *data, 166*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry **pdns); 167*6236dae4SAndroid Build Coastguard Worker 168*6236dae4SAndroid Build Coastguard Worker /* init a new dns cache */ 169*6236dae4SAndroid Build Coastguard Worker void Curl_init_dnscache(struct Curl_hash *hash, size_t hashsize); 170*6236dae4SAndroid Build Coastguard Worker 171*6236dae4SAndroid Build Coastguard Worker /* prune old entries from the DNS cache */ 172*6236dae4SAndroid Build Coastguard Worker void Curl_hostcache_prune(struct Curl_easy *data); 173*6236dae4SAndroid Build Coastguard Worker 174*6236dae4SAndroid Build Coastguard Worker /* IPv4 threadsafe resolve function used for synch and asynch builds */ 175*6236dae4SAndroid Build Coastguard Worker struct Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname, int port); 176*6236dae4SAndroid Build Coastguard Worker 177*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_once_resolved(struct Curl_easy *data, bool *protocol_connect); 178*6236dae4SAndroid Build Coastguard Worker 179*6236dae4SAndroid Build Coastguard Worker /* 180*6236dae4SAndroid Build Coastguard Worker * Curl_addrinfo_callback() is used when we build with any asynch specialty. 181*6236dae4SAndroid Build Coastguard Worker * Handles end of async request processing. Inserts ai into hostcache when 182*6236dae4SAndroid Build Coastguard Worker * status is CURL_ASYNC_SUCCESS. Twiddles fields in conn to indicate async 183*6236dae4SAndroid Build Coastguard Worker * request completed whether successful or failed. 184*6236dae4SAndroid Build Coastguard Worker */ 185*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_addrinfo_callback(struct Curl_easy *data, 186*6236dae4SAndroid Build Coastguard Worker int status, 187*6236dae4SAndroid Build Coastguard Worker struct Curl_addrinfo *ai); 188*6236dae4SAndroid Build Coastguard Worker 189*6236dae4SAndroid Build Coastguard Worker /* 190*6236dae4SAndroid Build Coastguard Worker * Curl_printable_address() returns a printable version of the 1st address 191*6236dae4SAndroid Build Coastguard Worker * given in the 'ip' argument. The result will be stored in the buf that is 192*6236dae4SAndroid Build Coastguard Worker * bufsize bytes big. 193*6236dae4SAndroid Build Coastguard Worker */ 194*6236dae4SAndroid Build Coastguard Worker void Curl_printable_address(const struct Curl_addrinfo *ip, 195*6236dae4SAndroid Build Coastguard Worker char *buf, size_t bufsize); 196*6236dae4SAndroid Build Coastguard Worker 197*6236dae4SAndroid Build Coastguard Worker /* 198*6236dae4SAndroid Build Coastguard Worker * Curl_fetch_addr() fetches a 'Curl_dns_entry' already in the DNS cache. 199*6236dae4SAndroid Build Coastguard Worker * 200*6236dae4SAndroid Build Coastguard Worker * Returns the Curl_dns_entry entry pointer or NULL if not in the cache. 201*6236dae4SAndroid Build Coastguard Worker * 202*6236dae4SAndroid Build Coastguard Worker * The returned data *MUST* be "released" with Curl_resolv_unlink() after 203*6236dae4SAndroid Build Coastguard Worker * use, or we will leak memory! 204*6236dae4SAndroid Build Coastguard Worker */ 205*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry * 206*6236dae4SAndroid Build Coastguard Worker Curl_fetch_addr(struct Curl_easy *data, 207*6236dae4SAndroid Build Coastguard Worker const char *hostname, 208*6236dae4SAndroid Build Coastguard Worker int port); 209*6236dae4SAndroid Build Coastguard Worker 210*6236dae4SAndroid Build Coastguard Worker /* 211*6236dae4SAndroid Build Coastguard Worker * Curl_cache_addr() stores a 'Curl_addrinfo' struct in the DNS cache. 212*6236dae4SAndroid Build Coastguard Worker * @param permanent iff TRUE, entry will never become stale 213*6236dae4SAndroid Build Coastguard Worker * Returns the Curl_dns_entry entry pointer or NULL if the storage failed. 214*6236dae4SAndroid Build Coastguard Worker */ 215*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry * 216*6236dae4SAndroid Build Coastguard Worker Curl_cache_addr(struct Curl_easy *data, struct Curl_addrinfo *addr, 217*6236dae4SAndroid Build Coastguard Worker const char *hostname, size_t hostlen, int port, 218*6236dae4SAndroid Build Coastguard Worker bool permanent); 219*6236dae4SAndroid Build Coastguard Worker 220*6236dae4SAndroid Build Coastguard Worker #ifndef INADDR_NONE 221*6236dae4SAndroid Build Coastguard Worker #define CURL_INADDR_NONE (in_addr_t) ~0 222*6236dae4SAndroid Build Coastguard Worker #else 223*6236dae4SAndroid Build Coastguard Worker #define CURL_INADDR_NONE INADDR_NONE 224*6236dae4SAndroid Build Coastguard Worker #endif 225*6236dae4SAndroid Build Coastguard Worker 226*6236dae4SAndroid Build Coastguard Worker /* 227*6236dae4SAndroid Build Coastguard Worker * Function provided by the resolver backend to set DNS servers to use. 228*6236dae4SAndroid Build Coastguard Worker */ 229*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_set_dns_servers(struct Curl_easy *data, char *servers); 230*6236dae4SAndroid Build Coastguard Worker 231*6236dae4SAndroid Build Coastguard Worker /* 232*6236dae4SAndroid Build Coastguard Worker * Function provided by the resolver backend to set 233*6236dae4SAndroid Build Coastguard Worker * outgoing interface to use for DNS requests 234*6236dae4SAndroid Build Coastguard Worker */ 235*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_set_dns_interface(struct Curl_easy *data, 236*6236dae4SAndroid Build Coastguard Worker const char *interf); 237*6236dae4SAndroid Build Coastguard Worker 238*6236dae4SAndroid Build Coastguard Worker /* 239*6236dae4SAndroid Build Coastguard Worker * Function provided by the resolver backend to set 240*6236dae4SAndroid Build Coastguard Worker * local IPv4 address to use as source address for DNS requests 241*6236dae4SAndroid Build Coastguard Worker */ 242*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_set_dns_local_ip4(struct Curl_easy *data, 243*6236dae4SAndroid Build Coastguard Worker const char *local_ip4); 244*6236dae4SAndroid Build Coastguard Worker 245*6236dae4SAndroid Build Coastguard Worker /* 246*6236dae4SAndroid Build Coastguard Worker * Function provided by the resolver backend to set 247*6236dae4SAndroid Build Coastguard Worker * local IPv6 address to use as source address for DNS requests 248*6236dae4SAndroid Build Coastguard Worker */ 249*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_set_dns_local_ip6(struct Curl_easy *data, 250*6236dae4SAndroid Build Coastguard Worker const char *local_ip6); 251*6236dae4SAndroid Build Coastguard Worker 252*6236dae4SAndroid Build Coastguard Worker /* 253*6236dae4SAndroid Build Coastguard Worker * Clean off entries from the cache 254*6236dae4SAndroid Build Coastguard Worker */ 255*6236dae4SAndroid Build Coastguard Worker void Curl_hostcache_clean(struct Curl_easy *data, struct Curl_hash *hash); 256*6236dae4SAndroid Build Coastguard Worker 257*6236dae4SAndroid Build Coastguard Worker /* 258*6236dae4SAndroid Build Coastguard Worker * Populate the cache with specified entries from CURLOPT_RESOLVE. 259*6236dae4SAndroid Build Coastguard Worker */ 260*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_loadhostpairs(struct Curl_easy *data); 261*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_resolv_check(struct Curl_easy *data, 262*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry **dns); 263*6236dae4SAndroid Build Coastguard Worker int Curl_resolv_getsock(struct Curl_easy *data, 264*6236dae4SAndroid Build Coastguard Worker curl_socket_t *socks); 265*6236dae4SAndroid Build Coastguard Worker 266*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_resolver_error(struct Curl_easy *data); 267*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_HOSTIP_H */ 268