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>
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);
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.
15 d957951b 2005-02-11 devnull * return 0 if not found.
17 d957951b 2005-02-11 devnull Ndbtuple*
18 d957951b 2005-02-11 devnull dnsquery(char *net, char *val, char *type)
20 d957951b 2005-02-11 devnull char rip[128];
22 d957951b 2005-02-11 devnull Ndbtuple *t;
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;
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");
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 = '_';
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;
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;
55 d957951b 2005-02-11 devnull /* zero out the error string */
56 d957951b 2005-02-11 devnull werrstr("");
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");
63 d957951b 2005-02-11 devnull t = doquery(fd, val, type);
65 d957951b 2005-02-11 devnull close(fd);
66 d957951b 2005-02-11 devnull return t;
70 d957951b 2005-02-11 devnull * convert address into a reverse lookup address
72 d957951b 2005-02-11 devnull static void
73 d957951b 2005-02-11 devnull mkptrname(char *ip, char *rip, int rlen)
75 d957951b 2005-02-11 devnull char buf[128];
76 d957951b 2005-02-11 devnull char *p, *np;
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);
84 d957951b 2005-02-11 devnull nstrcpy(buf, ip, sizeof buf);
85 d957951b 2005-02-11 devnull for(p = buf; *p; p++)
87 d957951b 2005-02-11 devnull *p = '.';
88 d957951b 2005-02-11 devnull np = rip;
90 d957951b 2005-02-11 devnull while(p >= buf){
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;
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");
104 d957951b 2005-02-11 devnull static void
105 d957951b 2005-02-11 devnull nstrcpy(char *to, char *from, int len)
107 d957951b 2005-02-11 devnull strncpy(to, from, len);
108 d957951b 2005-02-11 devnull to[len-1] = 0;
111 d957951b 2005-02-11 devnull static Ndbtuple*
112 d957951b 2005-02-11 devnull doquery(int fd, char *dn, char *type)
114 d957951b 2005-02-11 devnull char buf[1024];
116 d957951b 2005-02-11 devnull Ndbtuple *t, *first, *last;
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;
123 d957951b 2005-02-11 devnull seek(fd, 0, 0);
125 d957951b 2005-02-11 devnull first = last = nil;
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)
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;
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;
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;
146 d957951b 2005-02-11 devnull first = t;
147 d957951b 2005-02-11 devnull last = t;
149 d957951b 2005-02-11 devnull while(last->entry)
150 d957951b 2005-02-11 devnull last = last->entry;
154 d957951b 2005-02-11 devnull setmalloctag(first, getcallerpc(&fd));
155 d957951b 2005-02-11 devnull return first;