X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/adns/blobdiff_plain/11a38eb17bbedce089254ff65f8c01f9d78004d3..e719af5942771e36ca8ae4d41d2dd5dbf14b71c0:/src/query.c diff --git a/src/query.c b/src/query.c index c18ba8e..9360fb8 100644 --- a/src/query.c +++ b/src/query.c @@ -104,16 +104,17 @@ 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, union checklabel_state *cls, qcontext *ctx, int labnum, - const char *label, int lablen) + const char *dgram, int labstart, int lablen) { int i, c; + const char *label = dgram+labstart; if (flags & adns_qf_quoteok_query) return adns_s_ok; for (i=0; i= 0); err= typei->checklabel(ads,flags, &cls,ctx, - labnum++, dgram+labstart,lablen); + labnum++, dgram,labstart,lablen); if (err) return err; } while (lablen); return adns_s_ok; @@ -415,6 +416,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,7 +465,7 @@ 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) { @@ -464,7 +476,7 @@ static void cancel_children(adns_query qu) { 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 +485,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); @@ -561,7 +573,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;