X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftypes.c;h=2a96609a2eed6f3bec3e195e72c477e3ad1a6d45;hb=916c16caf305556040317cafbc084ba38996bab1;hp=66f7f522763efa472ca9f0fb881e30490168169c;hpb=ffbda80c54147d112c125f208f6611daf09358b3;p=adns.git diff --git a/src/types.c b/src/types.c index 66f7f52..2a96609 100644 --- a/src/types.c +++ b/src/types.c @@ -20,6 +20,8 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include + #include #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 },