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