aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/hostip.c66
-rw-r--r--lib/hostip.h2
-rw-r--r--lib/transfer.c48
3 files changed, 69 insertions, 47 deletions
diff --git a/lib/hostip.c b/lib/hostip.c
index 44ed0a424..03c3bc981 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -743,3 +743,69 @@ void Curl_hostcache_destroy(struct SessionHandle *data)
data->dns.hostcachetype = HCACHE_NONE;
data->dns.hostcache = NULL;
}
+
+CURLcode Curl_loadhostpairs(struct SessionHandle *data)
+{
+ struct curl_slist *hostp;
+ char hostname[256];
+ char address[256];
+ int port;
+
+ for(hostp = data->change.resolve; hostp; hostp = hostp->next ) {
+ if(!hostp->data)
+ continue;
+ if(hostp->data[0] == '-') {
+ /* TODO: mark an entry for removal */
+ }
+ else if(3 == sscanf(hostp->data, "%255[^:]:%d:%255s", hostname, &port,
+ address)) {
+ struct Curl_dns_entry *dns;
+ Curl_addrinfo *addr;
+ char *entry_id;
+ size_t entry_len;
+
+ addr = Curl_str2addr(address, port);
+ if(!addr) {
+ infof(data, "Resolve %s found illegal!\n", hostp->data);
+ continue;
+ }
+
+ /* Create an entry id, based upon the hostname and port */
+ entry_id = create_hostcache_id(hostname, port);
+ /* If we can't create the entry id, fail */
+ if(!entry_id)
+ return CURLE_OUT_OF_MEMORY;
+
+ entry_len = strlen(entry_id);
+
+ if(data->share)
+ Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
+
+ /* See if its already in our dns cache */
+ dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len+1);
+
+ /* free the allocated entry_id again */
+ free(entry_id);
+
+ if(!dns)
+ /* if not in the cache already, put this host in the cache */
+ dns = Curl_cache_addr(data, addr, hostname, port);
+ else
+ /* this is a duplicate, free it again */
+ Curl_freeaddrinfo(addr);
+
+ if(data->share)
+ Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
+
+ if(!dns) {
+ Curl_freeaddrinfo(addr);
+ return CURLE_OUT_OF_MEMORY;
+ }
+ infof(data, "Added %s:%d:%s to DNS cache\n",
+ hostname, port, address);
+ }
+ }
+ data->change.resolve = NULL; /* dealt with now */
+
+ return CURLE_OK;
+}
diff --git a/lib/hostip.h b/lib/hostip.h
index 100bdc58e..12fb80f54 100644
--- a/lib/hostip.h
+++ b/lib/hostip.h
@@ -205,4 +205,6 @@ CURLcode Curl_set_dns_servers(struct SessionHandle *data, char *servers);
*/
void Curl_hostcache_destroy(struct SessionHandle *data);
+CURLcode Curl_loadhostpairs(struct SessionHandle *data);
+
#endif /* HEADER_CURL_HOSTIP_H */
diff --git a/lib/transfer.c b/lib/transfer.c
index 21bf2464c..9f05cfbd7 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -1405,52 +1405,6 @@ Transfer(struct connectdata *conn)
return CURLE_OK;
}
-static CURLcode loadhostpairs(struct SessionHandle *data)
-{
- struct curl_slist *hostp;
- char hostname[256];
- char address[256];
- int port;
-
- for(hostp = data->change.resolve; hostp; hostp = hostp->next ) {
- if(!hostp->data)
- continue;
- if(hostp->data[0] == '-') {
- /* TODO: mark an entry for removal */
- }
- else if(3 == sscanf(hostp->data, "%255[^:]:%d:%255s", hostname, &port,
- address)) {
- struct Curl_dns_entry *dns;
- Curl_addrinfo *addr;
-
- addr = Curl_str2addr(address, port);
- if(!addr) {
- infof(data, "Resolve %s found illegal!\n", hostp->data);
- continue;
- }
-
- if(data->share)
- Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
-
- /* put this host in the cache */
- dns = Curl_cache_addr(data, addr, hostname, port);
-
- if(data->share)
- Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
-
- if(!dns) {
- Curl_freeaddrinfo(addr);
- return CURLE_OUT_OF_MEMORY;
- }
- infof(data, "Added %s:%d:%s to DNS cache\n",
- hostname, port, address);
- }
- }
- data->change.resolve = NULL; /* dealt with now */
-
- return CURLE_OK;
-}
-
/*
* Curl_pretransfer() is called immediately before a transfer starts.
@@ -1490,7 +1444,7 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
/* If there is a list of host pairs to deal with */
if(data->change.resolve)
- res = loadhostpairs(data);
+ res = Curl_loadhostpairs(data);
if(!res) {
/* Allow data->set.use_port to set which port to use. This needs to be