X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=cache.c;h=6240e2f2c8ee80a9fe7751853cd3ef61c6022d11;hb=c4c7a8db3384ca5d6f13737d90d75f1f2394dcc9;hp=357caddd930bc056890edf68c9c895e06d909493;hpb=f04d8b9be03fe4f06ded9fb0f7d949ccfa491442;p=project%2Fmdnsd.git diff --git a/cache.c b/cache.c index 357cadd..6240e2f 100644 --- a/cache.c +++ b/cache.c @@ -120,20 +120,20 @@ cache_scan(void) vlist_for_each_element(&interfaces, iface, node) avl_for_each_element(&entries, s, avl) - dns_send_question(iface, s->entry, TYPE_PTR); + dns_send_question(iface, s->entry, TYPE_PTR, 1); } static struct cache_entry* cache_entry(struct interface *iface, char *entry, int hlen, int ttl) { - struct cache_entry *s; + struct cache_entry *s, *t; char *entry_buf; char *host_buf; char *type; - s = avl_find_element(&entries, entry, s, avl); - if (s) - return s; + avl_for_each_element_safe(&entries, s, avl, t) + if (!strcmp(s->entry, entry)) + return s; s = calloc_a(sizeof(*s), &entry_buf, strlen(entry) + 1, @@ -154,7 +154,7 @@ cache_entry(struct interface *iface, char *entry, int hlen, int ttl) avl_insert(&entries, &s->avl); if (!hlen) - dns_send_question(iface, entry, TYPE_PTR); + dns_send_question(iface, entry, TYPE_PTR, !iface->multicast); return s; } @@ -167,7 +167,7 @@ cache_record_find(char *record, int type, int port, int rdlength, uint8_t *rdata if (!l) return NULL; - while (l && !strcmp(l->record, record)) { + while (l && l->record && !strcmp(l->record, record)) { struct cache_record *r = l; l = avl_next_element(l, avl); @@ -274,7 +274,7 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc uint8_t v = *p; *p = '\0'; - if (v) + if (v && p + v < &rdata_buffer[rdlength]) p += v + 1; } while (*p); break; @@ -301,7 +301,7 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc if (r) { if (!a->ttl) { DBG(1, "D -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl); - cache_record_free(r); + r->time = time(0) + 1 - r->ttl; } else { r->ttl = a->ttl; DBG(1, "A -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);