From d24e2a7e320670a31d52040213c58e1be337726c Mon Sep 17 00:00:00 2001 From: ian Date: Wed, 5 Apr 2006 00:24:37 +0000 Subject: [PATCH] revert: put back postsort - the RFC doesn't say that the server does that for us --- TODO | 14 -------------- src/internal.h | 6 ++++++ src/query.c | 3 +++ src/types.c | 31 ++++++++++++++++++++++--------- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/TODO b/TODO index d6b1632..71e4c9d 100644 --- a/TODO +++ b/TODO @@ -18,17 +18,3 @@ WISHLIST: * `Nameserver sent bad response' should produce a hexdump in the log (see eg mail to ian@davenant Mon, 25 Oct 2004 14:19:46 +0100 re `compressed datagram contains loop') - - - - -static void postsort_srv(adns_state ads, void *array, int nobjs, - const struct typeinfo *typei) { - fprintf(stderr,"(postsort_srv)\n"); - /* tests: - * dig -t srv _srv._tcp.test.iwj.relativity.greenend.org.uk. - * ./adnshost_s -t srv- _sip._udp.voip.net.cam.ac.uk. - * ./adnshost_s -t srv- _jabber._tcp.jabber.org - */ -} - diff --git a/src/internal.h b/src/internal.h index 55fb2ad..5559229 100644 --- a/src/internal.h +++ b/src/internal.h @@ -159,6 +159,12 @@ typedef struct typeinfo { * string. On successful return, label_r[] and *ll_io are filled in * and *p_io points to *pe or just after the label-ending `.'. */ + void (*postsort)(adns_state ads, void *array, int nobjs, + const struct typeinfo *typei); + /* Called immediately after the RRs have been sorted, and may rearrange + * them. (This is really for the benefit of SRV's bizarre weighting + * stuff.) May be 0 to mean nothing needs to be done. + */ } typeinfo; adns_status adns__qdpl_normal(adns_state ads, diff --git a/src/query.c b/src/query.c index 3c98040..0b62ff6 100644 --- a/src/query.c +++ b/src/query.c @@ -537,6 +537,9 @@ void adns__query_done(adns_query qu) { qu->typei->diff_needswap, qu->ads); } + if (ans->nrrs && qu->typei->postsort) { + qu->typei->postsort(qu->ads, ans->rrs.bytes, ans->nrrs, qu->typei); + } ans->expires= qu->expires; parent= qu->parent; diff --git a/src/types.c b/src/types.c index cfe7850..966f570 100644 --- a/src/types.c +++ b/src/types.c @@ -63,7 +63,7 @@ * _mailbox (pap +pap_mailbox822) * _rp (pa) * _soa (pa,mf,cs) - * _srv* (qdpl,(pap),pa,mf,di,(csp),cs) + * _srv* (qdpl,(pap),pa,mf,di,(csp),cs,postsort) * _flat (mf) * * within each section: @@ -76,6 +76,7 @@ * mf_* * csp_* * cs_* + * postsort_* */ /* @@ -1003,7 +1004,7 @@ static adns_status cs_soa(vbuf *vb, const void *datap) { } /* - * _srv* (pa*2,di,cs*2,qdpl) + * _srv* (pa*2,di,cs*2,qdpl,postsort) */ static adns_status qdpl_srv(adns_state ads, @@ -1120,6 +1121,16 @@ static adns_status cs_srvha(vbuf *vb, const void *datap) { return csp_hostaddr(vb,&rrp->ha); } +static void postsort_srv(adns_state ads, void *array, int nobjs, + const struct typeinfo *typei) { + fprintf(stderr,"(postsort_srv)\n"); + /* tests: + * dig -t srv _srv._tcp.test.iwj.relativity.greenend.org.uk. + * ./adnshost_s -t srv- _sip._udp.voip.net.cam.ac.uk. + * ./adnshost_s -t srv- _jabber._tcp.jabber.org + */ +} + /* * _flat (mf) */ @@ -1137,13 +1148,13 @@ static void mf_flat(adns_query qu, void *data) { } #define DEEP_TYPE(code,rrt,fmt,memb,parser,comparer,printer) \ { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_##memb, \ - printer,parser,comparer, adns__qdpl_normal } + printer,parser,comparer, adns__qdpl_normal,0 } #define FLAT_TYPE(code,rrt,fmt,memb,parser,comparer,printer) \ { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_flat, \ - printer,parser,comparer, adns__qdpl_normal } -#define XTRA_TYPE(code,rrt,fmt,memb,parser,comparer,printer,qdpl) \ - { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_##memb, \ - printer,parser,comparer,qdpl } + printer,parser,comparer, adns__qdpl_normal,0 } +#define XTRA_TYPE(code,rrt,fmt,memb,parser,comparer,printer,qdpl,postsort) \ + { adns_r_##code, rrt,fmt,TYPESZ_M(memb), mf_##memb, \ + printer,parser,comparer,qdpl,postsort } static const typeinfo typeinfos[] = { /* Must be in ascending order of rrtype ! */ @@ -1158,13 +1169,15 @@ DEEP_TYPE(hinfo, "HINFO", 0, intstrpair,pa_hinfo, 0, cs_hinfo ), DEEP_TYPE(mx_raw, "MX", "raw",intstr, pa_mx_raw, di_mx_raw,cs_inthost ), DEEP_TYPE(txt, "TXT", 0, manyistr,pa_txt, 0, cs_txt ), DEEP_TYPE(rp_raw, "RP", "raw",strpair, pa_rp, 0, cs_rp ), -XTRA_TYPE(srv_raw,"SRV", "raw",srvraw , pa_srvraw, di_srv,cs_srvraw,qdpl_srv), +XTRA_TYPE(srv_raw,"SRV", "raw",srvraw , pa_srvraw, di_srv, cs_srvraw, + qdpl_srv, postsort_srv), FLAT_TYPE(addr, "A", "addr", addr, pa_addr, di_addr, cs_addr ), DEEP_TYPE(ns, "NS", "+addr",hostaddr,pa_hostaddr,di_hostaddr,cs_hostaddr ), DEEP_TYPE(ptr, "PTR","checked",str, pa_ptr, 0, cs_domain ), DEEP_TYPE(mx, "MX", "+addr",inthostaddr,pa_mx, di_mx, cs_inthostaddr), -XTRA_TYPE(srv, "SRV","+addr",srvha, pa_srvha, di_srv,cs_srvha, qdpl_srv), +XTRA_TYPE(srv, "SRV","+addr",srvha, pa_srvha, di_srv, cs_srvha, + qdpl_srv, postsort_srv), DEEP_TYPE(soa, "SOA","822", soa, pa_soa, 0, cs_soa ), DEEP_TYPE(rp, "RP", "822", strpair, pa_rp, 0, cs_rp ), -- 2.30.2