chiark / gitweb /
Proper spec. of NULL handling.
[adns.git] / src / types.c
index 66f7f522763efa472ca9f0fb881e30490168169c..2a96609a2eed6f3bec3e195e72c477e3ad1a6d45 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"
@@ -77,14 +79,29 @@ static void mf_str(adns_query qu, void *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 +136,7 @@ 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      },
-  { adns_r_txt,     "TXT",   0,        DEEP_MEMB(str),       pa_txt         },
+  { adns_r_txt,     "TXT",   0,        DEEP_MEMB(manystr),   pa_txt         },
   { adns_r_rp_raw,  "RP",   "raw",     DEEP_MEMB(strpair),   pa_rp          },
                                                                           
   { adns_r_ns,      "NS",   "+addr",   DEEP_MEMB(dmaddr),    pa_dmaddr      },