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 3e0d8fb3 2005-12-27 devnull #include "dns.h"
6 3e0d8fb3 2005-12-27 devnull #include "ip.h"
7 3e0d8fb3 2005-12-27 devnull
8 3e0d8fb3 2005-12-27 devnull void
9 3e0d8fb3 2005-12-27 devnull main(int argc, char *argv[])
10 3e0d8fb3 2005-12-27 devnull {
11 3e0d8fb3 2005-12-27 devnull int fd, n, len, domount;
12 3e0d8fb3 2005-12-27 devnull Biobuf in;
13 3e0d8fb3 2005-12-27 devnull char line[1024], *lp, *p, *np, *mtpt, *srv, *dns;
14 3e0d8fb3 2005-12-27 devnull char buf[1024];
15 3e0d8fb3 2005-12-27 devnull
16 3e0d8fb3 2005-12-27 devnull dns = "/net/dns";
17 3e0d8fb3 2005-12-27 devnull mtpt = "/net";
18 3e0d8fb3 2005-12-27 devnull srv = "/srv/dns";
19 3e0d8fb3 2005-12-27 devnull domount = 1;
20 3e0d8fb3 2005-12-27 devnull ARGBEGIN {
21 3e0d8fb3 2005-12-27 devnull case 'x':
22 3e0d8fb3 2005-12-27 devnull dns = "/net.alt/dns";
23 3e0d8fb3 2005-12-27 devnull mtpt = "/net.alt";
24 3e0d8fb3 2005-12-27 devnull srv = "/srv/dns_net.alt";
25 3e0d8fb3 2005-12-27 devnull break;
26 3e0d8fb3 2005-12-27 devnull default:
27 3e0d8fb3 2005-12-27 devnull fprint(2, "usage: %s -x [dns-mount-point]\n", argv0);
28 3e0d8fb3 2005-12-27 devnull exits("usage");
29 3e0d8fb3 2005-12-27 devnull } ARGEND;
30 3e0d8fb3 2005-12-27 devnull
31 3e0d8fb3 2005-12-27 devnull if(argc == 1){
32 3e0d8fb3 2005-12-27 devnull domount = 0;
33 3e0d8fb3 2005-12-27 devnull mtpt = argv[0];
34 3e0d8fb3 2005-12-27 devnull }
35 3e0d8fb3 2005-12-27 devnull
36 3e0d8fb3 2005-12-27 devnull fd = open(dns, ORDWR);
37 3e0d8fb3 2005-12-27 devnull if(fd < 0){
38 3e0d8fb3 2005-12-27 devnull if(domount == 0){
39 3e0d8fb3 2005-12-27 devnull fprint(2, "can't open %s: %r\n", mtpt);
40 3e0d8fb3 2005-12-27 devnull exits(0);
41 3e0d8fb3 2005-12-27 devnull }
42 3e0d8fb3 2005-12-27 devnull fd = open(srv, ORDWR);
43 3e0d8fb3 2005-12-27 devnull if(fd < 0){
44 3e0d8fb3 2005-12-27 devnull print("can't open %s: %r\n", srv);
45 3e0d8fb3 2005-12-27 devnull exits(0);
46 3e0d8fb3 2005-12-27 devnull }
47 3e0d8fb3 2005-12-27 devnull if(mount(fd, -1, mtpt, MBEFORE, "") < 0){
48 3e0d8fb3 2005-12-27 devnull print("can't mount(%s, %s): %r\n", srv, mtpt);
49 3e0d8fb3 2005-12-27 devnull exits(0);
50 3e0d8fb3 2005-12-27 devnull }
51 3e0d8fb3 2005-12-27 devnull fd = open(mtpt, ORDWR);
52 3e0d8fb3 2005-12-27 devnull if(fd < 0){
53 3e0d8fb3 2005-12-27 devnull print("can't open %s: %r\n", mtpt);
54 3e0d8fb3 2005-12-27 devnull exits(0);
55 3e0d8fb3 2005-12-27 devnull }
56 3e0d8fb3 2005-12-27 devnull }
57 3e0d8fb3 2005-12-27 devnull Binit(&in, 0, OREAD);
58 3e0d8fb3 2005-12-27 devnull for(print("> "); lp = Brdline(&in, '\n'); print("> ")){
59 3e0d8fb3 2005-12-27 devnull n = Blinelen(&in)-1;
60 3e0d8fb3 2005-12-27 devnull strncpy(line, lp, n);
61 3e0d8fb3 2005-12-27 devnull line[n] = 0;
62 3e0d8fb3 2005-12-27 devnull if (n<=1)
63 3e0d8fb3 2005-12-27 devnull continue;
64 3e0d8fb3 2005-12-27 devnull /* default to an "ip" request if alpha, "ptr" if numeric */
65 3e0d8fb3 2005-12-27 devnull if (strchr(line, ' ')==0) {
66 3e0d8fb3 2005-12-27 devnull if(strcmp(ipattr(line), "ip") == 0) {
67 3e0d8fb3 2005-12-27 devnull strcat(line, " ptr");
68 3e0d8fb3 2005-12-27 devnull n += 4;
69 3e0d8fb3 2005-12-27 devnull } else {
70 3e0d8fb3 2005-12-27 devnull strcat(line, " ip");
71 3e0d8fb3 2005-12-27 devnull n += 3;
72 3e0d8fb3 2005-12-27 devnull }
73 3e0d8fb3 2005-12-27 devnull }
74 3e0d8fb3 2005-12-27 devnull
75 3e0d8fb3 2005-12-27 devnull /* inverse queries may need to be permuted */
76 3e0d8fb3 2005-12-27 devnull if(n > 4 && strcmp("ptr", &line[n-3]) == 0
77 3e0d8fb3 2005-12-27 devnull && strstr(line, "IN-ADDR") == 0 && strstr(line, "in-addr") == 0){
78 3e0d8fb3 2005-12-27 devnull for(p = line; *p; p++)
79 3e0d8fb3 2005-12-27 devnull if(*p == ' '){
80 3e0d8fb3 2005-12-27 devnull *p = '.';
81 3e0d8fb3 2005-12-27 devnull break;
82 3e0d8fb3 2005-12-27 devnull }
83 3e0d8fb3 2005-12-27 devnull np = buf;
84 3e0d8fb3 2005-12-27 devnull len = 0;
85 3e0d8fb3 2005-12-27 devnull while(p >= line){
86 3e0d8fb3 2005-12-27 devnull len++;
87 3e0d8fb3 2005-12-27 devnull p--;
88 3e0d8fb3 2005-12-27 devnull if(*p == '.'){
89 3e0d8fb3 2005-12-27 devnull memmove(np, p+1, len);
90 3e0d8fb3 2005-12-27 devnull np += len;
91 3e0d8fb3 2005-12-27 devnull len = 0;
92 3e0d8fb3 2005-12-27 devnull }
93 3e0d8fb3 2005-12-27 devnull }
94 3e0d8fb3 2005-12-27 devnull memmove(np, p+1, len);
95 3e0d8fb3 2005-12-27 devnull np += len;
96 3e0d8fb3 2005-12-27 devnull strcpy(np, "in-addr.arpa ptr");
97 3e0d8fb3 2005-12-27 devnull strcpy(line, buf);
98 3e0d8fb3 2005-12-27 devnull n = strlen(line);
99 3e0d8fb3 2005-12-27 devnull }
100 3e0d8fb3 2005-12-27 devnull
101 3e0d8fb3 2005-12-27 devnull seek(fd, 0, 0);
102 3e0d8fb3 2005-12-27 devnull if(write(fd, line, n) < 0) {
103 3e0d8fb3 2005-12-27 devnull print("!%r\n");
104 3e0d8fb3 2005-12-27 devnull continue;
105 3e0d8fb3 2005-12-27 devnull }
106 3e0d8fb3 2005-12-27 devnull seek(fd, 0, 0);
107 3e0d8fb3 2005-12-27 devnull while((n = read(fd, buf, sizeof(buf))) > 0){
108 3e0d8fb3 2005-12-27 devnull buf[n] = 0;
109 3e0d8fb3 2005-12-27 devnull print("%s\n", buf);
110 3e0d8fb3 2005-12-27 devnull }
111 3e0d8fb3 2005-12-27 devnull }
112 3e0d8fb3 2005-12-27 devnull exits(0);
113 3e0d8fb3 2005-12-27 devnull }