X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/24d52b13cf32881fb2e8120add85ecdb06d3584d..f63b3158df6472d1c6533a552675631fdd681d20:/src/query.c diff --git a/src/query.c b/src/query.c index 3fab80c..f805c92 100644 --- a/src/query.c +++ b/src/query.c @@ -5,7 +5,12 @@ * - query submission and cancellation (user-visible and internal) */ /* - * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson + * This file is + * Copyright (C) 1997-1999 Ian Jackson + * + * It is part of adns, which is + * Copyright (C) 1997-1999 Ian Jackson + * Copyright (C) 1999 Tony Finch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +32,6 @@ #include #include #include -#include #include @@ -64,9 +68,9 @@ static adns_query query_alloc(adns_state ads, const typeinfo *typei, qu->id= 0; qu->flags= flags; - qu->udpretries= 0; + qu->retries= 0; qu->udpnextserver= 0; - qu->udpsent= qu->tcpfailed= 0; + qu->udpsent= 0; timerclear(&qu->timeout); qu->expires= now.tv_sec + MAXTTLBELIEVE; @@ -101,7 +105,6 @@ static void query_submit(adns_state ads, adns_query qu, memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used); adns__query_send(qu,now); - adns__autosys(ads,now); } adns_status adns__internal_submit(adns_state ads, adns_query *query_r, @@ -192,7 +195,7 @@ static int save_owner(adns_query qu, const char *owner, int ol) { int adns_submit(adns_state ads, const char *owner, adns_rrtype type, - adns_queryflags flags, + int flags, void *context, adns_query *query_r) { int r, ol, ndots; @@ -202,8 +205,10 @@ int adns_submit(adns_state ads, adns_query qu; const char *p; + adns__consistency(ads,0,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; @@ -220,6 +225,7 @@ int adns_submit(adns_state ads, if (ol>=1 && owner[ol-1]=='.' && (ol<2 || owner[ol-2]!='\\')) { flags &= ~adns_qf_search; + qu->flags= flags; ol--; } @@ -237,22 +243,47 @@ 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); return 0; x_adnsfail: adns__query_fail(qu,stat); + adns__consistency(ads,qu,cc_entex); return 0; x_errno: r= errno; assert(r); + adns__consistency(ads,0,cc_entex); return r; } +int adns_submit_reverse(adns_state ads, + const struct sockaddr *addr, + adns_rrtype type, + int flags, + void *context, + adns_query *query_r) { + const unsigned char *iaddr; + char buf[30]; + + if (type != adns_r_ptr && type != adns_r_ptr_raw) return EINVAL; + flags &= ~adns_qf_search; + + if (addr->sa_family != AF_INET) return ENOSYS; + iaddr= (const unsigned char*) &(((const struct sockaddr_in*)addr) -> sin_addr); + + sprintf(buf, "%d.%d.%d.%d.in-addr.arpa", + iaddr[3], iaddr[2], iaddr[1], iaddr[0]); + + return adns_submit(ads,buf,type,flags,context,query_r); +} + int adns_synchronous(adns_state ads, const char *owner, adns_rrtype type, - adns_queryflags flags, + int flags, adns_answer **answer_r) { adns_query qu; int r; @@ -342,7 +373,6 @@ static void cancel_children(adns_query qu) { ncqu= cqu->siblings.next; adns_cancel(cqu); } - LIST_INIT(qu->children); } void adns__reset_preserved(adns_query qu) { @@ -358,19 +388,28 @@ static void free_query_allocs(adns_query qu) { 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); } void adns_cancel(adns_query qu) { + adns_state ads; + + ads= qu->ads; + adns__consistency(ads,qu,cc_entex); + if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.); switch (qu->state) { - case query_tosend: case query_tcpwait: case query_tcpsent: - LIST_UNLINK(qu->ads->timew,qu); + case query_tosend: + LIST_UNLINK(ads->udpw,qu); + break; + case query_tcpw: + LIST_UNLINK(ads->tcpw,qu); break; - case query_child: - LIST_UNLINK(qu->ads->childw,qu); + case query_childw: + 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 +417,7 @@ void adns_cancel(adns_query qu) { free_query_allocs(qu); free(qu->answer); free(qu); + adns__consistency(ads,0,cc_entex); } void adns__update_expires(adns_query qu, unsigned long ttl, struct timeval now) { @@ -464,6 +504,7 @@ void adns__query_done(adns_query qu) { } else { makefinal_query(qu); LIST_LINK_TAIL(qu->ads->output,qu); + qu->state= query_done; } }