X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=src%2Fquery.c;h=717cac0d3c7418b3e751c04d65b4dfba29de09f5;hp=dd2a47a6b0851001771f05e599860cd8709424b6;hb=b3209391cb7207697e4eb1097223dc224b9e260e;hpb=f6fe6b8d26ef7cb9fcca0d9b245ce11414b416fd diff --git a/src/query.c b/src/query.c index dd2a47a..717cac0 100644 --- a/src/query.c +++ b/src/query.c @@ -83,7 +83,7 @@ static adns_query query_alloc(adns_state ads, qu->answer->expires= -1; qu->answer->nrrs= 0; qu->answer->rrs.untyped= 0; - qu->answer->rrsz= typei->rrsz; + qu->answer->rrsz= typei->getrrsz(typei,type); return qu; } @@ -148,8 +148,8 @@ static adns_status check_domain_name(adns_state ads, adns_queryflags flags, } adns_status adns__internal_submit(adns_state ads, adns_query *query_r, - const typeinfo *typei, vbuf *qumsg_vb, - int id, + const typeinfo *typei, adns_rrtype type, + vbuf *qumsg_vb, int id, adns_queryflags flags, struct timeval now, qcontext *ctx) { adns_query qu; @@ -157,7 +157,7 @@ adns_status adns__internal_submit(adns_state ads, adns_query *query_r, err= check_domain_name(ads, flags,ctx,typei, qumsg_vb->buf,qumsg_vb->used); if (err) goto x_err; - qu= query_alloc(ads,typei,typei->typekey,flags,now); + qu= query_alloc(ads,typei,type,flags,now); if (!qu) { err = adns_s_nomemory; goto x_err; } *query_r= qu; @@ -294,17 +294,7 @@ int adns_submit(adns_state ads, ol--; } -/* temporary hack */ -#define CHECK_PTR do { \ - if (type == adns_r_ptr && (ol < 5 || \ - strncmp(owner + ol - 5, ".arpa", 5))) { \ - ads->nextid++; adns__autosys(ads,now); \ - stat= adns_s_querydomainwrong; goto x_adnsfail; \ - } \ -} while (0) - if (flags & adns_qf_search) { - CHECK_PTR; r= adns__vbuf_append(&qu->search_vb,owner,ol); if (!r) { stat= adns_s_nomemory; goto x_adnsfail; } @@ -316,15 +306,12 @@ int adns_submit(adns_state ads, if (flags & adns_qf_owner) { if (!save_owner(qu,owner,ol)) { stat= adns_s_nomemory; goto x_adnsfail; } } - CHECK_PTR; query_simple(ads,qu, owner,ol, typei,flags, now); } adns__autosys(ads,now); adns__consistency(ads,qu,cc_entex); return 0; -#undef CHECK_PTR - x_adnsfail: adns__query_fail(qu,stat); adns__consistency(ads,qu,cc_entex); @@ -377,7 +364,9 @@ int adns_submit_reverse(adns_state ads, adns_queryflags flags, void *context, adns_query *query_r) { - if (type != adns_r_ptr && type != adns_r_ptr_raw) return EINVAL; + if (((type^adns_r_ptr) & adns_rrt_reprmask) && + ((type^adns_r_ptr_raw) & adns_rrt_reprmask)) + return EINVAL; return adns_submit_reverse_any(ads,addr,"in-addr.arpa", type,flags,context,query_r); } @@ -591,7 +580,7 @@ void adns__query_done(adns_query qu) { } if (ans->nrrs && qu->typei->diff_needswap) { - if (!adns__vbuf_ensure(&qu->vb,qu->typei->rrsz)) { + if (!adns__vbuf_ensure(&qu->vb,qu->answer->rrsz)) { adns__query_fail(qu,adns_s_nomemory); return; } @@ -602,7 +591,8 @@ void adns__query_done(adns_query qu) { qu->ads); } if (ans->nrrs && qu->typei->postsort) { - qu->typei->postsort(qu->ads, ans->rrs.bytes, ans->nrrs, qu->typei); + qu->typei->postsort(qu->ads, ans->rrs.bytes, + ans->nrrs,ans->rrsz, qu->typei); } ans->expires= qu->expires;