Blame


1 3e0d8fb3 2005-12-27 devnull #include <u.h>
2 3e0d8fb3 2005-12-27 devnull #include <libc.h>
3 3e0d8fb3 2005-12-27 devnull #include <bio.h>
4 3e0d8fb3 2005-12-27 devnull #include <ndb.h>
5 5c9f76b5 2006-02-14 devnull #include <thread.h>
6 aa01e1fe 2006-02-15 devnull #include <9pclient.h>
7 3e0d8fb3 2005-12-27 devnull #include "dns.h"
8 3e0d8fb3 2005-12-27 devnull #include "ip.h"
9 3e0d8fb3 2005-12-27 devnull
10 3e0d8fb3 2005-12-27 devnull void
11 5c9f76b5 2006-02-14 devnull usage(void)
12 5c9f76b5 2006-02-14 devnull {
13 49a1496c 2006-02-20 devnull fprint(2, "usage: dnsquery [-x service]\n");
14 5c9f76b5 2006-02-14 devnull threadexitsall("usage");
15 5c9f76b5 2006-02-14 devnull }
16 5c9f76b5 2006-02-14 devnull
17 5c9f76b5 2006-02-14 devnull void
18 aa01e1fe 2006-02-15 devnull threadmain(int argc, char *argv[])
19 3e0d8fb3 2005-12-27 devnull {
20 5c9f76b5 2006-02-14 devnull CFid *fd;
21 5c9f76b5 2006-02-14 devnull int n, len;
22 3e0d8fb3 2005-12-27 devnull Biobuf in;
23 201e19d6 2006-02-15 devnull char line[1024], *lp, *p, *np, *dns;
24 3e0d8fb3 2005-12-27 devnull char buf[1024];
25 3e0d8fb3 2005-12-27 devnull
26 5c9f76b5 2006-02-14 devnull dns = "dns";
27 5c9f76b5 2006-02-14 devnull ARGBEGIN{
28 3e0d8fb3 2005-12-27 devnull case 'x':
29 5c9f76b5 2006-02-14 devnull dns = EARGF(usage());
30 3e0d8fb3 2005-12-27 devnull break;
31 3e0d8fb3 2005-12-27 devnull default:
32 5c9f76b5 2006-02-14 devnull usage();
33 5c9f76b5 2006-02-14 devnull }ARGEND;
34 3e0d8fb3 2005-12-27 devnull
35 5c9f76b5 2006-02-14 devnull if(argc)
36 5c9f76b5 2006-02-14 devnull usage();
37 3e0d8fb3 2005-12-27 devnull
38 5c9f76b5 2006-02-14 devnull fd = nsopen(dns, nil, "dns", ORDWR);
39 5c9f76b5 2006-02-14 devnull if(fd == nil)
40 5c9f76b5 2006-02-14 devnull sysfatal("open %s!dns: %r", dns);
41 5c9f76b5 2006-02-14 devnull
42 3e0d8fb3 2005-12-27 devnull Binit(&in, 0, OREAD);
43 3e0d8fb3 2005-12-27 devnull for(print("> "); lp = Brdline(&in, '\n'); print("> ")){
44 3e0d8fb3 2005-12-27 devnull n = Blinelen(&in)-1;
45 3e0d8fb3 2005-12-27 devnull strncpy(line, lp, n);
46 3e0d8fb3 2005-12-27 devnull line[n] = 0;
47 3e0d8fb3 2005-12-27 devnull if (n<=1)
48 3e0d8fb3 2005-12-27 devnull continue;
49 3e0d8fb3 2005-12-27 devnull /* default to an "ip" request if alpha, "ptr" if numeric */
50 3e0d8fb3 2005-12-27 devnull if (strchr(line, ' ')==0) {
51 3e0d8fb3 2005-12-27 devnull if(strcmp(ipattr(line), "ip") == 0) {
52 3e0d8fb3 2005-12-27 devnull strcat(line, " ptr");
53 3e0d8fb3 2005-12-27 devnull n += 4;
54 3e0d8fb3 2005-12-27 devnull } else {
55 3e0d8fb3 2005-12-27 devnull strcat(line, " ip");
56 3e0d8fb3 2005-12-27 devnull n += 3;
57 3e0d8fb3 2005-12-27 devnull }
58 3e0d8fb3 2005-12-27 devnull }
59 3e0d8fb3 2005-12-27 devnull
60 3e0d8fb3 2005-12-27 devnull /* inverse queries may need to be permuted */
61 3e0d8fb3 2005-12-27 devnull if(n > 4 && strcmp("ptr", &line[n-3]) == 0
62 3e0d8fb3 2005-12-27 devnull && strstr(line, "IN-ADDR") == 0 && strstr(line, "in-addr") == 0){
63 3e0d8fb3 2005-12-27 devnull for(p = line; *p; p++)
64 3e0d8fb3 2005-12-27 devnull if(*p == ' '){
65 3e0d8fb3 2005-12-27 devnull *p = '.';
66 3e0d8fb3 2005-12-27 devnull break;
67 3e0d8fb3 2005-12-27 devnull }
68 3e0d8fb3 2005-12-27 devnull np = buf;
69 3e0d8fb3 2005-12-27 devnull len = 0;
70 3e0d8fb3 2005-12-27 devnull while(p >= line){
71 3e0d8fb3 2005-12-27 devnull len++;
72 3e0d8fb3 2005-12-27 devnull p--;
73 3e0d8fb3 2005-12-27 devnull if(*p == '.'){
74 3e0d8fb3 2005-12-27 devnull memmove(np, p+1, len);
75 3e0d8fb3 2005-12-27 devnull np += len;
76 3e0d8fb3 2005-12-27 devnull len = 0;
77 3e0d8fb3 2005-12-27 devnull }
78 3e0d8fb3 2005-12-27 devnull }
79 3e0d8fb3 2005-12-27 devnull memmove(np, p+1, len);
80 3e0d8fb3 2005-12-27 devnull np += len;
81 3e0d8fb3 2005-12-27 devnull strcpy(np, "in-addr.arpa ptr");
82 3e0d8fb3 2005-12-27 devnull strcpy(line, buf);
83 3e0d8fb3 2005-12-27 devnull n = strlen(line);
84 3e0d8fb3 2005-12-27 devnull }
85 3e0d8fb3 2005-12-27 devnull
86 5c9f76b5 2006-02-14 devnull fsseek(fd, 0, 0);
87 5c9f76b5 2006-02-14 devnull if(fswrite(fd, line, n) < 0) {
88 3e0d8fb3 2005-12-27 devnull print("!%r\n");
89 3e0d8fb3 2005-12-27 devnull continue;
90 3e0d8fb3 2005-12-27 devnull }
91 5c9f76b5 2006-02-14 devnull fsseek(fd, 0, 0);
92 5c9f76b5 2006-02-14 devnull while((n = fsread(fd, buf, sizeof(buf))) > 0){
93 3e0d8fb3 2005-12-27 devnull buf[n] = 0;
94 3e0d8fb3 2005-12-27 devnull print("%s\n", buf);
95 3e0d8fb3 2005-12-27 devnull }
96 3e0d8fb3 2005-12-27 devnull }
97 5c9f76b5 2006-02-14 devnull threadexitsall(0);
98 3e0d8fb3 2005-12-27 devnull }