*/
/*
* This file is part of adns, which is
- * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
+ * Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson
* Copyright (C) 2014 Mark Wooding
* Copyright (C) 1999-2000,2003,2006 Tony Finch
* Copyright (C) 1991 Massachusetts Institute of Technology
adns_rr_addr a;
char addrbuf[ADNS_ADDR2TEXT_BUFLEN];
int err;
+ socklen_t salen;
- a.len= sizeof(a.addr);
- err= adns_text2addr(buf,DNS_PORT, 0, &a.addr.sa,&a.len);
+ salen= sizeof(a.addr);
+ err= adns_text2addr(buf,DNS_PORT, 0, &a.addr.sa,&salen);
+ a.len= salen;
switch (err) {
case 0:
break;
}
adns__debug(ads,-1,0,"using nameserver %s",
adns__sockaddr_ntoa(&a.addr.sa, addrbuf));
- addserver(ads,&a.addr.sa,a.len);
+ addserver(ads,&a.addr.sa,salen);
}
static void ccf_search(adns_state ads, const char *fn,
tl= 0;
while (nextword(&bufp,&word,&l)) { count++; tl += l+1; }
- newptrs= malloc(sizeof(char*)*count);
- if (!newptrs) { saveerr(ads,errno); return; }
+ if (count) {
+ newptrs= malloc(sizeof(char*)*count);
+ if (!newptrs) { saveerr(ads,errno); return; }
- newchars= malloc(tl);
- if (!newchars) { saveerr(ads,errno); free(newptrs); return; }
+ newchars= malloc(tl);
+ if (!newchars) { saveerr(ads,errno); free(newptrs); return; }
+ } else {
+ assert(!tl);
+ newptrs= 0;
+ newchars= 0;
+ }
bufp= buf;
pp= newptrs;
static int gen_pton(const char *text, int want_af, adns_sockaddr *a) {
int err;
- int len;
+ socklen_t len;
len= sizeof(*a);
err= adns_text2addr(text,0, adns_qf_addrlit_scope_forbid,
}
} else {
maskwhat = "prefix length";
- initial= strtoul(slash,&ep,10);
- if (*ep || initial>adns__addr_width(sl->base.sa.sa_family)) {
+ unsigned long prefixlen = strtoul(slash,&ep,10);
+ if (*ep || prefixlen>adns__addr_width(sl->base.sa.sa_family)) {
configparseerr(ads,fn,lno,"mask length `%s' invalid",slash);
continue;
}
+ initial= prefixlen;
sl->mask.sa.sa_family= sl->base.sa.sa_family;
adns__prefix_mask(&sl->mask, initial);
}
r= init_finish(ads);
if (r) return r;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_exit);
*ads_r= ads;
return 0;
}
}
r= init_finish(ads); if (r) return r;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_exit);
*ads_r= ads;
return 0;
}
return init_files(newstate_r, flags, logfn, logfndata);
}
+static void cancel_all(adns_query qu) {
+ if (!qu->parent) adns__cancel(qu);
+ else cancel_all(qu->parent);
+}
+
void adns_finish(adns_state ads) {
int i;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
for (;;) {
- if (ads->udpw.head) adns__cancel(ads->udpw.head);
- else if (ads->tcpw.head) adns__cancel(ads->tcpw.head);
- else if (ads->childw.head) adns__cancel(ads->childw.head);
- else if (ads->output.head) adns__cancel(ads->output.head);
- else if (ads->intdone.head) adns__cancel(ads->output.head);
+ if (ads->udpw.head) cancel_all(ads->udpw.head);
+ else if (ads->tcpw.head) cancel_all(ads->tcpw.head);
+ else if (ads->childw.head) cancel_all(ads->childw.head);
+ else if (ads->output.head) cancel_all(ads->output.head);
+ else if (ads->intdone.head) cancel_all(ads->output.head);
else break;
}
for (i=0; i<ads->nudpsockets; i++) close(ads->udpsockets[i].fd);
}
void adns_forallqueries_begin(adns_state ads) {
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
ads->forallnext=
ads->udpw.head ? ads->udpw.head :
ads->tcpw.head ? ads->tcpw.head :
adns_query adns_forallqueries_next(adns_state ads, void **context_r) {
adns_query qu, nqu;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
nqu= ads->forallnext;
for (;;) {
qu= nqu;