From 2248cdf4943441c9a98e8ee1611d92926a1f6e66 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 4 Apr 2006 23:29:24 +0000 Subject: [PATCH] srv processing written (except for sorting); now to be debugged --- client/adh-main.c | 2 + client/adh-opts.c | 6 +-- client/adnstest.c | 2 + src/adns.h | 6 +-- src/types.c | 102 +++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 107 insertions(+), 11 deletions(-) diff --git a/client/adh-main.c b/client/adh-main.c index 193092a..7065d58 100644 --- a/client/adh-main.c +++ b/client/adh-main.c @@ -90,6 +90,7 @@ void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) { { adns_r_ptr, "ptr" }, { adns_r_mx, "mx" }, { adns_r_rp, "rp" }, + { adns_r_srv, "srv" }, { adns_r_addr, "addr" }, /* types with only one version */ @@ -104,6 +105,7 @@ void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) { { adns_r_ptr_raw, "ptr-" }, { adns_r_mx_raw, "mx-" }, { adns_r_rp_raw, "rp-" }, + { adns_r_srv_raw, "srv-" }, { adns_r_none, 0 } }; diff --git a/client/adh-opts.c b/client/adh-opts.c index 9805e5e..a649037 100644 --- a/client/adh-opts.c +++ b/client/adh-opts.c @@ -263,9 +263,9 @@ static void printusage(void) { " 11 usage problems\n" "\n" "Query types (see adns.h; default is addr):\n" - " ns soa ptr mx rp addr - enhanced versions\n" - " cname hinfo txt - types with only one version\n" - " a ns- soa- ptr- mx- rp- - _raw versions\n" + " ns soa ptr mx rp srv addr - enhanced versions\n" + " cname hinfo txt - types with only one version\n" + " a ns- soa- ptr- mx- rp- srv- - _raw versions\n" "Default is addr, or ptr for -i/--ptr queries\n", stdout); if (ferror(stdout)) sysfail("write usage message",errno); diff --git a/client/adnstest.c b/client/adnstest.c index 36d7ffe..f793107 100644 --- a/client/adnstest.c +++ b/client/adnstest.c @@ -122,11 +122,13 @@ static const adns_rrtype defaulttypes[]= { adns_r_mx_raw, adns_r_txt, adns_r_rp_raw, + adns_r_srv_raw, adns_r_addr, adns_r_ns, adns_r_ptr, adns_r_mx, + adns_r_srv, adns_r_soa, adns_r_rp, diff --git a/src/adns.h b/src/adns.h index 0f589d7..b73d24a 100644 --- a/src/adns.h +++ b/src/adns.h @@ -51,7 +51,7 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * - * $Id: adns.h,v 1.91 2006/04/04 01:21:39 ian Exp $ + * $Id: adns.h,v 1.92 2006/04/04 23:29:24 ian Exp $ */ #ifndef ADNS_H_INCLUDED @@ -315,7 +315,7 @@ typedef struct { typedef struct { int priority, weight, port; adns_rr_hostaddr ha; -} adns_rr_srvhostaddr; +} adns_rr_srvha; typedef struct { adns_status status; @@ -338,7 +338,7 @@ typedef struct { adns_rr_intstr *intstr; /* mx_raw */ adns_rr_soa *soa; /* soa, soa_raw */ adns_rr_srvraw *srvraw; /* srv_raw */ - adns_rr_srvhostaddr *srvhostaddr;/* srv */ + adns_rr_srvha *srvha;/* srv */ } rrs; } adns_answer; diff --git a/src/types.c b/src/types.c index 9130a3d..3708ad5 100644 --- a/src/types.c +++ b/src/types.c @@ -63,9 +63,11 @@ * _mailbox (pap +pap_mailbox822) * _rp (pa) * _soa (pa,mf,cs) + * _srv* (qdpl,(pap),pa,mf,di,(csp),cs,postsort) * _flat (mf) * * within each section: + * qdpl_* * pap_* * pa_* * dip_* @@ -74,6 +76,7 @@ * mf_* * csp_* * cs_* + * postsort_* */ /* @@ -1033,6 +1036,99 @@ static adns_status qdpl_srv(adns_state ads, return adns_s_ok; } +static adns_status pap_srv_begin(const parseinfo *pai, int cbyte, int max, + adns_rr_srvraw *rrp + /* might be adns_rr_srvha* */) { + const byte *dgram= pai->dgram; + int ti; + if (cbyte+6 > max) return adns_s_invaliddata; + + rrp->priority= GET_W(cbyte, ti); + rrp->weight= GET_W(cbyte, ti); + rrp->port= GET_W(cbyte, ti); + return adns_s_ok; +} + +static adns_status pa_srvraw(const parseinfo *pai, int cbyte, + int max, void *datap) { + adns_rr_srvraw *rrp= datap; + adns_status st; + + st= pap_srv_begin(pai,cbyte,max,datap); + if (st) return st; + + st= pap_domain(pai, &cbyte, max, &rrp->host, + pai->qu->flags & adns_qf_quoteok_anshost ? pdf_quoteok : 0); + if (st) return st; + + if (cbyte != max) return adns_s_invaliddata; + return adns_s_ok; +} + +static adns_status pa_srvha(const parseinfo *pai, int cbyte, + int max, void *datap) { + adns_rr_srvha *rrp= datap; + adns_status st; + + st= pap_srv_begin(pai,cbyte,max,datap); if (st) return st; + st= pap_hostaddr(pai, &cbyte, max, &rrp->ha); if (st) return st; + if (cbyte != max) return adns_s_invaliddata; + return adns_s_ok; +} + +static void mf_srvraw(adns_query qu, void *datap) { + adns_rr_srvraw *rrp= datap; + adns__makefinal_str(qu, &rrp->host); +} + +static void mf_srvha(adns_query qu, void *datap) { + adns_rr_srvha *rrp= datap; + mfp_hostaddr(qu,&rrp->ha); +} + +static int di_srv(adns_state ads, const void *datap_a, const void *datap_b) { + const adns_rr_srvraw *ap= datap_a, *bp= datap_b; + /* might be const adns_rr_svhostaddr* */ + + if (ap->priority < bp->priority) return 0; + if (ap->priority > bp->priority) return 1; + return 0; +} + +static adns_status csp_srv_begin(vbuf *vb, const adns_rr_srvraw *rrp + /* might be adns_rr_srvha* */) { + char buf[30]; + sprintf(buf,"%u %u %u ", rrp->priority, rrp->weight, rrp->port); + CSP_ADDSTR(buf); + return adns_s_ok; +} + +static adns_status cs_srvraw(vbuf *vb, const void *datap) { + const adns_rr_srvraw *rrp= datap; + adns_status st; + + st= csp_srv_begin(vb,rrp); if (st) return st; + return csp_domain(vb,rrp->host); +} + +static adns_status cs_srvha(vbuf *vb, const void *datap) { + const adns_rr_srvha *rrp= datap; + adns_status st; + + st= csp_srv_begin(vb,datap); if (st) return st; + 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) */ @@ -1071,19 +1167,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 ), -#if 0 XTRA_TYPE(srv_raw,"SRV", "raw",srvraw , pa_srvraw, di_srv, cs_srvraw, qdpl_srv, postsort_srv), -#endif 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), -#if 0 -XTRA_TYPE(srv, "SRV","+addr",srvhostaddr,pa_srvaddr,di_srv, cs_srvhostaddr, +XTRA_TYPE(srv, "SRV","+addr",srvha, pa_srvha, di_srv, cs_srvha, qdpl_srv, postsort_srv), -#endif 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