static struct kvlist types;
static void
-cache_record_free(struct cache_record *r, int rem)
+cache_record_free(struct cache_record *r)
{
DBG(2, "%s %s\n", dns_type_string(r->type), r->record);
- if (rem)
- avl_delete(&records, &r->avl);
- if (r->record)
- free(r->record);
- if (r->rdata)
- free(r->rdata);
- if (r->txt)
- free(r->txt);
+ avl_delete(&records, &r->avl);
free(r);
}
{
DBG(2, "%s\n", s->entry);
avl_delete(&entries, &s->avl);
- if (s->host)
- free(s->host);
- if (s->entry)
- free(s->entry);
free(s);
}
avl_for_each_element_safe(&records, r, avl, p)
if (cache_is_expired(r->time, r->ttl))
- cache_record_free(r, 1);
+ cache_record_free(r);
avl_for_each_element_safe(&entries, s, avl, t) {
if (!s->host)
struct cache_entry *s, *t;
avl_for_each_element_safe(&records, r, avl, p)
- cache_record_free(r, 1);
+ cache_record_free(r);
avl_for_each_element_safe(&entries, s, avl, t)
cache_entry_free(s);
cache_entry(struct uloop_fd *u, char *entry, int hlen, int ttl)
{
struct cache_entry *s;
+ char *entry_buf;
+ char *host_buf;
char *type;
s = avl_find_element(&entries, entry, s, avl);
if (s)
return s;
- s = malloc(sizeof(struct cache_entry));
- memset(s, 0, sizeof(struct cache_entry));
- s->avl.key = s->entry = strdup(entry);
+ s = calloc_a(sizeof(*s),
+ &entry_buf, strlen(entry) + 1,
+ &host_buf, hlen ? hlen + 1 : 0);
+
+ s->avl.key = s->entry = strcpy(entry_buf, entry);
s->time = time(NULL);
s->ttl = ttl;
if (hlen)
- s->host = strndup(s->entry, hlen);
- type = strstr(s->entry, "._");
+ s->host = strncpy(host_buf, s->entry, hlen);
+
+ type = strstr(entry_buf, "._");
if (type)
type++;
if (type)
struct cache_record *r;
int port = 0, dlen = 0, tlen = 0, nlen, rdlength;
char *p = NULL;
+ char *name_buf;
+ void *rdata_ptr, *txt_ptr;
if (!(a->class & CLASS_IN))
return;
r = cache_record_find(name, a->type, port, dlen, rdata);
if (r) {
if (!a->ttl) {
- cache_record_free(r, 1);
+ cache_record_free(r);
DBG(1, "D -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);
} else {
r->ttl = a->ttl;
if (!a->ttl)
return;
- r = malloc(sizeof(struct cache_record));
- memset(r, 0, sizeof(struct cache_record));
- r->avl.key = r->record = strdup(name);
+ r = calloc_a(sizeof(*r),
+ &name_buf, strlen(name) + 1,
+ &txt_ptr, tlen,
+ &rdata_ptr, dlen);
+
+ r->avl.key = r->record = strcpy(name_buf, name);
r->type = a->type;
r->ttl = a->ttl;
r->port = port;
r->rdlength = dlen;
r->time = time(NULL);
- if (tlen) {
- r->txt = malloc(tlen);
- if (r->txt)
- memcpy(r->txt, rdata_buffer, tlen);
- }
+ if (tlen)
+ r->txt = memcpy(txt_ptr, rdata_buffer, tlen);
- if (dlen) {
- r->rdata = malloc(dlen);
- if (!r->rdata) {
- cache_record_free(r, 0);
- return;
- }
- memcpy(r->rdata, rdata, dlen);
- }
+ if (dlen)
+ r->rdata = memcpy(rdata_ptr, rdata, dlen);
if (avl_insert(&records, &r->avl))
- cache_record_free(r, 0);
+ free(r);
else
DBG(1, "A -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);
}