From 1b644113558c46bf8c4982c69390e5914b430f88 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 10 Nov 1998 02:33:36 +0000 Subject: [PATCH] Abortive TXT handling. --- client/adnstest.c | 12 ++++++----- src/types.c | 53 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/client/adnstest.c b/client/adnstest.c index 56cf45f..92e8a9f 100644 --- a/client/adnstest.c +++ b/client/adnstest.c @@ -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; inrrs; i++) { diff --git a/src/types.c b/src/types.c index 66f7f52..c484d94 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" @@ -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 }, -- 2.30.2