aboutsummaryrefslogtreecommitdiff
path: root/dnstrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'dnstrace.c')
-rw-r--r--dnstrace.c50
1 files changed, 31 insertions, 19 deletions
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);