From c44d8b51ffb5a413f8bbdbd9991bbc573853e397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henryk=20Pl=C3=B6tz?= Date: Fri, 3 Oct 2014 20:04:14 +0200 Subject: Apply patch djbdns-1.05-test27.diff.bz2 Source was http://www.fefe.de/dns/djbdns-1.05-test27.diff.bz2, SHA1 f0380ec1866f49c0bcf6369a923ac0a4a5095da8 --- dnstrace.c | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) (limited to 'dnstrace.c') diff --git a/dnstrace.c b/dnstrace.c index 3f2159b..1d331bd 100644 --- a/dnstrace.c +++ b/dnstrace.c @@ -4,6 +4,7 @@ #include "str.h" #include "byte.h" #include "ip4.h" +#include "ip6.h" #include "gen_alloc.h" #include "gen_allocdefs.h" #include "exit.h" @@ -30,7 +31,7 @@ void usage(void) } static stralloc querystr; -char ipstr[IP4_FMT]; +char ipstr[IP6_FMT]; static stralloc tmp; void printdomain(const char *d) @@ -42,19 +43,19 @@ void printdomain(const char *d) static struct dns_transmit tx; -int resolve(char *q,char qtype[2],char ip[4]) +int resolve(char *q,char qtype[2],char ip[16]) { struct taia start; struct taia stamp; struct taia deadline; - char servers[64]; + char servers[256]; iopause_fd x[1]; int r; taia_now(&start); - byte_zero(servers,64); - byte_copy(servers,4,ip); + byte_zero(servers,256); + byte_copy(servers,16,ip); if (dns_transmit_start(&tx,servers,0,q,qtype,"\0\0\0\0") == -1) return -1; @@ -82,7 +83,7 @@ int resolve(char *q,char qtype[2],char ip[4]) struct address { char *owner; - char ip[4]; + char ip[16]; } ; GEN_ALLOC_typedef(address_alloc,struct address,s,len,a) @@ -117,7 +118,7 @@ struct qt { char *owner; char type[2]; char *control; - char ip[4]; + char ip[16]; } ; GEN_ALLOC_typedef(qt_alloc,struct qt,s,len,a) @@ -126,7 +127,7 @@ GEN_ALLOC_append(qt_alloc,struct qt,s,len,a,i,n,x,30,qt_alloc_readyplus,qt_alloc static qt_alloc qt; -void qt_add(const char *q,const char type[2],const char *control,const char ip[4]) +void qt_add(const char *q,const char type[2],const char *control,const char ip[16]) { struct qt x; int i; @@ -137,14 +138,14 @@ void qt_add(const char *q,const char type[2],const char *control,const char ip[4 if (dns_domain_equal(qt.s[i].owner,q)) if (dns_domain_equal(qt.s[i].control,control)) if (byte_equal(qt.s[i].type,2,type)) - if (byte_equal(qt.s[i].ip,4,ip)) + if (byte_equal(qt.s[i].ip,16,ip)) return; byte_zero(&x,sizeof x); if (!dns_domain_copy(&x.owner,q)) nomem(); if (!dns_domain_copy(&x.control,control)) nomem(); byte_copy(x.type,2,type); - byte_copy(x.ip,4,ip); + byte_copy(x.ip,16,ip); if (!qt_alloc_append(&qt,&x)) nomem(); } @@ -203,7 +204,7 @@ void ns_add(const char *owner,const char *server) qt_add(query.s[i].owner,query.s[i].type,owner,address.s[j].ip); } -void address_add(const char *owner,const char ip[4]) +void address_add(const char *owner,const char ip[16]) { struct address x; int i; @@ -213,17 +214,20 @@ void address_add(const char *owner,const char ip[4]) buffer_puts(buffer_1,"A:"); printdomain(owner); buffer_puts(buffer_1,":"); - buffer_put(buffer_1,ipstr,ip4_fmt(ipstr,ip)); + if (ip6_isv4mapped(ip)) + buffer_put(buffer_1,ipstr,ip4_fmt(ipstr,ip+12)); + else + buffer_put(buffer_1,ipstr,ip6_fmt(ipstr,ip)); buffer_puts(buffer_1,"\n"); for (i = 0;i < address.len;++i) if (dns_domain_equal(address.s[i].owner,owner)) - if (byte_equal(address.s[i].ip,4,ip)) + if (byte_equal(address.s[i].ip,16,ip)) return; byte_zero(&x,sizeof x); if (!dns_domain_copy(&x.owner,owner)) nomem(); - byte_copy(x.ip,4,ip); + byte_copy(x.ip,16,ip); if (!address_alloc_append(&address,&x)) nomem(); for (i = 0;i < ns.len;++i) @@ -331,7 +335,12 @@ void parsepacket(const char *buf,unsigned int len,const char *d,const char dtype ns_add(t1,t2); } else if (typematch(header,DNS_T_A) && datalen == 4) { - if (!dns_packet_copy(buf,len,pos,misc,4)) goto DIE; + if (!dns_packet_copy(buf,len,pos,misc+12,4)) goto DIE; + byte_copy(misc,12,V4mappedprefix); + address_add(t1,misc); + } + else if (typematch(header,DNS_T_AAAA) && datalen == 16) { + if (!dns_packet_copy(buf,len,pos,misc,16)) goto DIE; address_add(t1,misc); } } @@ -419,8 +428,8 @@ int main(int argc,char **argv) while (*++argv) { if (!stralloc_copys(&udn,*argv)) nomem(); - if (dns_ip4_qualify(&out,&fqdn,&udn) == -1) nomem(); /* XXX */ - for (i = 0;i + 4 <= out.len;i += 4) + if (dns_ip6_qualify(&out,&fqdn,&udn) == -1) nomem(); /* XXX */ + for (i = 0;i + 16 <= out.len;i += 16) address_add("",out.s + i); } @@ -429,7 +438,7 @@ int main(int argc,char **argv) control = qt.s[i].control; if (!dns_domain_suffix(q,control)) continue; byte_copy(type,2,qt.s[i].type); - byte_copy(ip,4,qt.s[i].ip); + byte_copy(ip,16,qt.s[i].ip); if (!stralloc_copys(&querystr,"")) nomem(); uint16_unpack_big(type,&u16); @@ -439,7 +448,10 @@ int main(int argc,char **argv) if (!stralloc_cats(&querystr,":")) nomem(); if (!dns_domain_todot_cat(&querystr,control)) nomem(); if (!stralloc_cats(&querystr,":")) nomem(); - if (!stralloc_catb(&querystr,ipstr,ip4_fmt(ipstr,ip))) nomem(); + if (ip6_isv4mapped(ip)) { + if (!stralloc_catb(&querystr,ipstr,ip4_fmt(ipstr,ip+12))) nomem(); + } else + if (!stralloc_catb(&querystr,ipstr,ip6_fmt(ipstr,ip))) nomem(); if (!stralloc_cats(&querystr,":")) nomem(); buffer_put(buffer_1,querystr.s,querystr.len); -- cgit v1.2.3