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 <ctype.h>
5 3e0d8fb3 2005-12-27 devnull #include <ip.h>
6 3e0d8fb3 2005-12-27 devnull #include <ndb.h>
7 3e0d8fb3 2005-12-27 devnull #include "dns.h"
8 3e0d8fb3 2005-12-27 devnull
9 3e0d8fb3 2005-12-27 devnull enum
10 3e0d8fb3 2005-12-27 devnull {
11 3e0d8fb3 2005-12-27 devnull Maxrequest= 128,
12 3e0d8fb3 2005-12-27 devnull Ncache= 8,
13 3e0d8fb3 2005-12-27 devnull Maxpath= 128,
14 3e0d8fb3 2005-12-27 devnull Maxreply= 512,
15 3e0d8fb3 2005-12-27 devnull Maxrrr= 16,
16 3e0d8fb3 2005-12-27 devnull };
17 3e0d8fb3 2005-12-27 devnull
18 3e0d8fb3 2005-12-27 devnull static char *servername;
19 3e0d8fb3 2005-12-27 devnull static RR *serverrr;
20 3e0d8fb3 2005-12-27 devnull static RR *serveraddrs;
21 3e0d8fb3 2005-12-27 devnull
22 3e0d8fb3 2005-12-27 devnull int debug;
23 3e0d8fb3 2005-12-27 devnull int cachedb;
24 3e0d8fb3 2005-12-27 devnull ulong now;
25 3e0d8fb3 2005-12-27 devnull int testing;
26 3e0d8fb3 2005-12-27 devnull int traceactivity;
27 3e0d8fb3 2005-12-27 devnull char *trace;
28 3e0d8fb3 2005-12-27 devnull int needrefresh;
29 3e0d8fb3 2005-12-27 devnull int resolver;
30 3e0d8fb3 2005-12-27 devnull uchar ipaddr[IPaddrlen]; /* my ip address */
31 3e0d8fb3 2005-12-27 devnull int maxage;
32 3e0d8fb3 2005-12-27 devnull char *logfile = "dns";
33 3e0d8fb3 2005-12-27 devnull char *dbfile;
34 3e0d8fb3 2005-12-27 devnull char mntpt[Maxpath];
35 3e0d8fb3 2005-12-27 devnull char *zonerefreshprogram;
36 3e0d8fb3 2005-12-27 devnull
37 3e0d8fb3 2005-12-27 devnull int prettyrrfmt(Fmt*);
38 3e0d8fb3 2005-12-27 devnull void preloadserveraddrs(void);
39 3e0d8fb3 2005-12-27 devnull void squirrelserveraddrs(void);
40 3e0d8fb3 2005-12-27 devnull int setserver(char*);
41 3e0d8fb3 2005-12-27 devnull void doquery(char*, char*);
42 3e0d8fb3 2005-12-27 devnull void docmd(int, char**);
43 3e0d8fb3 2005-12-27 devnull
44 3e0d8fb3 2005-12-27 devnull void
45 3e0d8fb3 2005-12-27 devnull main(int argc, char *argv[])
46 3e0d8fb3 2005-12-27 devnull {
47 3e0d8fb3 2005-12-27 devnull int n;
48 3e0d8fb3 2005-12-27 devnull Biobuf in;
49 3e0d8fb3 2005-12-27 devnull char *p;
50 3e0d8fb3 2005-12-27 devnull char *f[4];
51 3e0d8fb3 2005-12-27 devnull
52 3e0d8fb3 2005-12-27 devnull strcpy(mntpt, "/net");
53 3e0d8fb3 2005-12-27 devnull
54 3e0d8fb3 2005-12-27 devnull ARGBEGIN{
55 3e0d8fb3 2005-12-27 devnull case 'r':
56 3e0d8fb3 2005-12-27 devnull resolver = 1;
57 3e0d8fb3 2005-12-27 devnull break;
58 3e0d8fb3 2005-12-27 devnull case 'x':
59 3e0d8fb3 2005-12-27 devnull dbfile = "/lib/ndb/external";
60 3e0d8fb3 2005-12-27 devnull strcpy(mntpt, "/net.alt");
61 3e0d8fb3 2005-12-27 devnull break;
62 3e0d8fb3 2005-12-27 devnull case 'f':
63 3e0d8fb3 2005-12-27 devnull dbfile = ARGF();
64 3e0d8fb3 2005-12-27 devnull break;
65 3e0d8fb3 2005-12-27 devnull }ARGEND
66 3e0d8fb3 2005-12-27 devnull
67 3e0d8fb3 2005-12-27 devnull now = time(0);
68 3e0d8fb3 2005-12-27 devnull dninit();
69 3e0d8fb3 2005-12-27 devnull fmtinstall('R', prettyrrfmt);
70 3e0d8fb3 2005-12-27 devnull if(myipaddr(ipaddr, mntpt) < 0)
71 3e0d8fb3 2005-12-27 devnull sysfatal("can't read my ip address");
72 3e0d8fb3 2005-12-27 devnull opendatabase();
73 3e0d8fb3 2005-12-27 devnull
74 3e0d8fb3 2005-12-27 devnull if(resolver)
75 3e0d8fb3 2005-12-27 devnull squirrelserveraddrs();
76 3e0d8fb3 2005-12-27 devnull
77 3e0d8fb3 2005-12-27 devnull debug = 1;
78 3e0d8fb3 2005-12-27 devnull
79 3e0d8fb3 2005-12-27 devnull if(argc > 0){
80 3e0d8fb3 2005-12-27 devnull docmd(argc, argv);
81 3e0d8fb3 2005-12-27 devnull exits(0);
82 3e0d8fb3 2005-12-27 devnull }
83 3e0d8fb3 2005-12-27 devnull
84 3e0d8fb3 2005-12-27 devnull Binit(&in, 0, OREAD);
85 3e0d8fb3 2005-12-27 devnull for(print("> "); p = Brdline(&in, '\n'); print("> ")){
86 3e0d8fb3 2005-12-27 devnull p[Blinelen(&in)-1] = 0;
87 3e0d8fb3 2005-12-27 devnull n = tokenize(p, f, 3);
88 3e0d8fb3 2005-12-27 devnull if(n<1)
89 3e0d8fb3 2005-12-27 devnull continue;
90 3e0d8fb3 2005-12-27 devnull
91 3e0d8fb3 2005-12-27 devnull /* flush the cache */
92 3e0d8fb3 2005-12-27 devnull dnpurge();
93 3e0d8fb3 2005-12-27 devnull
94 3e0d8fb3 2005-12-27 devnull docmd(n, f);
95 3e0d8fb3 2005-12-27 devnull
96 3e0d8fb3 2005-12-27 devnull }
97 3e0d8fb3 2005-12-27 devnull exits(0);
98 3e0d8fb3 2005-12-27 devnull }
99 3e0d8fb3 2005-12-27 devnull
100 3e0d8fb3 2005-12-27 devnull static char*
101 3e0d8fb3 2005-12-27 devnull longtime(long t)
102 3e0d8fb3 2005-12-27 devnull {
103 3e0d8fb3 2005-12-27 devnull int d, h, m, n;
104 3e0d8fb3 2005-12-27 devnull static char x[128];
105 3e0d8fb3 2005-12-27 devnull
106 3e0d8fb3 2005-12-27 devnull for(d = 0; t >= 24*60*60; t -= 24*60*60)
107 3e0d8fb3 2005-12-27 devnull d++;
108 3e0d8fb3 2005-12-27 devnull for(h = 0; t >= 60*60; t -= 60*60)
109 3e0d8fb3 2005-12-27 devnull h++;
110 3e0d8fb3 2005-12-27 devnull for(m = 0; t >= 60; t -= 60)
111 3e0d8fb3 2005-12-27 devnull m++;
112 3e0d8fb3 2005-12-27 devnull n = 0;
113 3e0d8fb3 2005-12-27 devnull if(d)
114 3e0d8fb3 2005-12-27 devnull n += sprint(x, "%d day ", d);
115 3e0d8fb3 2005-12-27 devnull if(h)
116 3e0d8fb3 2005-12-27 devnull n += sprint(x+n, "%d hr ", h);
117 3e0d8fb3 2005-12-27 devnull if(m)
118 3e0d8fb3 2005-12-27 devnull n += sprint(x+n, "%d min ", m);
119 3e0d8fb3 2005-12-27 devnull if(t || n == 0)
120 3e0d8fb3 2005-12-27 devnull sprint(x+n, "%ld sec", t);
121 3e0d8fb3 2005-12-27 devnull return x;
122 3e0d8fb3 2005-12-27 devnull }
123 3e0d8fb3 2005-12-27 devnull
124 3e0d8fb3 2005-12-27 devnull int
125 3e0d8fb3 2005-12-27 devnull prettyrrfmt(Fmt *f)
126 3e0d8fb3 2005-12-27 devnull {
127 3e0d8fb3 2005-12-27 devnull RR *rp;
128 3e0d8fb3 2005-12-27 devnull char buf[3*Domlen];
129 3e0d8fb3 2005-12-27 devnull char *p, *e;
130 3e0d8fb3 2005-12-27 devnull Txt *t;
131 3e0d8fb3 2005-12-27 devnull
132 3e0d8fb3 2005-12-27 devnull rp = va_arg(f->args, RR*);
133 3e0d8fb3 2005-12-27 devnull if(rp == 0){
134 3e0d8fb3 2005-12-27 devnull strcpy(buf, "<null>");
135 3e0d8fb3 2005-12-27 devnull goto out;
136 3e0d8fb3 2005-12-27 devnull }
137 3e0d8fb3 2005-12-27 devnull
138 3e0d8fb3 2005-12-27 devnull p = buf;
139 3e0d8fb3 2005-12-27 devnull e = buf + sizeof(buf);
140 3e0d8fb3 2005-12-27 devnull p = seprint(p, e, "%-32.32s %-15.15s %-5.5s", rp->owner->name,
141 3e0d8fb3 2005-12-27 devnull longtime(rp->db ? rp->ttl : (rp->ttl-now)),
142 3e0d8fb3 2005-12-27 devnull rrname(rp->type, buf, sizeof buf));
143 3e0d8fb3 2005-12-27 devnull
144 3e0d8fb3 2005-12-27 devnull if(rp->negative){
145 3e0d8fb3 2005-12-27 devnull seprint(p, e, "negative rcode %d\n", rp->negrcode);
146 3e0d8fb3 2005-12-27 devnull goto out;
147 3e0d8fb3 2005-12-27 devnull }
148 3e0d8fb3 2005-12-27 devnull
149 3e0d8fb3 2005-12-27 devnull switch(rp->type){
150 3e0d8fb3 2005-12-27 devnull case Thinfo:
151 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s %s", rp->cpu->name, rp->os->name);
152 3e0d8fb3 2005-12-27 devnull break;
153 3e0d8fb3 2005-12-27 devnull case Tcname:
154 3e0d8fb3 2005-12-27 devnull case Tmb:
155 3e0d8fb3 2005-12-27 devnull case Tmd:
156 3e0d8fb3 2005-12-27 devnull case Tmf:
157 3e0d8fb3 2005-12-27 devnull case Tns:
158 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s", rp->host->name);
159 3e0d8fb3 2005-12-27 devnull break;
160 3e0d8fb3 2005-12-27 devnull case Tmg:
161 3e0d8fb3 2005-12-27 devnull case Tmr:
162 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s", rp->mb->name);
163 3e0d8fb3 2005-12-27 devnull break;
164 3e0d8fb3 2005-12-27 devnull case Tminfo:
165 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s %s", rp->mb->name, rp->rmb->name);
166 3e0d8fb3 2005-12-27 devnull break;
167 3e0d8fb3 2005-12-27 devnull case Tmx:
168 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%lud %s", rp->pref, rp->host->name);
169 3e0d8fb3 2005-12-27 devnull break;
170 3e0d8fb3 2005-12-27 devnull case Ta:
171 3e0d8fb3 2005-12-27 devnull case Taaaa:
172 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s", rp->ip->name);
173 3e0d8fb3 2005-12-27 devnull break;
174 3e0d8fb3 2005-12-27 devnull case Tptr:
175 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s", rp->ptr->name);
176 3e0d8fb3 2005-12-27 devnull break;
177 3e0d8fb3 2005-12-27 devnull case Tsoa:
178 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s %s %lud %lud %lud %lud %lud", rp->host->name,
179 3e0d8fb3 2005-12-27 devnull rp->rmb->name, rp->soa->serial, rp->soa->refresh, rp->soa->retry,
180 3e0d8fb3 2005-12-27 devnull rp->soa->expire, rp->soa->minttl);
181 3e0d8fb3 2005-12-27 devnull break;
182 3e0d8fb3 2005-12-27 devnull case Tnull:
183 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%.*H", rp->null->dlen, rp->null->data);
184 3e0d8fb3 2005-12-27 devnull break;
185 3e0d8fb3 2005-12-27 devnull case Ttxt:
186 3e0d8fb3 2005-12-27 devnull p = seprint(p, e, "\t");
187 3e0d8fb3 2005-12-27 devnull for(t = rp->txt; t != nil; t = t->next)
188 3e0d8fb3 2005-12-27 devnull p = seprint(p, e, "%s", t->p);
189 3e0d8fb3 2005-12-27 devnull break;
190 3e0d8fb3 2005-12-27 devnull case Trp:
191 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s %s", rp->rmb->name, rp->rp->name);
192 3e0d8fb3 2005-12-27 devnull break;
193 3e0d8fb3 2005-12-27 devnull case Tkey:
194 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%d %d %d", rp->key->flags, rp->key->proto,
195 3e0d8fb3 2005-12-27 devnull rp->key->alg);
196 3e0d8fb3 2005-12-27 devnull break;
197 3e0d8fb3 2005-12-27 devnull case Tsig:
198 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%d %d %d %lud %lud %lud %d %s",
199 3e0d8fb3 2005-12-27 devnull rp->sig->type, rp->sig->alg, rp->sig->labels, rp->sig->ttl,
200 3e0d8fb3 2005-12-27 devnull rp->sig->exp, rp->sig->incep, rp->sig->tag, rp->sig->signer->name);
201 3e0d8fb3 2005-12-27 devnull break;
202 3e0d8fb3 2005-12-27 devnull case Tcert:
203 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%d %d %d",
204 3e0d8fb3 2005-12-27 devnull rp->sig->type, rp->sig->tag, rp->sig->alg);
205 3e0d8fb3 2005-12-27 devnull break;
206 3e0d8fb3 2005-12-27 devnull default:
207 3e0d8fb3 2005-12-27 devnull break;
208 3e0d8fb3 2005-12-27 devnull }
209 3e0d8fb3 2005-12-27 devnull out:
210 3e0d8fb3 2005-12-27 devnull return fmtstrcpy(f, buf);
211 3e0d8fb3 2005-12-27 devnull }
212 3e0d8fb3 2005-12-27 devnull
213 3e0d8fb3 2005-12-27 devnull void
214 3e0d8fb3 2005-12-27 devnull logsection(char *flag, RR *rp)
215 3e0d8fb3 2005-12-27 devnull {
216 3e0d8fb3 2005-12-27 devnull if(rp == nil)
217 3e0d8fb3 2005-12-27 devnull return;
218 3e0d8fb3 2005-12-27 devnull print("\t%s%R\n", flag, rp);
219 3e0d8fb3 2005-12-27 devnull for(rp = rp->next; rp != nil; rp = rp->next)
220 3e0d8fb3 2005-12-27 devnull print("\t %R\n", rp);
221 3e0d8fb3 2005-12-27 devnull }
222 3e0d8fb3 2005-12-27 devnull
223 3e0d8fb3 2005-12-27 devnull void
224 3e0d8fb3 2005-12-27 devnull logreply(int id, uchar *addr, DNSmsg *mp)
225 3e0d8fb3 2005-12-27 devnull {
226 3e0d8fb3 2005-12-27 devnull RR *rp;
227 3e0d8fb3 2005-12-27 devnull char buf[12];
228 3e0d8fb3 2005-12-27 devnull char resp[32];
229 3e0d8fb3 2005-12-27 devnull
230 3e0d8fb3 2005-12-27 devnull switch(mp->flags & Rmask){
231 3e0d8fb3 2005-12-27 devnull case Rok:
232 3e0d8fb3 2005-12-27 devnull strcpy(resp, "OK");
233 3e0d8fb3 2005-12-27 devnull break;
234 3e0d8fb3 2005-12-27 devnull case Rformat:
235 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Format error");
236 3e0d8fb3 2005-12-27 devnull break;
237 3e0d8fb3 2005-12-27 devnull case Rserver:
238 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Server failed");
239 3e0d8fb3 2005-12-27 devnull break;
240 3e0d8fb3 2005-12-27 devnull case Rname:
241 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Nonexistent");
242 3e0d8fb3 2005-12-27 devnull break;
243 3e0d8fb3 2005-12-27 devnull case Runimplimented:
244 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Unimplemented");
245 3e0d8fb3 2005-12-27 devnull break;
246 3e0d8fb3 2005-12-27 devnull case Rrefused:
247 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Refused");
248 3e0d8fb3 2005-12-27 devnull break;
249 3e0d8fb3 2005-12-27 devnull default:
250 3e0d8fb3 2005-12-27 devnull sprint(resp, "%d", mp->flags & Rmask);
251 3e0d8fb3 2005-12-27 devnull break;
252 3e0d8fb3 2005-12-27 devnull }
253 3e0d8fb3 2005-12-27 devnull
254 3e0d8fb3 2005-12-27 devnull print("%d: rcvd %s from %I (%s%s%s%s%s)\n", id, resp, addr,
255 3e0d8fb3 2005-12-27 devnull mp->flags & Fauth ? "authoritative" : "",
256 3e0d8fb3 2005-12-27 devnull mp->flags & Ftrunc ? " truncated" : "",
257 3e0d8fb3 2005-12-27 devnull mp->flags & Frecurse ? " recurse" : "",
258 3e0d8fb3 2005-12-27 devnull mp->flags & Fcanrec ? " can_recurse" : "",
259 3e0d8fb3 2005-12-27 devnull mp->flags & (Fauth|Rname) == (Fauth|Rname) ?
260 3e0d8fb3 2005-12-27 devnull " nx" : "");
261 3e0d8fb3 2005-12-27 devnull for(rp = mp->qd; rp != nil; rp = rp->next)
262 3e0d8fb3 2005-12-27 devnull print("\tQ: %s %s\n", rp->owner->name, rrname(rp->type, buf, sizeof buf));
263 3e0d8fb3 2005-12-27 devnull logsection("Ans: ", mp->an);
264 3e0d8fb3 2005-12-27 devnull logsection("Auth: ", mp->ns);
265 3e0d8fb3 2005-12-27 devnull logsection("Hint: ", mp->ar);
266 3e0d8fb3 2005-12-27 devnull }
267 3e0d8fb3 2005-12-27 devnull
268 3e0d8fb3 2005-12-27 devnull void
269 3e0d8fb3 2005-12-27 devnull logsend(int id, int subid, uchar *addr, char *sname, char *rname, int type)
270 3e0d8fb3 2005-12-27 devnull {
271 3e0d8fb3 2005-12-27 devnull char buf[12];
272 3e0d8fb3 2005-12-27 devnull
273 3e0d8fb3 2005-12-27 devnull print("%d.%d: sending to %I/%s %s %s\n", id, subid,
274 3e0d8fb3 2005-12-27 devnull addr, sname, rname, rrname(type, buf, sizeof buf));
275 3e0d8fb3 2005-12-27 devnull }
276 3e0d8fb3 2005-12-27 devnull
277 3e0d8fb3 2005-12-27 devnull RR*
278 3e0d8fb3 2005-12-27 devnull getdnsservers(int class)
279 3e0d8fb3 2005-12-27 devnull {
280 3e0d8fb3 2005-12-27 devnull RR *rr;
281 3e0d8fb3 2005-12-27 devnull
282 3e0d8fb3 2005-12-27 devnull if(servername == nil)
283 3e0d8fb3 2005-12-27 devnull return dnsservers(class);
284 3e0d8fb3 2005-12-27 devnull
285 3e0d8fb3 2005-12-27 devnull rr = rralloc(Tns);
286 3e0d8fb3 2005-12-27 devnull rr->owner = dnlookup("local#dns#servers", class, 1);
287 3e0d8fb3 2005-12-27 devnull rr->host = dnlookup(servername, class, 1);
288 3e0d8fb3 2005-12-27 devnull
289 3e0d8fb3 2005-12-27 devnull return rr;
290 3e0d8fb3 2005-12-27 devnull }
291 3e0d8fb3 2005-12-27 devnull
292 3e0d8fb3 2005-12-27 devnull void
293 3e0d8fb3 2005-12-27 devnull squirrelserveraddrs(void)
294 3e0d8fb3 2005-12-27 devnull {
295 3e0d8fb3 2005-12-27 devnull RR *rr, *rp, **l;
296 3e0d8fb3 2005-12-27 devnull Request req;
297 3e0d8fb3 2005-12-27 devnull
298 3e0d8fb3 2005-12-27 devnull /* look up the resolver address first */
299 3e0d8fb3 2005-12-27 devnull resolver = 0;
300 3e0d8fb3 2005-12-27 devnull debug = 0;
301 3e0d8fb3 2005-12-27 devnull if(serveraddrs)
302 3e0d8fb3 2005-12-27 devnull rrfreelist(serveraddrs);
303 3e0d8fb3 2005-12-27 devnull serveraddrs = nil;
304 3e0d8fb3 2005-12-27 devnull rr = getdnsservers(Cin);
305 3e0d8fb3 2005-12-27 devnull l = &serveraddrs;
306 3e0d8fb3 2005-12-27 devnull for(rp = rr; rp != nil; rp = rp->next){
307 3e0d8fb3 2005-12-27 devnull if(strcmp(ipattr(rp->host->name), "ip") == 0){
308 3e0d8fb3 2005-12-27 devnull *l = rralloc(Ta);
309 3e0d8fb3 2005-12-27 devnull (*l)->owner = rp->host;
310 3e0d8fb3 2005-12-27 devnull (*l)->ip = rp->host;
311 3e0d8fb3 2005-12-27 devnull l = &(*l)->next;
312 3e0d8fb3 2005-12-27 devnull continue;
313 3e0d8fb3 2005-12-27 devnull }
314 3e0d8fb3 2005-12-27 devnull req.isslave = 1;
315 3e0d8fb3 2005-12-27 devnull req.aborttime = now + 60; /* don't spend more than 60 seconds */
316 3e0d8fb3 2005-12-27 devnull *l = dnresolve(rp->host->name, Cin, Ta, &req, 0, 0, Recurse, 0, 0);
317 3e0d8fb3 2005-12-27 devnull while(*l != nil)
318 3e0d8fb3 2005-12-27 devnull l = &(*l)->next;
319 3e0d8fb3 2005-12-27 devnull }
320 3e0d8fb3 2005-12-27 devnull resolver = 1;
321 3e0d8fb3 2005-12-27 devnull debug = 1;
322 3e0d8fb3 2005-12-27 devnull }
323 3e0d8fb3 2005-12-27 devnull
324 3e0d8fb3 2005-12-27 devnull void
325 3e0d8fb3 2005-12-27 devnull preloadserveraddrs(void)
326 3e0d8fb3 2005-12-27 devnull {
327 3e0d8fb3 2005-12-27 devnull RR *rp, **l, *first;
328 3e0d8fb3 2005-12-27 devnull
329 3e0d8fb3 2005-12-27 devnull l = &first;
330 3e0d8fb3 2005-12-27 devnull for(rp = serveraddrs; rp != nil; rp = rp->next){
331 3e0d8fb3 2005-12-27 devnull rrcopy(rp, l);
332 3e0d8fb3 2005-12-27 devnull rrattach(first, 1);
333 3e0d8fb3 2005-12-27 devnull }
334 3e0d8fb3 2005-12-27 devnull }
335 3e0d8fb3 2005-12-27 devnull
336 3e0d8fb3 2005-12-27 devnull int
337 3e0d8fb3 2005-12-27 devnull setserver(char *server)
338 3e0d8fb3 2005-12-27 devnull {
339 3e0d8fb3 2005-12-27 devnull if(servername != nil){
340 3e0d8fb3 2005-12-27 devnull free(servername);
341 3e0d8fb3 2005-12-27 devnull servername = nil;
342 3e0d8fb3 2005-12-27 devnull resolver = 0;
343 3e0d8fb3 2005-12-27 devnull }
344 3e0d8fb3 2005-12-27 devnull if(server == nil || *server == 0)
345 3e0d8fb3 2005-12-27 devnull return 0;
346 3e0d8fb3 2005-12-27 devnull servername = strdup(server);
347 3e0d8fb3 2005-12-27 devnull squirrelserveraddrs();
348 3e0d8fb3 2005-12-27 devnull if(serveraddrs == nil){
349 3e0d8fb3 2005-12-27 devnull print("can't resolve %s\n", servername);
350 3e0d8fb3 2005-12-27 devnull resolver = 0;
351 3e0d8fb3 2005-12-27 devnull } else {
352 3e0d8fb3 2005-12-27 devnull resolver = 1;
353 3e0d8fb3 2005-12-27 devnull }
354 3e0d8fb3 2005-12-27 devnull return resolver ? 0 : -1;
355 3e0d8fb3 2005-12-27 devnull }
356 3e0d8fb3 2005-12-27 devnull
357 3e0d8fb3 2005-12-27 devnull void
358 3e0d8fb3 2005-12-27 devnull doquery(char *name, char *tstr)
359 3e0d8fb3 2005-12-27 devnull {
360 3e0d8fb3 2005-12-27 devnull Request req;
361 3e0d8fb3 2005-12-27 devnull RR *rr, *rp;
362 3e0d8fb3 2005-12-27 devnull int len, type;
363 3e0d8fb3 2005-12-27 devnull char *p, *np;
364 3e0d8fb3 2005-12-27 devnull int rooted;
365 3e0d8fb3 2005-12-27 devnull char buf[1024];
366 3e0d8fb3 2005-12-27 devnull
367 3e0d8fb3 2005-12-27 devnull if(resolver)
368 3e0d8fb3 2005-12-27 devnull preloadserveraddrs();
369 3e0d8fb3 2005-12-27 devnull
370 3e0d8fb3 2005-12-27 devnull /* default to an "ip" request if alpha, "ptr" if numeric */
371 3e0d8fb3 2005-12-27 devnull if(tstr == nil || *tstr == 0) {
372 3e0d8fb3 2005-12-27 devnull if(strcmp(ipattr(name), "ip") == 0)
373 3e0d8fb3 2005-12-27 devnull tstr = "ptr";
374 3e0d8fb3 2005-12-27 devnull else
375 3e0d8fb3 2005-12-27 devnull tstr = "ip";
376 3e0d8fb3 2005-12-27 devnull }
377 3e0d8fb3 2005-12-27 devnull
378 3e0d8fb3 2005-12-27 devnull /* if name end in '.', remove it */
379 3e0d8fb3 2005-12-27 devnull len = strlen(name);
380 3e0d8fb3 2005-12-27 devnull if(len > 0 && name[len-1] == '.'){
381 3e0d8fb3 2005-12-27 devnull rooted = 1;
382 3e0d8fb3 2005-12-27 devnull name[len-1] = 0;
383 3e0d8fb3 2005-12-27 devnull } else
384 3e0d8fb3 2005-12-27 devnull rooted = 0;
385 3e0d8fb3 2005-12-27 devnull
386 3e0d8fb3 2005-12-27 devnull /* inverse queries may need to be permuted */
387 3e0d8fb3 2005-12-27 devnull strncpy(buf, name, sizeof buf);
388 3e0d8fb3 2005-12-27 devnull if(strcmp("ptr", tstr) == 0
389 3e0d8fb3 2005-12-27 devnull && strstr(name, "IN-ADDR") == 0
390 3e0d8fb3 2005-12-27 devnull && strstr(name, "in-addr") == 0){
391 3e0d8fb3 2005-12-27 devnull for(p = name; *p; p++)
392 3e0d8fb3 2005-12-27 devnull ;
393 3e0d8fb3 2005-12-27 devnull *p = '.';
394 3e0d8fb3 2005-12-27 devnull np = buf;
395 3e0d8fb3 2005-12-27 devnull len = 0;
396 3e0d8fb3 2005-12-27 devnull while(p >= name){
397 3e0d8fb3 2005-12-27 devnull len++;
398 3e0d8fb3 2005-12-27 devnull p--;
399 3e0d8fb3 2005-12-27 devnull if(*p == '.'){
400 3e0d8fb3 2005-12-27 devnull memmove(np, p+1, len);
401 3e0d8fb3 2005-12-27 devnull np += len;
402 3e0d8fb3 2005-12-27 devnull len = 0;
403 3e0d8fb3 2005-12-27 devnull }
404 3e0d8fb3 2005-12-27 devnull }
405 3e0d8fb3 2005-12-27 devnull memmove(np, p+1, len);
406 3e0d8fb3 2005-12-27 devnull np += len;
407 3e0d8fb3 2005-12-27 devnull strcpy(np, "in-addr.arpa");
408 3e0d8fb3 2005-12-27 devnull }
409 3e0d8fb3 2005-12-27 devnull
410 3e0d8fb3 2005-12-27 devnull /* look it up */
411 3e0d8fb3 2005-12-27 devnull type = rrtype(tstr);
412 3e0d8fb3 2005-12-27 devnull if(type < 0){
413 3e0d8fb3 2005-12-27 devnull print("!unknown type %s\n", tstr);
414 3e0d8fb3 2005-12-27 devnull return;
415 3e0d8fb3 2005-12-27 devnull }
416 3e0d8fb3 2005-12-27 devnull
417 3e0d8fb3 2005-12-27 devnull getactivity(&req);
418 3e0d8fb3 2005-12-27 devnull req.isslave = 1;
419 3e0d8fb3 2005-12-27 devnull req.aborttime = now + 60; /* don't spend more than 60 seconds */
420 3e0d8fb3 2005-12-27 devnull rr = dnresolve(buf, Cin, type, &req, 0, 0, Recurse, rooted, 0);
421 3e0d8fb3 2005-12-27 devnull if(rr){
422 3e0d8fb3 2005-12-27 devnull print("----------------------------\n");
423 3e0d8fb3 2005-12-27 devnull for(rp = rr; rp; rp = rp->next)
424 3e0d8fb3 2005-12-27 devnull print("answer %R\n", rp);
425 3e0d8fb3 2005-12-27 devnull print("----------------------------\n");
426 3e0d8fb3 2005-12-27 devnull }
427 3e0d8fb3 2005-12-27 devnull rrfreelist(rr);
428 3e0d8fb3 2005-12-27 devnull
429 3e0d8fb3 2005-12-27 devnull putactivity();
430 3e0d8fb3 2005-12-27 devnull }
431 3e0d8fb3 2005-12-27 devnull
432 3e0d8fb3 2005-12-27 devnull void
433 3e0d8fb3 2005-12-27 devnull docmd(int n, char **f)
434 3e0d8fb3 2005-12-27 devnull {
435 3e0d8fb3 2005-12-27 devnull int tmpsrv;
436 3e0d8fb3 2005-12-27 devnull char *name, *type;
437 3e0d8fb3 2005-12-27 devnull
438 3e0d8fb3 2005-12-27 devnull name = nil;
439 3e0d8fb3 2005-12-27 devnull type = nil;
440 3e0d8fb3 2005-12-27 devnull tmpsrv = 0;
441 3e0d8fb3 2005-12-27 devnull
442 3e0d8fb3 2005-12-27 devnull if(*f[0] == '@') {
443 3e0d8fb3 2005-12-27 devnull if(setserver(f[0]+1) < 0)
444 3e0d8fb3 2005-12-27 devnull return;
445 3e0d8fb3 2005-12-27 devnull
446 3e0d8fb3 2005-12-27 devnull switch(n){
447 3e0d8fb3 2005-12-27 devnull case 3:
448 3e0d8fb3 2005-12-27 devnull type = f[2];
449 3e0d8fb3 2005-12-27 devnull /* fall through */
450 3e0d8fb3 2005-12-27 devnull case 2:
451 3e0d8fb3 2005-12-27 devnull name = f[1];
452 3e0d8fb3 2005-12-27 devnull tmpsrv = 1;
453 3e0d8fb3 2005-12-27 devnull break;
454 3e0d8fb3 2005-12-27 devnull }
455 3e0d8fb3 2005-12-27 devnull } else {
456 3e0d8fb3 2005-12-27 devnull switch(n){
457 3e0d8fb3 2005-12-27 devnull case 2:
458 3e0d8fb3 2005-12-27 devnull type = f[1];
459 3e0d8fb3 2005-12-27 devnull /* fall through */
460 3e0d8fb3 2005-12-27 devnull case 1:
461 3e0d8fb3 2005-12-27 devnull name = f[0];
462 3e0d8fb3 2005-12-27 devnull break;
463 3e0d8fb3 2005-12-27 devnull }
464 3e0d8fb3 2005-12-27 devnull }
465 3e0d8fb3 2005-12-27 devnull
466 3e0d8fb3 2005-12-27 devnull if(name == nil)
467 3e0d8fb3 2005-12-27 devnull return;
468 3e0d8fb3 2005-12-27 devnull
469 3e0d8fb3 2005-12-27 devnull doquery(name, type);
470 3e0d8fb3 2005-12-27 devnull
471 3e0d8fb3 2005-12-27 devnull if(tmpsrv)
472 3e0d8fb3 2005-12-27 devnull setserver("");
473 3e0d8fb3 2005-12-27 devnull }