From: Rafał Miłecki Date: Fri, 10 Mar 2017 07:59:22 +0000 (+0100) Subject: Refresh DNS records A and AAAA directly X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=80dd24602480;p=oweals%2Fmdnsd.git Refresh DNS records A and AAAA directly So far records A and AAAA were being connected and stored as a single *service*. It's possible to handle these records directly without this service trick and it also provides better control over them (some corner cases like different TTL values). Signed-off-by: Rafał Miłecki --- diff --git a/cache.c b/cache.c index 3f3f617..08f6308 100644 --- a/cache.c +++ b/cache.c @@ -75,9 +75,21 @@ cache_gc_timer(struct uloop_timeout *timeout) struct cache_record *r, *p; struct cache_service *s, *t; - avl_for_each_element_safe(&records, r, avl, p) - if (cache_is_expired(r->time, r->ttl, 100)) + avl_for_each_element_safe(&records, r, avl, p) { + if (!cache_is_expired(r->time, r->ttl, 100)) + continue; + /* Records other and A(AAA) are handled as services */ + if (r->type != TYPE_A && r->type != TYPE_AAAA) { + cache_record_free(r); + continue; + } + if (r->refresh >= 100) { cache_record_free(r); + continue; + } + r->refresh += 50; + dns_send_question(r->iface, r->record, r->type, 0); + } avl_for_each_element_safe(&services, s, avl, t) { if (!s->host) @@ -89,12 +101,9 @@ cache_gc_timer(struct uloop_timeout *timeout) continue; } s->refresh += 50; - if (cache_service_is_host(s)) { - dns_send_question(s->iface, s->entry, TYPE_A, 0); - dns_send_question(s->iface, s->entry, TYPE_AAAA, 0); - } else { - dns_send_question(s->iface, s->entry, TYPE_PTR, 0); - } + if (cache_service_is_host(s)) + continue; + dns_send_question(s->iface, s->entry, TYPE_PTR, 0); } uloop_timeout_set(timeout, 10000); diff --git a/cache.h b/cache.h index cfd6368..1315aad 100644 --- a/cache.h +++ b/cache.h @@ -44,6 +44,7 @@ struct cache_record { uint16_t rdlength; time_t time; struct interface *iface; + int refresh; }; extern struct avl_tree services;