X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/adns/blobdiff_plain/ca00c406d966d65b85d1f94c3d618ccec8de1dc3..8715e68b18f84b2bc64d44caffc6862db5e2d4c8:/src/query.c?ds=sidebyside diff --git a/src/query.c b/src/query.c index c18ba8e..0808534 100644 --- a/src/query.c +++ b/src/query.c @@ -104,8 +104,8 @@ static void query_submit(adns_state ads, adns_query qu, qu->id= id; qu->query_dglen= qu->vb.used; memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used); - - adns__query_send(qu,now); + + typei->query_send(qu,now); } adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, @@ -148,6 +148,7 @@ static adns_status check_domain_name(adns_state ads, adns_queryflags flags, } adns_status adns__internal_submit(adns_state ads, adns_query *query_r, + adns_query parent, const typeinfo *typei, adns_rrtype type, vbuf *qumsg_vb, int id, adns_queryflags flags, struct timeval now, @@ -161,6 +162,8 @@ adns_status adns__internal_submit(adns_state ads, adns_query *query_r, if (!qu) { err = adns_s_nomemory; goto x_err; } *query_r= qu; + qu->parent= parent; + LIST_LINK_TAIL_PART(parent->children,qu,siblings.); memcpy(&qu->ctx,ctx,sizeof(qu->ctx)); query_submit(ads,qu, typei,qumsg_vb,id,flags,now); @@ -309,18 +312,18 @@ int adns_submit(adns_state ads, query_simple(ads,qu, owner,ol, typei,flags, now); } adns__autosys(ads,now); - adns__consistency(ads,qu,cc_entex); + adns__returning(ads,qu); return 0; x_adnsfail: adns__query_fail(qu,stat); - adns__consistency(ads,qu,cc_entex); + adns__returning(ads,qu); return 0; x_errno: r= errno; assert(r); - adns__consistency(ads,0,cc_entex); + adns__returning(ads,0); return r; } @@ -415,6 +418,17 @@ static allocnode *alloc_info(adns_query qu, void *p, size_t *sz_r) { return an; } +void adns__free_interim(adns_query qu, void *p) { + size_t sz; + allocnode *an= alloc_info(qu, p, &sz); + + if (!an) return; + assert(!qu->final_allocspace); + LIST_UNLINK(qu->allocations, an); + free(an); + qu->interim_allocd -= sz; +} + void *adns__alloc_mine(adns_query qu, size_t sz) { return alloc_common(qu,MEM_ROUND(sz)); } @@ -453,18 +467,18 @@ void *adns__alloc_final(adns_query qu, size_t sz) { return rp; } -static void cancel_children(adns_query qu) { +void adns__cancel_children(adns_query qu) { adns_query cqu, ncqu; for (cqu= qu->children.head; cqu; cqu= ncqu) { ncqu= cqu->siblings.next; - adns_cancel(cqu); + adns__cancel(cqu); } } void adns__reset_preserved(adns_query qu) { assert(!qu->final_allocspace); - cancel_children(qu); + adns__cancel_children(qu); qu->answer->nrrs= 0; qu->answer->rrs.untyped= 0; qu->interim_allocd= qu->preserved_allocd; @@ -473,7 +487,7 @@ void adns__reset_preserved(adns_query qu) { static void free_query_allocs(adns_query qu) { allocnode *an, *ann; - cancel_children(qu); + adns__cancel_children(qu); for (an= qu->allocations.head; an; an= ann) { ann= an->next; free(an); } LIST_INIT(qu->allocations); adns__vbuf_free(&qu->vb); @@ -482,11 +496,15 @@ static void free_query_allocs(adns_query qu) { qu->query_dgram= 0; } -void adns_cancel(adns_query qu) { +void adns__returning(adns_state ads, adns_query qu_for_caller) { + adns__consistency(ads,qu_for_caller,cc_entex); +} + +void adns__cancel(adns_query qu) { adns_state ads; ads= qu->ads; - adns__consistency(ads,qu,cc_entex); + adns__consistency(ads,qu,cc_freq); if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.); switch (qu->state) { case query_tosend: @@ -507,7 +525,16 @@ void adns_cancel(adns_query qu) { free_query_allocs(qu); free(qu->answer); free(qu); - adns__consistency(ads,0,cc_entex); +} + +void adns_cancel(adns_query qu) { + adns_state ads; + + assert(!qu->parent); + ads= qu->ads; + adns__consistency(ads,qu,cc_entex); + adns__cancel(qu); + adns__returning(ads,0); } void adns__update_expires(adns_query qu, unsigned long ttl, @@ -561,7 +588,7 @@ void adns__query_done(adns_query qu) { adns_answer *ans; adns_query parent; - cancel_children(qu); + adns__cancel_children(qu); qu->id= -1; ans= qu->answer;