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"
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
19 3e0d8fb3 2005-12-27 devnull static char *servername;
20 3e0d8fb3 2005-12-27 devnull static RR *serveraddrs;
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;
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**);
47 5c9f76b5 2006-02-14 devnull usage(void)
49 49a1496c 2006-02-20 devnull fprint(2, "usage: dnsdebug [-fr] [query ...]\n");
50 5c9f76b5 2006-02-14 devnull threadexitsall("usage");
54 5c9f76b5 2006-02-14 devnull threadmain(int argc, char *argv[])
57 3e0d8fb3 2005-12-27 devnull Biobuf in;
59 3e0d8fb3 2005-12-27 devnull char *f[4];
61 3e0d8fb3 2005-12-27 devnull strcpy(mntpt, "/net");
63 3e0d8fb3 2005-12-27 devnull ARGBEGIN{
64 3e0d8fb3 2005-12-27 devnull case 'r':
65 3e0d8fb3 2005-12-27 devnull resolver = 1;
67 3e0d8fb3 2005-12-27 devnull case 'f':
68 5c9f76b5 2006-02-14 devnull dbfile = EARGF(usage());
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();
81 3e0d8fb3 2005-12-27 devnull if(resolver)
82 3e0d8fb3 2005-12-27 devnull squirrelserveraddrs();
84 3e0d8fb3 2005-12-27 devnull debug = 1;
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);
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);
96 3e0d8fb3 2005-12-27 devnull continue;
98 3e0d8fb3 2005-12-27 devnull /* flush the cache */
99 3e0d8fb3 2005-12-27 devnull dnpurge();
101 3e0d8fb3 2005-12-27 devnull docmd(n, f);
104 5c9f76b5 2006-02-14 devnull threadexitsall(0);
107 3e0d8fb3 2005-12-27 devnull static char*
108 3e0d8fb3 2005-12-27 devnull longtime(long t)
110 3e0d8fb3 2005-12-27 devnull int d, h, m, n;
111 3e0d8fb3 2005-12-27 devnull static char x[128];
113 3e0d8fb3 2005-12-27 devnull for(d = 0; t >= 24*60*60; t -= 24*60*60)
115 3e0d8fb3 2005-12-27 devnull for(h = 0; t >= 60*60; t -= 60*60)
117 3e0d8fb3 2005-12-27 devnull for(m = 0; t >= 60; t -= 60)
121 3e0d8fb3 2005-12-27 devnull n += sprint(x, "%d day ", d);
123 3e0d8fb3 2005-12-27 devnull n += sprint(x+n, "%d hr ", h);
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;
132 3e0d8fb3 2005-12-27 devnull prettyrrfmt(Fmt *f)
135 3e0d8fb3 2005-12-27 devnull char buf[3*Domlen];
136 3e0d8fb3 2005-12-27 devnull char *p, *e;
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;
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));
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;
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);
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);
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);
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);
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);
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);
181 3e0d8fb3 2005-12-27 devnull case Tptr:
182 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s", rp->ptr->name);
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);
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);
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);
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);
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);
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);
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);
213 3e0d8fb3 2005-12-27 devnull default:
217 3e0d8fb3 2005-12-27 devnull return fmtstrcpy(f, buf);
221 3e0d8fb3 2005-12-27 devnull logsection(char *flag, RR *rp)
223 3e0d8fb3 2005-12-27 devnull if(rp == nil)
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);
231 3e0d8fb3 2005-12-27 devnull logreply(int id, uchar *addr, DNSmsg *mp)
234 3e0d8fb3 2005-12-27 devnull char buf[12];
235 3e0d8fb3 2005-12-27 devnull char resp[32];
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");
241 3e0d8fb3 2005-12-27 devnull case Rformat:
242 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Format error");
244 3e0d8fb3 2005-12-27 devnull case Rserver:
245 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Server failed");
247 3e0d8fb3 2005-12-27 devnull case Rname:
248 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Nonexistent");
250 3e0d8fb3 2005-12-27 devnull case Runimplimented:
251 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Unimplemented");
253 3e0d8fb3 2005-12-27 devnull case Rrefused:
254 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Refused");
256 3e0d8fb3 2005-12-27 devnull default:
257 3e0d8fb3 2005-12-27 devnull sprint(resp, "%d", mp->flags & Rmask);
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);
276 3e0d8fb3 2005-12-27 devnull logsend(int id, int subid, uchar *addr, char *sname, char *rname, int type)
278 3e0d8fb3 2005-12-27 devnull char buf[12];
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));
285 3e0d8fb3 2005-12-27 devnull getdnsservers(int class)
289 3e0d8fb3 2005-12-27 devnull if(servername == nil)
290 3e0d8fb3 2005-12-27 devnull return dnsservers(class);
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);
296 3e0d8fb3 2005-12-27 devnull return rr;
300 3e0d8fb3 2005-12-27 devnull squirrelserveraddrs(void)
302 3e0d8fb3 2005-12-27 devnull RR *rr, *rp, **l;
303 3e0d8fb3 2005-12-27 devnull Request req;
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;
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;
326 3e0d8fb3 2005-12-27 devnull resolver = 1;
327 3e0d8fb3 2005-12-27 devnull debug = 1;
331 3e0d8fb3 2005-12-27 devnull preloadserveraddrs(void)
333 3e0d8fb3 2005-12-27 devnull RR *rp, **l, *first;
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);
343 3e0d8fb3 2005-12-27 devnull setserver(char *server)
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;
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;
360 3e0d8fb3 2005-12-27 devnull return resolver ? 0 : -1;
364 3e0d8fb3 2005-12-27 devnull doquery(char *name, char *tstr)
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];
373 3e0d8fb3 2005-12-27 devnull if(resolver)
374 3e0d8fb3 2005-12-27 devnull preloadserveraddrs();
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";
381 3e0d8fb3 2005-12-27 devnull tstr = "ip";
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;
390 3e0d8fb3 2005-12-27 devnull rooted = 0;
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++)
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){
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;
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");
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);
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);
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");
432 3e0d8fb3 2005-12-27 devnull rrfreelist(rr);
434 3e0d8fb3 2005-12-27 devnull putactivity();
438 3e0d8fb3 2005-12-27 devnull docmd(int n, char **f)
440 3e0d8fb3 2005-12-27 devnull int tmpsrv;
441 3e0d8fb3 2005-12-27 devnull char *name, *type;
443 3e0d8fb3 2005-12-27 devnull name = nil;
444 3e0d8fb3 2005-12-27 devnull type = nil;
445 3e0d8fb3 2005-12-27 devnull tmpsrv = 0;
447 3e0d8fb3 2005-12-27 devnull if(*f[0] == '@') {
448 3e0d8fb3 2005-12-27 devnull if(setserver(f[0]+1) < 0)
451 3e0d8fb3 2005-12-27 devnull switch(n){
453 3e0d8fb3 2005-12-27 devnull type = f[2];
454 3e0d8fb3 2005-12-27 devnull /* fall through */
456 3e0d8fb3 2005-12-27 devnull name = f[1];
457 3e0d8fb3 2005-12-27 devnull tmpsrv = 1;
460 3e0d8fb3 2005-12-27 devnull } else {
461 3e0d8fb3 2005-12-27 devnull switch(n){
463 3e0d8fb3 2005-12-27 devnull type = f[1];
464 3e0d8fb3 2005-12-27 devnull /* fall through */
466 3e0d8fb3 2005-12-27 devnull name = f[0];
471 3e0d8fb3 2005-12-27 devnull if(name == nil)
474 3e0d8fb3 2005-12-27 devnull doquery(name, type);
476 3e0d8fb3 2005-12-27 devnull if(tmpsrv)
477 3e0d8fb3 2005-12-27 devnull setserver("");