X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/adns/blobdiff_plain/a880d9baf194f91c3708dc43e41c0253978d20e2..49ebbd581edfa7350d9a48356134d3d1672dbae7:/src/query.c diff --git a/src/query.c b/src/query.c index 5e345ae..1fa26f8 100644 --- a/src/query.c +++ b/src/query.c @@ -66,7 +66,7 @@ static adns_query query_alloc(adns_state ads, const typeinfo *typei, adns__vbuf_init(&qu->search_vb); qu->search_origlen= qu->search_pos= qu->search_doneabs= 0; - qu->id= 0; + qu->id= -2; /* will be overwritten with real id before we leave adns */ qu->flags= flags; qu->retries= 0; qu->udpnextserver= 0; @@ -267,25 +267,47 @@ int adns_submit(adns_state ads, return r; } -int adns_submit_reverse(adns_state ads, - const struct sockaddr *addr, - adns_rrtype type, - adns_queryflags flags, - void *context, - adns_query *query_r) { +int adns_submit_reverse_any(adns_state ads, + const struct sockaddr *addr, + const char *zone, + adns_rrtype type, + adns_queryflags flags, + void *context, + adns_query *query_r) { const unsigned char *iaddr; - char buf[30]; + char *buf, *buf_free; + char shortbuf[100]; + int r, lreq; - 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]); + lreq= strlen(zone) + 4*4 + 1; + if (lreq > sizeof(shortbuf)) { + buf= malloc(strlen(zone) + 4*4 + 1); + if (!buf) return errno; + buf_free= buf; + } else { + buf= shortbuf; + buf_free= 0; + } + sprintf(buf, "%d.%d.%d.%d.%s", iaddr[3], iaddr[2], iaddr[1], iaddr[0], zone); - return adns_submit(ads,buf,type,flags,context,query_r); + r= adns_submit(ads,buf,type,flags,context,query_r); + free(buf_free); + return r; +} + +int adns_submit_reverse(adns_state ads, + const struct sockaddr *addr, + adns_rrtype type, + adns_queryflags flags, + void *context, + adns_query *query_r) { + if (type != adns_r_ptr && type != adns_r_ptr_raw) return EINVAL; + return adns_submit_reverse_any(ads,addr,"in-addr.arpa",type,flags,context,query_r); } int adns_synchronous(adns_state ads, @@ -479,6 +501,7 @@ void adns__query_done(adns_query qu) { adns_answer *ans; adns_query parent; + assert(!qu->ads->bug_if_query_done_now); cancel_children(qu); qu->id= -1; @@ -520,6 +543,7 @@ void adns__query_done(adns_query qu) { } void adns__query_fail(adns_query qu, adns_status stat) { + assert(!qu->ads->bug_if_query_done_now); adns__reset_preserved(qu); qu->answer->status= stat; adns__query_done(qu);