25 #ifdef HAVE_NETINET_IN_H 26 #include <netinet/in.h> 31 #ifdef HAVE_ARPA_INET_H 32 #include <arpa/inet.h> 64 #if defined(CURLRES_SYNCH) && \ 65 defined(HAVE_ALARM) && defined(SIGALRM) && defined(HAVE_SIGSETJMP) 67 #define USE_ALARM_TIMEOUT 168 const struct sockaddr_in *sa4;
169 const struct in_addr *ipaddr4;
171 const struct sockaddr_in6 *sa6;
172 const struct in6_addr *ipaddr6;
177 sa4 = (
const void *)ai->
ai_addr;
178 ipaddr4 = &sa4->sin_addr;
183 sa6 = (
const void *)ai->
ai_addr;
184 ipaddr6 = &sa6->sin6_addr;
202 char *
id =
aprintf(
"%s:%d", name, port);
206 while(*ptr && (*ptr !=
':')) {
280 #ifdef HAVE_SIGSETJMP 284 sigjmp_buf curl_jmpenv;
293 char *entry_id = NULL;
304 entry_len = strlen(entry_id);
317 infof(data,
"Hostname in DNS cache was stale, zapped\n");
390 entry_len = strlen(entry_id);
462 infof(data,
"Hostname %s was found in DNS cache\n", hostname);
488 "LocalHost"))?
"localhost":
490 hostname, port, &respwait);
529 #ifdef USE_ALARM_TIMEOUT 540 siglongjmp(curl_jmpenv, 1);
572 #ifdef USE_ALARM_TIMEOUT 573 #ifdef HAVE_SIGACTION 574 struct sigaction keep_sigact;
575 volatile bool keep_copysig =
FALSE;
576 struct sigaction sigact;
579 void (*keep_sigact)(int);
583 volatile unsigned int prev_alarm = 0;
594 #ifdef USE_ALARM_TIMEOUT 599 timeout = (timeoutms > LONG_MAX) ? LONG_MAX : (
long)timeoutms;
609 "remaining timeout of %ld too small to resolve via SIGALRM method",
619 if(sigsetjmp(curl_jmpenv, 1)) {
621 failf(data,
"name lookup timed out");
630 #ifdef HAVE_SIGACTION 631 sigaction(SIGALRM, NULL, &sigact);
632 keep_sigact = sigact;
634 sigact.sa_handler = alarmfunc;
637 sigact.sa_flags &= ~SA_RESTART;
640 sigaction(SIGALRM, &sigact, NULL);
644 keep_sigact = signal(SIGALRM, alarmfunc);
654 #ifndef CURLRES_ASYNCH 656 infof(conn->
data,
"timeout on name lookup is not supported\n");
667 #ifdef USE_ALARM_TIMEOUT 674 #ifdef HAVE_SIGACTION 678 sigaction(SIGALRM, &keep_sigact, NULL);
683 signal(SIGALRM, keep_sigact);
695 unsigned long alarm_set = prev_alarm - elapsed_secs;
698 ((alarm_set >= 0x80000000) && (prev_alarm < 0x80000000)) ) {
705 failf(data,
"Previous alarm fired off!");
708 alarm((
unsigned int)alarm_set);
724 if(data && data->
share)
729 if(data && data->
share)
742 if(dns->
inuse == 0) {
767 if(data && data->
share)
772 if(data && data->
share)
787 if(hostp->
data[0] ==
'-') {
791 if(2 != sscanf(hostp->
data + 1,
"%255[^:]:%d", hostname, &port)) {
792 infof(data,
"Couldn't parse CURLOPT_RESOLVE removal entry '%s'!\n",
804 entry_len = strlen(entry_id);
824 if(3 != sscanf(hostp->
data,
"%255[^:]:%d:%255s", hostname, &port,
826 infof(data,
"Couldn't parse CURLOPT_RESOLVE entry '%s'!\n",
833 infof(data,
"Address in '%s' found illegal!\n", hostp->
data);
845 entry_len = strlen(entry_id);
877 infof(data,
"Added %s:%d:%s to DNS cache\n",
878 hostname, port, address);
#define CURLRESOLV_RESOLVED
int Curl_hash_init(struct curl_hash *h, int slots, hash_function hfunc, comp_function comparator, curl_hash_dtor dtor)
void Curl_hostcache_prune(struct Curl_easy *data)
void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user, int(*comp)(void *, void *))
static char * create_hostcache_id(const char *name, int port)
int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len)
static int hostcache_timestamp_remove(void *datap, void *hc)
#define CURLRESOLV_PENDING
UNITTEST_START char * ptr
void Curl_freeaddrinfo(Curl_addrinfo *cahead)
void Curl_hash_destroy(struct curl_hash *h)
void Curl_hash_clean(struct curl_hash *h)
static struct curl_hash hostname_cache
UNITTEST_START int result
bool Curl_ipvalid(struct connectdata *conn)
struct curl_hash * hostcache
struct Curl_share * share
struct DynamicStatic change
char * Curl_inet_ntop(int af, const void *src, char *buf, size_t size)
struct sockaddr * ai_addr
struct curl_hash * Curl_global_host_cache_init(void)
void Curl_global_host_cache_dtor(void)
int Curl_mk_dnscache(struct curl_hash *hash)
CURLSHcode Curl_share_unlock(struct Curl_easy *data, curl_lock_data type)
static void hostcache_prune(struct curl_hash *hostcache, long cache_timeout, time_t now)
const char * Curl_printable_address(const Curl_addrinfo *ai, char *buf, size_t bufsize)
size_t Curl_str_key_compare(void *k1, size_t key1_len, void *k2, size_t key2_len)
int Curl_resolv(struct connectdata *conn, const char *hostname, int port, struct Curl_dns_entry **entry)
void Curl_resolv_unlock(struct Curl_easy *data, struct Curl_dns_entry *dns)
static unsigned short port
struct Curl_addrinfo * ai_next
static struct Curl_dns_entry * fetch_addr(struct connectdata *conn, const char *hostname, int port)
void Curl_hostcache_clean(struct Curl_easy *data, struct curl_hash *hash)
int Curl_num_addresses(const Curl_addrinfo *addr)
struct Curl_dns_entry * Curl_cache_addr(struct Curl_easy *data, Curl_addrinfo *addr, const char *hostname, int port)
int Curl_resolv_timeout(struct connectdata *conn, const char *hostname, int port, struct Curl_dns_entry **entry, time_t timeoutms)
CURLcode Curl_resolver_is_resolved(struct connectdata *conn, struct Curl_dns_entry **dns)
struct curl_slist * resolve
Curl_addrinfo * Curl_str2addr(char *address, int port)
#define Curl_tvdiff(x, y)
size_t Curl_hash_str(void *key, size_t key_length, size_t slots_num)
CURLSHcode Curl_share_lock(struct Curl_easy *data, curl_lock_data type, curl_lock_access accesstype)
#define CURLRESOLV_TIMEDOUT
void * Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
unsigned int curlx_sltoui(long slnum)
struct Curl_dns_entry * Curl_fetch_addr(struct connectdata *conn, const char *hostname, int port)
Curl_addrinfo * Curl_getaddrinfo(struct connectdata *conn, const char *hostname, int port, int *waitp)
static int host_cache_initialized
static void freednsentry(void *freethis)
void * Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len)
#define calloc(nbelem, size)
CURLcode Curl_loadhostpairs(struct Curl_easy *data)