]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ndb/dnsquery.c
merge
[plan9front.git] / sys / src / cmd / ndb / dnsquery.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5 #include <ndb.h>
6 #include "dns.h"
7 #include "ip.h"
8
9 static void
10 querydns(int fd, char *line, int n)
11 {
12         char buf[8192+1];
13
14         seek(fd, 0, 0);
15         if(write(fd, line, n) != n) {
16                 print("!%r\n");
17                 return;
18         }
19         seek(fd, 0, 0);
20         while((n = read(fd, buf, sizeof(buf)-1)) > 0){
21                 buf[n++] = '\n';
22                 write(1, buf, n);
23         }
24 }
25
26 /*
27  *  convert address into a reverse lookup address
28  */
29 static void
30 mkptrname(char *ip, char *rip, int rlen)
31 {
32         uchar a[IPaddrlen];
33         char *p, *e;
34         int i;
35
36         if(cistrstr(ip, "in-addr.arpa") || cistrstr(ip, "ip6.arpa") || parseip(a, ip) == -1)
37                 snprint(rip, rlen, "%s", ip);
38         else if(isv4(a))
39                 snprint(rip, rlen, "%ud.%ud.%ud.%ud.in-addr.arpa",
40                         a[15], a[14], a[13], a[12]);
41         else{
42                 p = rip;
43                 e = rip + rlen;
44                 for(i = 15; i >= 0; i--){
45                         p = seprint(p, e, "%ux.", a[i]&0xf);
46                         p = seprint(p, e, "%ux.", a[i]>>4);
47                 }
48                 seprint(p, e, "ip6.arpa");
49         }
50 }
51
52 static void
53 query(int fd)
54 {
55         int n;
56         char *lp;
57         char buf[1024], line[1024];
58         Biobuf in;
59
60         Binit(&in, 0, OREAD);
61         for(print("> "); lp = Brdline(&in, '\n'); print("> ")){
62                 n = Blinelen(&in) -1;
63                 while(isspace(lp[n]))
64                         lp[n--] = 0;
65                 n++;
66                 while(isspace(*lp)){
67                         lp++;
68                         n--;
69                 }
70                 if(!*lp)
71                         continue;
72                 strcpy(line, lp);
73
74                 /* default to an "ip" request if alpha, "ptr" if numeric */
75                 if(strchr(line, ' ') == nil)
76                         if(strcmp(ipattr(line), "ip") == 0) {
77                                 strcat(line, " ptr");
78                                 n += 4;
79                         } else {
80                                 strcat(line, " ip");
81                                 n += 3;
82                         }
83
84                 if(n > 4 && strcmp(" ptr", &line[n-4]) == 0){
85                         line[n-4] = 0;
86                         mkptrname(line, buf, sizeof buf);
87                         n = snprint(line, sizeof line, "%s ptr", buf);
88                 }
89
90                 querydns(fd, line, n);
91         }
92         Bterm(&in);
93 }
94
95 void
96 main(int argc, char *argv[])
97 {
98         char *dns  = "/net/dns";
99         int fd;
100
101         ARGBEGIN {
102         case 'x':
103                 dns = "/net.alt/dns";
104                 break;
105         default:
106                 fprint(2, "usage: %s [-x] [/net/dns]\n", argv0);
107                 exits("usage");
108         } ARGEND;
109
110         if(argc > 0)
111                 dns = argv[0];
112
113         fd = open(dns, ORDWR);
114         if(fd < 0)
115                 sysfatal("can't open %s: %r", dns);
116
117         query(fd);
118         exits(0);
119 }