From: John Crispin Date: Thu, 4 Sep 2014 20:35:48 +0000 (+0200) Subject: add a iface pointer to services and records X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=60ca4afc613db69b900a1b8283d12c2e831db200;p=oweals%2Fmdnsd.git add a iface pointer to services and records Signed-off-by: John Crispin --- diff --git a/cache.c b/cache.c index 190290a..e447922 100644 --- a/cache.c +++ b/cache.c @@ -100,16 +100,18 @@ cache_init(void) return 0; } -void cache_cleanup(void) +void cache_cleanup(struct interface *iface) { struct cache_record *r, *p; struct cache_service *s, *t; - avl_for_each_element_safe(&records, r, avl, p) - cache_record_free(r); - avl_for_each_element_safe(&services, s, avl, t) - cache_service_free(s); + if (!iface || iface == s->iface) + cache_service_free(s); + + avl_for_each_element_safe(&records, r, avl, p) + if (!iface || iface == r->iface) + cache_record_free(r); } void @@ -142,6 +144,7 @@ cache_service(struct interface *iface, char *entry, int hlen, int ttl) s->avl.key = s->entry = strcpy(entry_buf, entry); s->time = time(NULL); s->ttl = ttl; + s->iface = iface; if (hlen) s->host = strncpy(host_buf, s->entry, hlen); @@ -320,6 +323,7 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc r->port = port; r->rdlength = dlen; r->time = time(NULL); + r->iface = iface; if (tlen) r->txt = memcpy(txt_ptr, rdata_buffer, tlen); diff --git a/cache.h b/cache.h index 72bd08c..211f464 100644 --- a/cache.h +++ b/cache.h @@ -19,6 +19,7 @@ #include #include "dns.h" +#include "interface.h" struct cache_service { struct avl_node avl; @@ -27,6 +28,7 @@ struct cache_service { const char *host; uint32_t ttl; time_t time; + struct interface *iface; }; struct cache_record { @@ -40,13 +42,14 @@ struct cache_record { const uint8_t *rdata; uint16_t rdlength; time_t time; + struct interface *iface; }; extern struct avl_tree services; int cache_init(void); void cache_scan(void); -void cache_cleanup(void); +void cache_cleanup(struct interface *iface); void cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struct dns_answer *a, uint8_t *rdata, int flush); int cache_host_is_known(char *record); diff --git a/main.c b/main.c index 1806dfc..02d13f5 100644 --- a/main.c +++ b/main.c @@ -98,7 +98,7 @@ main(int argc, char **argv) uloop_done(); interface_shutdown(); - cache_cleanup(); + cache_cleanup(NULL); service_cleanup(); vlist_flush(&interfaces);