chiark / gitweb /
revert: put back postsort - the RFC doesn't say that the server does
authorian <ian>
Wed, 5 Apr 2006 00:24:37 +0000 (00:24 +0000)
committerian <ian>
Wed, 5 Apr 2006 00:24:37 +0000 (00:24 +0000)
that for us

TODO
src/internal.h
src/query.c
src/types.c

diff --git a/TODO b/TODO
index d6b1632..71e4c9d 100644 (file)
--- 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
-   */
-}
-
index 55fb2ad..5559229 100644 (file)
@@ -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,
index 3c98040..0b62ff6 100644 (file)
@@ -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;
index cfe7850..966f570 100644 (file)
@@ -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         ),