X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/8b3d55e3d8df616f6fa6d9089a9c9e567229e17b..3e2e5fab72e861e677586726f1420d2db3f1efd0:/src/query.c diff --git a/src/query.c b/src/query.c index b02abda..d1d0b31 100644 --- a/src/query.c +++ b/src/query.c @@ -27,7 +27,6 @@ #include #include #include -#include #include @@ -42,7 +41,7 @@ static adns_query query_alloc(adns_state ads, const typeinfo *typei, qu->answer= malloc(sizeof(*qu->answer)); if (!qu->answer) { free(qu); return 0; } qu->ads= ads; - qu->state= query_udp; + qu->state= query_tosend; qu->back= qu->next= qu->parent= 0; LIST_INIT(qu->children); LINK_INIT(qu->siblings); @@ -100,7 +99,7 @@ static void query_submit(adns_state ads, adns_query qu, qu->query_dglen= qu->vb.used; memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used); - adns__query_udp(qu,now); + adns__query_send(qu,now); adns__autosys(ads,now); } @@ -202,8 +201,10 @@ int adns_submit(adns_state ads, adns_query qu; const char *p; + adns__consistency(ads,cc_entex); + typei= adns__findtype(type); - if (!typei) return adns_s_unknownrrtype; + if (!typei) return ENOSYS; r= gettimeofday(&now,0); if (r) goto x_errno; qu= query_alloc(ads,typei,flags,now); if (!qu) goto x_errno; @@ -237,15 +238,18 @@ int adns_submit(adns_state ads, } query_simple(ads,qu, owner,ol, typei,flags, now); } + adns__consistency(ads,cc_entex); return 0; x_adnsfail: adns__query_fail(qu,stat); + adns__consistency(ads,cc_entex); return 0; x_errno: r= errno; assert(r); + adns__consistency(ads,cc_entex); return r; } @@ -362,15 +366,19 @@ static void free_query_allocs(adns_query qu) { } void adns_cancel(adns_query qu) { + adns_state ads; + + ads= qu->ads; + adns__consistency(ads,cc_entex); switch (qu->state) { - case query_udp: case query_tcpwait: case query_tcpsent: - LIST_UNLINK(qu->ads->timew,qu); + case query_tosend: case query_tcpwait: case query_tcpsent: + LIST_UNLINK(ads->timew,qu); break; case query_child: - LIST_UNLINK(qu->ads->childw,qu); + LIST_UNLINK(ads->childw,qu); break; case query_done: - LIST_UNLINK(qu->ads->output,qu); + LIST_UNLINK(ads->output,qu); break; default: abort(); @@ -378,6 +386,7 @@ void adns_cancel(adns_query qu) { free_query_allocs(qu); free(qu->answer); free(qu); + adns__consistency(ads,cc_entex); } void adns__update_expires(adns_query qu, unsigned long ttl, struct timeval now) { @@ -429,6 +438,8 @@ void adns__query_done(adns_query qu) { adns_answer *ans; adns_query parent; + cancel_children(qu); + qu->id= -1; ans= qu->answer; @@ -455,7 +466,7 @@ void adns__query_done(adns_query qu) { parent= qu->parent; if (parent) { LIST_UNLINK_PART(parent->children,qu,siblings.); - if (!parent->children.head) LIST_UNLINK(qu->ads->childw,parent); + LIST_UNLINK(qu->ads->childw,parent); qu->ctx.callback(parent,qu); free_query_allocs(qu); free(qu); @@ -463,6 +474,7 @@ void adns__query_done(adns_query qu) { makefinal_query(qu); LIST_LINK_TAIL(qu->ads->output,qu); } + qu->state= query_done; } void adns__query_fail(adns_query qu, adns_status stat) {