chiark / gitweb /
Abortive TXT handling.
authorian <ian>
Tue, 10 Nov 1998 02:33:36 +0000 (02:33 +0000)
committerian <ian>
Tue, 10 Nov 1998 02:33:36 +0000 (02:33 +0000)
client/adnstest.c
src/types.c

index 56cf45fa679e5ed8d99252c35725a2b647a59657..92e8a9f028e09a4381760814e5d8ad90915df1bc 100644 (file)
@@ -39,6 +39,7 @@ static const adns_rrtype defaulttypes[]= {
   adns_r_ns_raw,
   adns_r_cname,
   adns_r_ptr_raw,
+  adns_r_txt,
   adns_r_none
 };
 
@@ -80,12 +81,13 @@ int main(int argc, const char *const *argv) {
       if (r) failure("wait",r);
 
       ri= adns_rr_info(ans->type, &rrtn,&fmtn,&len, 0,0);
-      fprintf(stdout, "%s: %s; nrrs=%d; cname=%s; ",
-             argv[qi], adns_strerror(ans->status),
-             ans->nrrs, ans->cname ? ans->cname : "$");
-      fprintf(stdout, "type %s(%s) %s\n",
+      fprintf(stdout, "%s type %s(%s)%s%s: ",
+             argv[qi],
              ri ? "?" : rrtn, ri ? "?" : fmtn ? fmtn : "-",
-             adns_strerror(ri));
+             ri ? " " : "", ri ? adns_strerror(ri) : "");
+      fprintf(stdout, "%s; nrrs=%d; cname=%s\n",
+             adns_strerror(ans->status),
+             ans->nrrs, ans->cname ? ans->cname : "$");
       if (ans->nrrs) {
        assert(!ri);
        for (i=0; i<ans->nrrs; i++) {
index 66f7f522763efa472ca9f0fb881e30490168169c..c484d949894962d781b9afebf5bd1f2dd6315e07 100644 (file)
@@ -20,6 +20,8 @@
  *  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
  */
 
+#include <stdlib.h>
+
 #include <arpa/inet.h>
 
 #include "internal.h"
@@ -71,20 +73,55 @@ static adns_status pa_domain_raw(adns_query qu, int serv,
   return st;
 }
 
+static adns_status pa_txt(adns_query qu, int serv,
+                         const byte *dgram, int dglen, int cbyte, int max,
+                         void *store_r) {
+  vbuf vb;
+
+  adns__vbuf_init(&vb);
+
+  while (dg
+  char *bp;
+
+  max-= cbyte;
+  dgram+= cbyte;
+  
+  bp= adns__alloc_interim(qu,max+1); if (!bp) return adns_s_nolocalmem;
+  bp[max]= 0;
+  memcpy(bp,dgram,max);
+  *(char**)store_r= bp;
+  return adns_s_ok;
+}
+
 static void mf_str(adns_query qu, void *data) {
   char **ddp= data;
 
   adns__makefinal_str(qu,ddp);
 }
 
-static adns_status cs_str(vbuf *vb, const void *data) {
-  const char *const *ddp= data;
-  const char *dp= *ddp;
+static int csp_qstring(vbuf *vb, const char *dp) {
+  unsigned char ch;
+  char buf[10];
+
+  if (!adns__vbuf_append(vb,"\"",1)) return 0;
+
+  while ((ch= *dp++)) {
+    if (ch >= 32 && ch <= 126 && ch != '"' && ch != '\\') {
+      if (!adns__vbuf_append(vb,&ch,1)) return 0;
+    } else {
+      sprintf(buf,"\\%02x",ch);
+      if (!adns__vbuf_appendstr(vb,buf)) return 0;
+    }
+  }
   
-  return (adns__vbuf_append(vb,"\"",1) &&
-         adns__vbuf_appendstr(vb,dp) &&
-         adns__vbuf_append(vb,"\"",1))
-    ? adns_s_ok : adns_s_nolocalmem;
+  if (!adns__vbuf_append(vb,"\"",1)) return 0;
+  return 1;
+}
+
+static adns_status cs_str(vbuf *vb, const void *data) {
+  const char *const *dpp= data;
+
+  return csp_qstring(vb,*dpp) ? adns_s_ok : adns_s_nolocalmem;
 }
 
 static void mf_flat(adns_query qu, void *data) { }
@@ -119,7 +156,9 @@ static const typeinfo typeinfos[] = {
 #if 0 /*fixme*/
   { adns_r_hinfo,   "HINFO", 0,        DEEP_MEMB(strpair),   pa_hinfo       },
   { adns_r_mx_raw,  "MX",   "raw",     DEEP_MEMB(intstr),    pa_mx_raw      },
+#endif
   { adns_r_txt,     "TXT",   0,        DEEP_MEMB(str),       pa_txt         },
+#if 0 /*fixme*/
   { adns_r_rp_raw,  "RP",   "raw",     DEEP_MEMB(strpair),   pa_rp          },
                                                                           
   { adns_r_ns,      "NS",   "+addr",   DEEP_MEMB(dmaddr),    pa_dmaddr      },