X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fmdnsd.git;a=blobdiff_plain;f=cache.c;fp=cache.c;h=f2687e115b50a386dfdc50e1abf9210d5d028e5c;hp=e4479226609b0b2ac69b92ec0f3755af03270ef1;hb=4fca836ba3d9524488bad0d8ffd0cbe8a124140a;hpb=60ca4afc613db69b900a1b8283d12c2e831db200 diff --git a/cache.c b/cache.c index e447922..f2687e1 100644 --- a/cache.c +++ b/cache.c @@ -61,9 +61,9 @@ cache_service_free(struct cache_service *s) } static int -cache_is_expired(time_t t, uint32_t ttl) +cache_is_expired(time_t t, uint32_t ttl, int frac) { - if (time(NULL) - t >= ttl) + if (time(NULL) - t >= ttl * frac / 100) return 1; return 0; @@ -76,14 +76,20 @@ cache_gc_timer(struct uloop_timeout *timeout) struct cache_service *s, *t; avl_for_each_element_safe(&records, r, avl, p) - if (cache_is_expired(r->time, r->ttl)) + if (cache_is_expired(r->time, r->ttl, 100)) cache_record_free(r); avl_for_each_element_safe(&services, s, avl, t) { if (!s->host) continue; - if (cache_is_expired(s->time, s->ttl)) + if (!cache_is_expired(s->time, s->ttl, s->refresh)) + continue; + if (s->refresh >= 100) { cache_service_free(s); + continue; + } + s->refresh += 50; + dns_send_question(s->iface, s->entry, TYPE_PTR, 1); } uloop_timeout_set(timeout, 10000); @@ -134,8 +140,11 @@ cache_service(struct interface *iface, char *entry, int hlen, int ttl) char *type; avl_for_each_element_safe(&services, s, avl, t) - if (!strcmp(s->entry, entry)) + if (!strcmp(s->entry, entry)) { + s->refresh = 50; + s->time = time(NULL); return s; + } s = calloc_a(sizeof(*s), &entry_buf, strlen(entry) + 1, @@ -145,6 +154,7 @@ cache_service(struct interface *iface, char *entry, int hlen, int ttl) s->time = time(NULL); s->ttl = ttl; s->iface = iface; + s->refresh = 50; if (hlen) s->host = strncpy(host_buf, s->entry, hlen);