X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsetup.c;h=3646968cd7a3b27d9126f412f749212464abae6c;hb=fc440c64836370db9d8cb1a25f09c9df0786f865;hp=54b93a89d0d763b0972a6da17158732d158aa76d;hpb=8fbc5b14a8b960b8e1c865ade0fba390adc6fefd;p=adns.git diff --git a/src/setup.c b/src/setup.c index 54b93a8..3646968 100644 --- a/src/setup.c +++ b/src/setup.c @@ -5,7 +5,7 @@ */ /* * This file is part of adns, which is - * Copyright (C) 1997-2000,2003,2006,2014-2016 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 @@ -228,11 +228,12 @@ static void ccf_sortlist(adns_state ads, const char *fn, } } 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); } @@ -741,7 +742,7 @@ static int init_files(adns_state *ads_r, adns_initflags flags, 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; } @@ -767,7 +768,7 @@ static int init_strcfg(adns_state *ads_r, adns_initflags flags, } 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; } @@ -791,15 +792,20 @@ int adns_init_logfn(adns_state *newstate_r, adns_initflags flags, 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; inudpsockets; i++) close(ads->udpsockets[i].fd); @@ -811,7 +817,7 @@ void adns_finish(adns_state ads) { } 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 : @@ -822,7 +828,7 @@ void adns_forallqueries_begin(adns_state ads) { 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;