chiark / gitweb /
srv processing written (except for sorting); now to be debugged
authorian <ian>
Tue, 4 Apr 2006 23:29:24 +0000 (23:29 +0000)
committerian <ian>
Tue, 4 Apr 2006 23:29:24 +0000 (23:29 +0000)
client/adh-main.c
client/adh-opts.c
client/adnstest.c
src/adns.h
src/types.c

index 193092a8ef4e31293cf504ad51f8908cb88696d0..7065d58ecd53bd2afd82a7497d52cb2ad95296a4 100644 (file)
@@ -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 }
   };
index 9805e5e8492440ef01ee7e21c9dd0494ed7d329d..a6490375c47a842e94c5f101ee66b614c8784337 100644 (file)
@@ -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);
index 36d7ffe781f1100daf01be348dd8be6f9b935578..f7931074d9fa3092dbdb332fa9b0345e2407abe7 100644 (file)
@@ -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,
index 0f589d79bcf2f0a98676fe00f5e416b54c7896bc..b73d24a30310107a20abd1a19f5d2baf772f0d1d 100644 (file)
@@ -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;
 
index 9130a3dac42269779d67cfc5c47e3b721cf27e01..3708ad5686834e12ea04418cc58188ccfed055c4 100644 (file)
  * _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         ),