* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#include <stdlib.h>
+
#include <arpa/inet.h>
#include "internal.h"
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) { }
#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 },