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"
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,
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;
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;
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**);
45 3e0d8fb3 2005-12-27 devnull main(int argc, char *argv[])
48 3e0d8fb3 2005-12-27 devnull Biobuf in;
50 3e0d8fb3 2005-12-27 devnull char *f[4];
52 3e0d8fb3 2005-12-27 devnull strcpy(mntpt, "/net");
54 3e0d8fb3 2005-12-27 devnull ARGBEGIN{
55 3e0d8fb3 2005-12-27 devnull case 'r':
56 3e0d8fb3 2005-12-27 devnull resolver = 1;
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");
62 3e0d8fb3 2005-12-27 devnull case 'f':
63 3e0d8fb3 2005-12-27 devnull dbfile = ARGF();
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();
74 3e0d8fb3 2005-12-27 devnull if(resolver)
75 3e0d8fb3 2005-12-27 devnull squirrelserveraddrs();
77 3e0d8fb3 2005-12-27 devnull debug = 1;
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);
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);
89 3e0d8fb3 2005-12-27 devnull continue;
91 3e0d8fb3 2005-12-27 devnull /* flush the cache */
92 3e0d8fb3 2005-12-27 devnull dnpurge();
94 3e0d8fb3 2005-12-27 devnull docmd(n, f);
97 3e0d8fb3 2005-12-27 devnull exits(0);
100 3e0d8fb3 2005-12-27 devnull static char*
101 3e0d8fb3 2005-12-27 devnull longtime(long t)
103 3e0d8fb3 2005-12-27 devnull int d, h, m, n;
104 3e0d8fb3 2005-12-27 devnull static char x[128];
106 3e0d8fb3 2005-12-27 devnull for(d = 0; t >= 24*60*60; t -= 24*60*60)
108 3e0d8fb3 2005-12-27 devnull for(h = 0; t >= 60*60; t -= 60*60)
110 3e0d8fb3 2005-12-27 devnull for(m = 0; t >= 60; t -= 60)
114 3e0d8fb3 2005-12-27 devnull n += sprint(x, "%d day ", d);
116 3e0d8fb3 2005-12-27 devnull n += sprint(x+n, "%d hr ", h);
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;
125 3e0d8fb3 2005-12-27 devnull prettyrrfmt(Fmt *f)
128 3e0d8fb3 2005-12-27 devnull char buf[3*Domlen];
129 3e0d8fb3 2005-12-27 devnull char *p, *e;
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;
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));
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;
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);
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);
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);
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);
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);
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);
174 3e0d8fb3 2005-12-27 devnull case Tptr:
175 3e0d8fb3 2005-12-27 devnull seprint(p, e, "\t%s", rp->ptr->name);
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);
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);
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);
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);
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);
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);
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);
206 3e0d8fb3 2005-12-27 devnull default:
210 3e0d8fb3 2005-12-27 devnull return fmtstrcpy(f, buf);
214 3e0d8fb3 2005-12-27 devnull logsection(char *flag, RR *rp)
216 3e0d8fb3 2005-12-27 devnull if(rp == nil)
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);
224 3e0d8fb3 2005-12-27 devnull logreply(int id, uchar *addr, DNSmsg *mp)
227 3e0d8fb3 2005-12-27 devnull char buf[12];
228 3e0d8fb3 2005-12-27 devnull char resp[32];
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");
234 3e0d8fb3 2005-12-27 devnull case Rformat:
235 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Format error");
237 3e0d8fb3 2005-12-27 devnull case Rserver:
238 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Server failed");
240 3e0d8fb3 2005-12-27 devnull case Rname:
241 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Nonexistent");
243 3e0d8fb3 2005-12-27 devnull case Runimplimented:
244 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Unimplemented");
246 3e0d8fb3 2005-12-27 devnull case Rrefused:
247 3e0d8fb3 2005-12-27 devnull strcpy(resp, "Refused");
249 3e0d8fb3 2005-12-27 devnull default:
250 3e0d8fb3 2005-12-27 devnull sprint(resp, "%d", mp->flags & Rmask);
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);
269 3e0d8fb3 2005-12-27 devnull logsend(int id, int subid, uchar *addr, char *sname, char *rname, int type)
271 3e0d8fb3 2005-12-27 devnull char buf[12];
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));
278 3e0d8fb3 2005-12-27 devnull getdnsservers(int class)
282 3e0d8fb3 2005-12-27 devnull if(servername == nil)
283 3e0d8fb3 2005-12-27 devnull return dnsservers(class);
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);
289 3e0d8fb3 2005-12-27 devnull return rr;
293 3e0d8fb3 2005-12-27 devnull squirrelserveraddrs(void)
295 3e0d8fb3 2005-12-27 devnull RR *rr, *rp, **l;
296 3e0d8fb3 2005-12-27 devnull Request req;
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;
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;
320 3e0d8fb3 2005-12-27 devnull resolver = 1;
321 3e0d8fb3 2005-12-27 devnull debug = 1;
325 3e0d8fb3 2005-12-27 devnull preloadserveraddrs(void)
327 3e0d8fb3 2005-12-27 devnull RR *rp, **l, *first;
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);
337 3e0d8fb3 2005-12-27 devnull setserver(char *server)
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;
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;
354 3e0d8fb3 2005-12-27 devnull return resolver ? 0 : -1;
358 3e0d8fb3 2005-12-27 devnull doquery(char *name, char *tstr)
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];
367 3e0d8fb3 2005-12-27 devnull if(resolver)
368 3e0d8fb3 2005-12-27 devnull preloadserveraddrs();
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";
375 3e0d8fb3 2005-12-27 devnull tstr = "ip";
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;
384 3e0d8fb3 2005-12-27 devnull rooted = 0;
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++)
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){
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;
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");
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);
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);
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");
427 3e0d8fb3 2005-12-27 devnull rrfreelist(rr);
429 3e0d8fb3 2005-12-27 devnull putactivity();
433 3e0d8fb3 2005-12-27 devnull docmd(int n, char **f)
435 3e0d8fb3 2005-12-27 devnull int tmpsrv;
436 3e0d8fb3 2005-12-27 devnull char *name, *type;
438 3e0d8fb3 2005-12-27 devnull name = nil;
439 3e0d8fb3 2005-12-27 devnull type = nil;
440 3e0d8fb3 2005-12-27 devnull tmpsrv = 0;
442 3e0d8fb3 2005-12-27 devnull if(*f[0] == '@') {
443 3e0d8fb3 2005-12-27 devnull if(setserver(f[0]+1) < 0)
446 3e0d8fb3 2005-12-27 devnull switch(n){
448 3e0d8fb3 2005-12-27 devnull type = f[2];
449 3e0d8fb3 2005-12-27 devnull /* fall through */
451 3e0d8fb3 2005-12-27 devnull name = f[1];
452 3e0d8fb3 2005-12-27 devnull tmpsrv = 1;
455 3e0d8fb3 2005-12-27 devnull } else {
456 3e0d8fb3 2005-12-27 devnull switch(n){
458 3e0d8fb3 2005-12-27 devnull type = f[1];
459 3e0d8fb3 2005-12-27 devnull /* fall through */
461 3e0d8fb3 2005-12-27 devnull name = f[0];
466 3e0d8fb3 2005-12-27 devnull if(name == nil)
469 3e0d8fb3 2005-12-27 devnull doquery(name, type);
471 3e0d8fb3 2005-12-27 devnull if(tmpsrv)
472 3e0d8fb3 2005-12-27 devnull setserver("");