Blame


1 d957951b 2005-02-11 devnull #include <u.h>
2 d957951b 2005-02-11 devnull #include <libc.h>
3 d957951b 2005-02-11 devnull #include <bio.h>
4 d957951b 2005-02-11 devnull #include <ndb.h>
5 d957951b 2005-02-11 devnull #include <ndbhf.h>
6 d957951b 2005-02-11 devnull
7 d957951b 2005-02-11 devnull static void nstrcpy(char*, char*, int);
8 d957951b 2005-02-11 devnull static void mkptrname(char*, char*, int);
9 d957951b 2005-02-11 devnull static Ndbtuple *doquery(int, char *dn, char *type);
10 d957951b 2005-02-11 devnull
11 d957951b 2005-02-11 devnull /*
12 d957951b 2005-02-11 devnull * search for a tuple that has the given 'attr=val' and also 'rattr=x'.
13 d957951b 2005-02-11 devnull * copy 'x' into 'buf' and return the whole tuple.
14 d957951b 2005-02-11 devnull *
15 d957951b 2005-02-11 devnull * return 0 if not found.
16 d957951b 2005-02-11 devnull */
17 d957951b 2005-02-11 devnull Ndbtuple*
18 d957951b 2005-02-11 devnull dnsquery(char *net, char *val, char *type)
19 d957951b 2005-02-11 devnull {
20 d957951b 2005-02-11 devnull char rip[128];
21 d957951b 2005-02-11 devnull char *p;
22 d957951b 2005-02-11 devnull Ndbtuple *t;
23 d957951b 2005-02-11 devnull int fd;
24 d957951b 2005-02-11 devnull
25 d957951b 2005-02-11 devnull /* if the address is V4 or V6 null address, give up early vwhoi*/
26 d957951b 2005-02-11 devnull if(strcmp(val, "::") == 0 || strcmp(val, "0.0.0.0") == 0)
27 d957951b 2005-02-11 devnull return nil;
28 d957951b 2005-02-11 devnull
29 d957951b 2005-02-11 devnull if(net == nil)
30 d957951b 2005-02-11 devnull net = "/net";
31 d957951b 2005-02-11 devnull snprint(rip, sizeof(rip), "%s/dns", net);
32 d957951b 2005-02-11 devnull fd = open(rip, ORDWR);
33 d957951b 2005-02-11 devnull if(fd < 0){
34 d957951b 2005-02-11 devnull if(strcmp(net, "/net") == 0)
35 d957951b 2005-02-11 devnull snprint(rip, sizeof(rip), "/srv/dns");
36 d957951b 2005-02-11 devnull else {
37 d957951b 2005-02-11 devnull snprint(rip, sizeof(rip), "/srv/dns%s", net);
38 d957951b 2005-02-11 devnull p = strrchr(rip, '/');
39 d957951b 2005-02-11 devnull *p = '_';
40 d957951b 2005-02-11 devnull }
41 d957951b 2005-02-11 devnull fd = open(rip, ORDWR);
42 d957951b 2005-02-11 devnull if(fd < 0)
43 d957951b 2005-02-11 devnull return nil;
44 d957951b 2005-02-11 devnull if(mount(fd, -1, net, MBEFORE, "") < 0){
45 d957951b 2005-02-11 devnull close(fd);
46 d957951b 2005-02-11 devnull return nil;
47 d957951b 2005-02-11 devnull }
48 d957951b 2005-02-11 devnull /* fd is now closed */
49 d957951b 2005-02-11 devnull snprint(rip, sizeof(rip), "%s/dns", net);
50 d957951b 2005-02-11 devnull fd = open(rip, ORDWR);
51 d957951b 2005-02-11 devnull if(fd < 0)
52 d957951b 2005-02-11 devnull return nil;
53 d957951b 2005-02-11 devnull }
54 d957951b 2005-02-11 devnull
55 d957951b 2005-02-11 devnull /* zero out the error string */
56 d957951b 2005-02-11 devnull werrstr("");
57 d957951b 2005-02-11 devnull
58 d957951b 2005-02-11 devnull /* if this is a reverse lookup, first lookup the domain name */
59 d957951b 2005-02-11 devnull if(strcmp(type, "ptr") == 0){
60 d957951b 2005-02-11 devnull mkptrname(val, rip, sizeof rip);
61 d957951b 2005-02-11 devnull t = doquery(fd, rip, "ptr");
62 d957951b 2005-02-11 devnull } else
63 d957951b 2005-02-11 devnull t = doquery(fd, val, type);
64 d957951b 2005-02-11 devnull
65 d957951b 2005-02-11 devnull close(fd);
66 d957951b 2005-02-11 devnull return t;
67 d957951b 2005-02-11 devnull }
68 d957951b 2005-02-11 devnull
69 d957951b 2005-02-11 devnull /*
70 d957951b 2005-02-11 devnull * convert address into a reverse lookup address
71 d957951b 2005-02-11 devnull */
72 d957951b 2005-02-11 devnull static void
73 d957951b 2005-02-11 devnull mkptrname(char *ip, char *rip, int rlen)
74 d957951b 2005-02-11 devnull {
75 d957951b 2005-02-11 devnull char buf[128];
76 d957951b 2005-02-11 devnull char *p, *np;
77 d957951b 2005-02-11 devnull int len;
78 d957951b 2005-02-11 devnull
79 d957951b 2005-02-11 devnull if(strstr(ip, "in-addr.arpa") || strstr(ip, "IN-ADDR.ARPA")){
80 d957951b 2005-02-11 devnull nstrcpy(rip, ip, rlen);
81 d957951b 2005-02-11 devnull return;
82 d957951b 2005-02-11 devnull }
83 d957951b 2005-02-11 devnull
84 d957951b 2005-02-11 devnull nstrcpy(buf, ip, sizeof buf);
85 d957951b 2005-02-11 devnull for(p = buf; *p; p++)
86 d957951b 2005-02-11 devnull ;
87 d957951b 2005-02-11 devnull *p = '.';
88 d957951b 2005-02-11 devnull np = rip;
89 d957951b 2005-02-11 devnull len = 0;
90 d957951b 2005-02-11 devnull while(p >= buf){
91 d957951b 2005-02-11 devnull len++;
92 d957951b 2005-02-11 devnull p--;
93 d957951b 2005-02-11 devnull if(*p == '.'){
94 d957951b 2005-02-11 devnull memmove(np, p+1, len);
95 d957951b 2005-02-11 devnull np += len;
96 d957951b 2005-02-11 devnull len = 0;
97 d957951b 2005-02-11 devnull }
98 d957951b 2005-02-11 devnull }
99 d957951b 2005-02-11 devnull memmove(np, p+1, len);
100 d957951b 2005-02-11 devnull np += len;
101 d957951b 2005-02-11 devnull strcpy(np, "in-addr.arpa");
102 d957951b 2005-02-11 devnull }
103 d957951b 2005-02-11 devnull
104 d957951b 2005-02-11 devnull static void
105 d957951b 2005-02-11 devnull nstrcpy(char *to, char *from, int len)
106 d957951b 2005-02-11 devnull {
107 d957951b 2005-02-11 devnull strncpy(to, from, len);
108 d957951b 2005-02-11 devnull to[len-1] = 0;
109 d957951b 2005-02-11 devnull }
110 d957951b 2005-02-11 devnull
111 d957951b 2005-02-11 devnull static Ndbtuple*
112 d957951b 2005-02-11 devnull doquery(int fd, char *dn, char *type)
113 d957951b 2005-02-11 devnull {
114 d957951b 2005-02-11 devnull char buf[1024];
115 d957951b 2005-02-11 devnull int n;
116 d957951b 2005-02-11 devnull Ndbtuple *t, *first, *last;
117 d957951b 2005-02-11 devnull
118 d957951b 2005-02-11 devnull seek(fd, 0, 0);
119 d957951b 2005-02-11 devnull snprint(buf, sizeof(buf), "!%s %s", dn, type);
120 d957951b 2005-02-11 devnull if(write(fd, buf, strlen(buf)) < 0)
121 d957951b 2005-02-11 devnull return nil;
122 fa325e9b 2020-01-10 cross
123 d957951b 2005-02-11 devnull seek(fd, 0, 0);
124 d957951b 2005-02-11 devnull
125 d957951b 2005-02-11 devnull first = last = nil;
126 fa325e9b 2020-01-10 cross
127 d957951b 2005-02-11 devnull for(;;){
128 d957951b 2005-02-11 devnull n = read(fd, buf, sizeof(buf)-2);
129 d957951b 2005-02-11 devnull if(n <= 0)
130 d957951b 2005-02-11 devnull break;
131 d957951b 2005-02-11 devnull if(buf[n-1] != '\n')
132 d957951b 2005-02-11 devnull buf[n++] = '\n'; /* ndbparsline needs a trailing new line */
133 d957951b 2005-02-11 devnull buf[n] = 0;
134 d957951b 2005-02-11 devnull
135 d957951b 2005-02-11 devnull /* check for the error condition */
136 d957951b 2005-02-11 devnull if(buf[0] == '!'){
137 d957951b 2005-02-11 devnull werrstr("%s", buf+1);
138 d957951b 2005-02-11 devnull return nil;
139 d957951b 2005-02-11 devnull }
140 d957951b 2005-02-11 devnull
141 d957951b 2005-02-11 devnull t = _ndbparseline(buf);
142 d957951b 2005-02-11 devnull if(t != nil){
143 d957951b 2005-02-11 devnull if(first)
144 d957951b 2005-02-11 devnull last->entry = t;
145 d957951b 2005-02-11 devnull else
146 d957951b 2005-02-11 devnull first = t;
147 d957951b 2005-02-11 devnull last = t;
148 d957951b 2005-02-11 devnull
149 d957951b 2005-02-11 devnull while(last->entry)
150 d957951b 2005-02-11 devnull last = last->entry;
151 d957951b 2005-02-11 devnull }
152 d957951b 2005-02-11 devnull }
153 d957951b 2005-02-11 devnull
154 d957951b 2005-02-11 devnull setmalloctag(first, getcallerpc(&fd));
155 d957951b 2005-02-11 devnull return first;
156 d957951b 2005-02-11 devnull }