X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Faddress_cache.c;h=b6d48d02be12485466b60815bc29e3e7dc164018;hb=7b55200887d05c29abb8cea31aa914e03b806e9a;hp=381ae785a1d3ff46b689cd4239b51ec4c887b339;hpb=d2b03f006f98d504e3e30f2d4b91ce02abd19c51;p=tinc diff --git a/src/address_cache.c b/src/address_cache.c index 381ae785..b6d48d02 100644 --- a/src/address_cache.c +++ b/src/address_cache.c @@ -108,7 +108,6 @@ void add_recent_address(address_cache_t *cache, const sockaddr_t *sa) { FILE *fp = fopen(fname, "wb"); if(fp) { - fprintf(stderr, "Writing cache to %s\n", fname); fwrite(&cache->data, sizeof(cache->data), 1, fp); fclose(fp); } @@ -129,12 +128,12 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) { if(cache->ai) { if(cache->aip) { sockaddr_t *sa = (sockaddr_t *)cache->aip->ai_addr; + cache->aip = cache->aip->ai_next; if(find_cached(cache, sa) != NOT_CACHED) { continue; } - cache->aip = cache->aip->ai_next; return sa; } else { free_known_addresses(cache->ai); @@ -152,7 +151,7 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) { cache->cfg = lookup_config(cache->config_tree, "Address"); } - while(cache->cfg && !cache->ai) { + while(cache->cfg && !cache->aip) { char *address, *port; get_config_string(cache->cfg, &address); @@ -168,7 +167,32 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) { } } + if(cache->ai) { + free_known_addresses(cache->ai); + } + cache->aip = cache->ai = str2addrinfo(address, port, SOCK_STREAM); + + if(cache->ai) { + struct addrinfo *ai = NULL; + + for(; cache->aip; cache->aip = cache->aip->ai_next) { + struct addrinfo *oai = ai; + + ai = xzalloc(sizeof(*ai)); + ai->ai_family = cache->aip->ai_family; + ai->ai_socktype = cache->aip->ai_socktype; + ai->ai_protocol = cache->aip->ai_protocol; + ai->ai_addrlen = cache->aip->ai_addrlen; + ai->ai_addr = xmalloc(ai->ai_addrlen); + memcpy(ai->ai_addr, cache->aip->ai_addr, ai->ai_addrlen); + ai->ai_next = oai; + } + + freeaddrinfo(cache->ai); + cache->aip = cache->ai = ai; + } + free(address); free(port); @@ -182,7 +206,7 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) { cache->aip = cache->aip->ai_next; return sa; } else { - freeaddrinfo(cache->ai); + free_known_addresses(cache->ai); cache->ai = NULL; } } @@ -234,11 +258,7 @@ void reset_address_cache(address_cache_t *cache, const sockaddr_t *sa) { } if(cache->ai) { - if(cache->tried == cache->data.used) { - free_known_addresses(cache->ai); - } else { - freeaddrinfo(cache->ai); - } + free_known_addresses(cache->ai); } cache->config_tree = NULL; @@ -254,11 +274,7 @@ void close_address_cache(address_cache_t *cache) { } if(cache->ai) { - if(cache->tried == cache->data.used) { - free_known_addresses(cache->ai); - } else { - freeaddrinfo(cache->ai); - } + free_known_addresses(cache->ai); } free(cache);