xref: /plan9/sys/src/cmd/ip/snoopy/dns.c (revision b1c161c21052bbfab8430c267211155c26021160)
1b4b9fc2fSDavid du Colombier #include <u.h>
2b4b9fc2fSDavid du Colombier #include <libc.h>
3b4b9fc2fSDavid du Colombier #include <ip.h>
4b4b9fc2fSDavid du Colombier #include "dat.h"
5b4b9fc2fSDavid du Colombier #include "protos.h"
6b4b9fc2fSDavid du Colombier #include "../../ndb/dns.h"
7b4b9fc2fSDavid du Colombier 
8b4b9fc2fSDavid du Colombier /* names of RR types - /sys/src/cmd/ndb/dn.c:/rrtname */
9b4b9fc2fSDavid du Colombier char *rrtname[] =
10b4b9fc2fSDavid du Colombier {
11b4b9fc2fSDavid du Colombier [Ta]		"ip",
12b4b9fc2fSDavid du Colombier [Tns]		"ns",
13b4b9fc2fSDavid du Colombier [Tmd]		"md",
14b4b9fc2fSDavid du Colombier [Tmf]		"mf",
15b4b9fc2fSDavid du Colombier [Tcname]	"cname",
16b4b9fc2fSDavid du Colombier [Tsoa]		"soa",
17b4b9fc2fSDavid du Colombier [Tmb]		"mb",
18b4b9fc2fSDavid du Colombier [Tmg]		"mg",
19b4b9fc2fSDavid du Colombier [Tmr]		"mr",
20b4b9fc2fSDavid du Colombier [Tnull]		"null",
21b4b9fc2fSDavid du Colombier [Twks]		"wks",
22b4b9fc2fSDavid du Colombier [Tptr]		"ptr",
23b4b9fc2fSDavid du Colombier [Thinfo]	"hinfo",
24b4b9fc2fSDavid du Colombier [Tminfo]	"minfo",
25b4b9fc2fSDavid du Colombier [Tmx]		"mx",
26b4b9fc2fSDavid du Colombier [Ttxt]		"txt",
27b4b9fc2fSDavid du Colombier [Trp]		"rp",
28b4b9fc2fSDavid du Colombier [Tafsdb]	"afsdb",
29b4b9fc2fSDavid du Colombier [Tx25]		"x.25",
30b4b9fc2fSDavid du Colombier [Tisdn]		"isdn",
31b4b9fc2fSDavid du Colombier [Trt]		"rt",
32b4b9fc2fSDavid du Colombier [Tnsap]		"nsap",
33b4b9fc2fSDavid du Colombier [Tnsapptr]	"nsap-ptr",
34b4b9fc2fSDavid du Colombier [Tsig]		"sig",
35b4b9fc2fSDavid du Colombier [Tkey]		"key",
36b4b9fc2fSDavid du Colombier [Tpx]		"px",
37b4b9fc2fSDavid du Colombier [Tgpos]		"gpos",
38b4b9fc2fSDavid du Colombier [Taaaa]		"ipv6",
39b4b9fc2fSDavid du Colombier [Tloc]		"loc",
40b4b9fc2fSDavid du Colombier [Tnxt]		"nxt",
41b4b9fc2fSDavid du Colombier [Teid]		"eid",
42b4b9fc2fSDavid du Colombier [Tnimloc]	"nimrod",
43b4b9fc2fSDavid du Colombier [Tsrv]		"srv",
44b4b9fc2fSDavid du Colombier [Tatma]		"atma",
45b4b9fc2fSDavid du Colombier [Tnaptr]	"naptr",
46b4b9fc2fSDavid du Colombier [Tkx]		"kx",
47b4b9fc2fSDavid du Colombier [Tcert]		"cert",
48b4b9fc2fSDavid du Colombier [Ta6]		"a6",
49b4b9fc2fSDavid du Colombier [Tdname]	"dname",
50b4b9fc2fSDavid du Colombier [Tsink]		"sink",
51b4b9fc2fSDavid du Colombier [Topt]		"opt",
52b4b9fc2fSDavid du Colombier [Tapl]		"apl",
53b4b9fc2fSDavid du Colombier [Tds]		"ds",
54b4b9fc2fSDavid du Colombier [Tsshfp]	"sshfp",
55b4b9fc2fSDavid du Colombier [Tipseckey]	"ipseckey",
56b4b9fc2fSDavid du Colombier [Trrsig]	"rrsig",
57b4b9fc2fSDavid du Colombier [Tnsec]		"nsec",
58b4b9fc2fSDavid du Colombier [Tdnskey]	"dnskey",
59b4b9fc2fSDavid du Colombier [Tspf]		"spf",
60b4b9fc2fSDavid du Colombier [Tuinfo]	"uinfo",
61b4b9fc2fSDavid du Colombier [Tuid]		"uid",
62b4b9fc2fSDavid du Colombier [Tgid]		"gid",
63b4b9fc2fSDavid du Colombier [Tunspec]	"unspec",
64b4b9fc2fSDavid du Colombier [Ttkey]		"tkey",
65b4b9fc2fSDavid du Colombier [Ttsig]		"tsig",
66b4b9fc2fSDavid du Colombier [Tixfr]		"ixfr",
67b4b9fc2fSDavid du Colombier [Taxfr]		"axfr",
68b4b9fc2fSDavid du Colombier [Tmailb]	"mailb",
69b4b9fc2fSDavid du Colombier [Tmaila]	"maila",
70b4b9fc2fSDavid du Colombier [Tall]		"all",
71b4b9fc2fSDavid du Colombier 		0,
72b4b9fc2fSDavid du Colombier };
73b4b9fc2fSDavid du Colombier static char*
rrtypestr(int t)74b4b9fc2fSDavid du Colombier rrtypestr(int t)
75b4b9fc2fSDavid du Colombier {
76b4b9fc2fSDavid du Colombier 	char buf[20];
77b4b9fc2fSDavid du Colombier 
78b4b9fc2fSDavid du Colombier 	if(t >= 0 && t < nelem(rrtname) && rrtname[t])
79b4b9fc2fSDavid du Colombier 		return rrtname[t];
80b4b9fc2fSDavid du Colombier 	snprint(buf, sizeof buf, "type%d", t);
81b4b9fc2fSDavid du Colombier 	return buf;
82b4b9fc2fSDavid du Colombier }
83b4b9fc2fSDavid du Colombier 
84b4b9fc2fSDavid du Colombier static void
fmtrr(Msg * m,RR ** rrp,int quest)85b4b9fc2fSDavid du Colombier fmtrr(Msg *m, RR **rrp, int quest)
86b4b9fc2fSDavid du Colombier {
87b4b9fc2fSDavid du Colombier 	Txt *t;
88b4b9fc2fSDavid du Colombier 	RR *rr;
89b4b9fc2fSDavid du Colombier 
90b4b9fc2fSDavid du Colombier 	rr = *rrp;
91b4b9fc2fSDavid du Colombier 	if(rr == nil)
92b4b9fc2fSDavid du Colombier 		return;
93b4b9fc2fSDavid du Colombier 	*rrp = rr->next;
94b4b9fc2fSDavid du Colombier 
95b4b9fc2fSDavid du Colombier 	m->p = seprint(m->p, m->e, "%s name=%s ttl=%lud",
96b4b9fc2fSDavid du Colombier 		rrtypestr(rr->type),
97b4b9fc2fSDavid du Colombier 		rr->owner->name, rr->ttl);
98b4b9fc2fSDavid du Colombier 	if(!quest)
99b4b9fc2fSDavid du Colombier 	switch(rr->type){
100b4b9fc2fSDavid du Colombier 	default:
101b4b9fc2fSDavid du Colombier 		break;
102b4b9fc2fSDavid du Colombier 	case Thinfo:
1034f8f669cSDavid du Colombier 		m->p = seprint(m->p, m->e, " cpu=%s os=%s",
1044f8f669cSDavid du Colombier 			rr->cpu->name, rr->os->name);
105b4b9fc2fSDavid du Colombier 		break;
106b4b9fc2fSDavid du Colombier 	case Tcname:
107b4b9fc2fSDavid du Colombier 	case Tmb:
108b4b9fc2fSDavid du Colombier 	case Tmd:
109b4b9fc2fSDavid du Colombier 	case Tmf:
110b4b9fc2fSDavid du Colombier 	case Tns:
111b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " host=%s", rr->host->name);
112b4b9fc2fSDavid du Colombier 		break;
113b4b9fc2fSDavid du Colombier 	case Tmg:
114b4b9fc2fSDavid du Colombier 	case Tmr:
115b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " mb=%s", rr->mb->name);
116b4b9fc2fSDavid du Colombier 		break;
117b4b9fc2fSDavid du Colombier 	case Tminfo:
118b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " rmb=%s", rr->rmb->name);
119b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " mb=%s", rr->mb->name);
120b4b9fc2fSDavid du Colombier 		break;
121b4b9fc2fSDavid du Colombier 	case Tmx:
122b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " pref=%lud", rr->pref);
123b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " host=%s", rr->host->name);
124b4b9fc2fSDavid du Colombier 		break;
125b4b9fc2fSDavid du Colombier 	case Ta:
126b4b9fc2fSDavid du Colombier 	case Taaaa:
127b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " ip=%s", rr->ip->name);
128b4b9fc2fSDavid du Colombier 		break;
129b4b9fc2fSDavid du Colombier 	case Tptr:
130b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " ptr=%s", rr->ptr->name);
131b4b9fc2fSDavid du Colombier 		break;
132b4b9fc2fSDavid du Colombier 	case Tsoa:
133b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " host=%s", rr->host->name);
134b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " rmb=%s", rr->rmb->name);
135b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " soa.serial=%lud", rr->soa->serial);
136b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " soa.refresh=%lud", rr->soa->refresh);
137b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " soa.retry=%lud", rr->soa->retry);
138b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " soa.expire=%lud", rr->soa->expire);
139b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " soa.minttl=%lud", rr->soa->minttl);
140b4b9fc2fSDavid du Colombier 		break;
141b4b9fc2fSDavid du Colombier 	case Ttxt:
142b4b9fc2fSDavid du Colombier 		for(t=rr->txt; t; t=t->next)
143b4b9fc2fSDavid du Colombier 			m->p = seprint(m->p, m->e, " txt=%q", t->p);
144b4b9fc2fSDavid du Colombier 		break;
145b4b9fc2fSDavid du Colombier 	case Tnull:
1464f8f669cSDavid du Colombier 		m->p = seprint(m->p, m->e, " null=%.*H",
1474f8f669cSDavid du Colombier 			rr->null->dlen, rr->null->data);
148b4b9fc2fSDavid du Colombier 		break;
149b4b9fc2fSDavid du Colombier 	case Trp:
150b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " rmb=%s", rr->rmb->name);
151b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, " rp=%s", rr->rp->name);
152b4b9fc2fSDavid du Colombier 		break;
153b4b9fc2fSDavid du Colombier 	case Tkey:
1544f8f669cSDavid du Colombier 		m->p = seprint(m->p, m->e, " flags=%d proto=%d alg=%d data=%.*H",
1554f8f669cSDavid du Colombier 			rr->key->flags, rr->key->proto, rr->key->alg,
1564f8f669cSDavid du Colombier 			rr->key->dlen, rr->key->data);
157b4b9fc2fSDavid du Colombier 		break;
158b4b9fc2fSDavid du Colombier 	case Tsig:
1594f8f669cSDavid du Colombier 		m->p = seprint(m->p, m->e,
1604f8f669cSDavid du Colombier " type=%d alg=%d labels=%d ttl=%lud exp=%lud incep=%lud tag=%d signer=%s data=%.*H",
161b4b9fc2fSDavid du Colombier 			rr->sig->type, rr->sig->alg, rr->sig->labels,
162b4b9fc2fSDavid du Colombier 			rr->sig->ttl, rr->sig->exp, rr->sig->incep, rr->sig->tag,
163b4b9fc2fSDavid du Colombier 			rr->sig->signer->name, rr->sig->dlen, rr->sig->data);
164b4b9fc2fSDavid du Colombier 		break;
165b4b9fc2fSDavid du Colombier 	case Tcert:
1664f8f669cSDavid du Colombier 		m->p = seprint(m->p, m->e, " type=%d tag=%d alg=%d data=%.*H",
1674f8f669cSDavid du Colombier 			rr->cert->type, rr->cert->tag, rr->cert->alg,
1684f8f669cSDavid du Colombier 			rr->cert->dlen, rr->cert->data);
169b4b9fc2fSDavid du Colombier 		break;
170b4b9fc2fSDavid du Colombier 	}
171b4b9fc2fSDavid du Colombier 	rrfree(rr);
172b4b9fc2fSDavid du Colombier }
173b4b9fc2fSDavid du Colombier 
174b4b9fc2fSDavid du Colombier void freealldn(void);
175b4b9fc2fSDavid du Colombier static Proto dnsqd, dnsan, dnsns, dnsar;
176b4b9fc2fSDavid du Colombier 
177b4b9fc2fSDavid du Colombier static void donext(Msg*);
178b4b9fc2fSDavid du Colombier static DNSmsg dm;
179b4b9fc2fSDavid du Colombier 
180b4b9fc2fSDavid du Colombier static int
p_seprint(Msg * m)181b4b9fc2fSDavid du Colombier p_seprint(Msg *m)
182b4b9fc2fSDavid du Colombier {
183b4b9fc2fSDavid du Colombier 	char *e;
184b4b9fc2fSDavid du Colombier 
1854f8f669cSDavid du Colombier 	if((e = convM2DNS(m->ps, m->pe-m->ps, &dm, nil)) != nil){
186b4b9fc2fSDavid du Colombier 		m->p = seprint(m->p, m->e, "error: %s", e);
187b4b9fc2fSDavid du Colombier 		return 0;
188b4b9fc2fSDavid du Colombier 	}
189b4b9fc2fSDavid du Colombier 	m->p = seprint(m->p, m->e, "id=%d flags=%#ux", dm.id, dm.flags);
190b4b9fc2fSDavid du Colombier 	donext(m);
191b4b9fc2fSDavid du Colombier 	return 0;
192b4b9fc2fSDavid du Colombier }
193b4b9fc2fSDavid du Colombier 
194b4b9fc2fSDavid du Colombier static void
donext(Msg * m)195b4b9fc2fSDavid du Colombier donext(Msg *m)
196b4b9fc2fSDavid du Colombier {
197b4b9fc2fSDavid du Colombier 	if(dm.qd)
198b4b9fc2fSDavid du Colombier 		m->pr = &dnsqd;
199b4b9fc2fSDavid du Colombier 	else if(dm.an)
200b4b9fc2fSDavid du Colombier 		m->pr = &dnsan;
201b4b9fc2fSDavid du Colombier 	else if(dm.ns)
202b4b9fc2fSDavid du Colombier 		m->pr = &dnsns;
203b4b9fc2fSDavid du Colombier 	else if(dm.ar)
204b4b9fc2fSDavid du Colombier 		m->pr = &dnsar;
205b4b9fc2fSDavid du Colombier 	else{
206b4b9fc2fSDavid du Colombier 		freealldn();
207b4b9fc2fSDavid du Colombier 		memset(&dm, 0, sizeof dm);
208b4b9fc2fSDavid du Colombier 		m->pr = nil;
209b4b9fc2fSDavid du Colombier 	}
210b4b9fc2fSDavid du Colombier }
211b4b9fc2fSDavid du Colombier 
212b4b9fc2fSDavid du Colombier static int
p_seprintqd(Msg * m)213b4b9fc2fSDavid du Colombier p_seprintqd(Msg *m)
214b4b9fc2fSDavid du Colombier {
215b4b9fc2fSDavid du Colombier 	fmtrr(m, &dm.qd, 1);
216b4b9fc2fSDavid du Colombier 	donext(m);
217b4b9fc2fSDavid du Colombier 	return 0;
218b4b9fc2fSDavid du Colombier }
219b4b9fc2fSDavid du Colombier 
220b4b9fc2fSDavid du Colombier static int
p_seprintan(Msg * m)221b4b9fc2fSDavid du Colombier p_seprintan(Msg *m)
222b4b9fc2fSDavid du Colombier {
223b4b9fc2fSDavid du Colombier 	fmtrr(m, &dm.an, 0);
224b4b9fc2fSDavid du Colombier 	donext(m);
225b4b9fc2fSDavid du Colombier 	return 0;
226b4b9fc2fSDavid du Colombier }
227b4b9fc2fSDavid du Colombier 
228b4b9fc2fSDavid du Colombier static int
p_seprintns(Msg * m)229b4b9fc2fSDavid du Colombier p_seprintns(Msg *m)
230b4b9fc2fSDavid du Colombier {
231b4b9fc2fSDavid du Colombier 	fmtrr(m, &dm.ns, 1);
232b4b9fc2fSDavid du Colombier 	donext(m);
233b4b9fc2fSDavid du Colombier 	return 0;
234b4b9fc2fSDavid du Colombier }
235b4b9fc2fSDavid du Colombier 
236b4b9fc2fSDavid du Colombier static int
p_seprintar(Msg * m)237b4b9fc2fSDavid du Colombier p_seprintar(Msg *m)
238b4b9fc2fSDavid du Colombier {
239b4b9fc2fSDavid du Colombier 	fmtrr(m, &dm.ar, 1);
240b4b9fc2fSDavid du Colombier 	donext(m);
241b4b9fc2fSDavid du Colombier 	return 0;
242b4b9fc2fSDavid du Colombier }
243b4b9fc2fSDavid du Colombier 
244b4b9fc2fSDavid du Colombier Proto dns =
245b4b9fc2fSDavid du Colombier {
246b4b9fc2fSDavid du Colombier 	"dns",
247b4b9fc2fSDavid du Colombier 	nil,
248b4b9fc2fSDavid du Colombier 	nil,
249b4b9fc2fSDavid du Colombier 	p_seprint,
250b4b9fc2fSDavid du Colombier 	nil,
251b4b9fc2fSDavid du Colombier 	nil,
252b4b9fc2fSDavid du Colombier 	nil,
253b4b9fc2fSDavid du Colombier 	defaultframer,
254b4b9fc2fSDavid du Colombier };
255b4b9fc2fSDavid du Colombier 
256b4b9fc2fSDavid du Colombier static Proto dnsqd =
257b4b9fc2fSDavid du Colombier {
258b4b9fc2fSDavid du Colombier 	"dns.qd",
259b4b9fc2fSDavid du Colombier 	nil,
260b4b9fc2fSDavid du Colombier 	nil,
261b4b9fc2fSDavid du Colombier 	p_seprintqd,
262b4b9fc2fSDavid du Colombier 	nil,
263b4b9fc2fSDavid du Colombier 	nil,
264b4b9fc2fSDavid du Colombier 	nil,
265b4b9fc2fSDavid du Colombier 	defaultframer,
266b4b9fc2fSDavid du Colombier };
267b4b9fc2fSDavid du Colombier 
268b4b9fc2fSDavid du Colombier static Proto dnsan =
269b4b9fc2fSDavid du Colombier {
270b4b9fc2fSDavid du Colombier 	"dns.an",
271b4b9fc2fSDavid du Colombier 	nil,
272b4b9fc2fSDavid du Colombier 	nil,
273b4b9fc2fSDavid du Colombier 	p_seprintan,
274b4b9fc2fSDavid du Colombier 	nil,
275b4b9fc2fSDavid du Colombier 	nil,
276b4b9fc2fSDavid du Colombier 	nil,
277b4b9fc2fSDavid du Colombier 	defaultframer,
278b4b9fc2fSDavid du Colombier };
279b4b9fc2fSDavid du Colombier 
280b4b9fc2fSDavid du Colombier static Proto dnsns =
281b4b9fc2fSDavid du Colombier {
282b4b9fc2fSDavid du Colombier 	"dns.ns",
283b4b9fc2fSDavid du Colombier 	nil,
284b4b9fc2fSDavid du Colombier 	nil,
285b4b9fc2fSDavid du Colombier 	p_seprintns,
286b4b9fc2fSDavid du Colombier 	nil,
287b4b9fc2fSDavid du Colombier 	nil,
288b4b9fc2fSDavid du Colombier 	nil,
289b4b9fc2fSDavid du Colombier 	defaultframer,
290b4b9fc2fSDavid du Colombier };
291b4b9fc2fSDavid du Colombier 
292b4b9fc2fSDavid du Colombier static Proto dnsar =
293b4b9fc2fSDavid du Colombier {
294b4b9fc2fSDavid du Colombier 	"dns.ar",
295b4b9fc2fSDavid du Colombier 	nil,
296b4b9fc2fSDavid du Colombier 	nil,
297b4b9fc2fSDavid du Colombier 	p_seprintar,
298b4b9fc2fSDavid du Colombier 	nil,
299b4b9fc2fSDavid du Colombier 	nil,
300b4b9fc2fSDavid du Colombier 	nil,
301b4b9fc2fSDavid du Colombier 	defaultframer,
302b4b9fc2fSDavid du Colombier };
303b4b9fc2fSDavid du Colombier 
304b4b9fc2fSDavid du Colombier 
305b4b9fc2fSDavid du Colombier void*
emalloc(int n)306b4b9fc2fSDavid du Colombier emalloc(int n)
307b4b9fc2fSDavid du Colombier {
308b4b9fc2fSDavid du Colombier 	void *v;
309b4b9fc2fSDavid du Colombier 
310b4b9fc2fSDavid du Colombier 	v = mallocz(n, 1);
311b4b9fc2fSDavid du Colombier 	if(v == nil)
312b4b9fc2fSDavid du Colombier 		sysfatal("out of memory");
313b4b9fc2fSDavid du Colombier 	return v;
314b4b9fc2fSDavid du Colombier }
315b4b9fc2fSDavid du Colombier 
316b4b9fc2fSDavid du Colombier char*
estrdup(char * s)317b4b9fc2fSDavid du Colombier estrdup(char *s)
318b4b9fc2fSDavid du Colombier {
319b4b9fc2fSDavid du Colombier 	s = strdup(s);
320b4b9fc2fSDavid du Colombier 	if(s == nil)
321b4b9fc2fSDavid du Colombier 		sysfatal("out of memory");
322b4b9fc2fSDavid du Colombier 	return s;
323b4b9fc2fSDavid du Colombier }
324b4b9fc2fSDavid du Colombier 
325b4b9fc2fSDavid du Colombier DN *alldn;
326b4b9fc2fSDavid du Colombier 
327b4b9fc2fSDavid du Colombier DN*
dnlookup(char * name,int class,int)328b4b9fc2fSDavid du Colombier dnlookup(char *name, int class, int)
329b4b9fc2fSDavid du Colombier {
330b4b9fc2fSDavid du Colombier 	DN *dn;
331b4b9fc2fSDavid du Colombier 
332b4b9fc2fSDavid du Colombier 	dn = emalloc(sizeof *dn);
333b4b9fc2fSDavid du Colombier 	dn->name = estrdup(name);
334b4b9fc2fSDavid du Colombier 	dn->class = class;
335b4b9fc2fSDavid du Colombier 	dn->magic = DNmagic;
336b4b9fc2fSDavid du Colombier 	dn->next = alldn;
337b4b9fc2fSDavid du Colombier 	alldn = dn;
338b4b9fc2fSDavid du Colombier 	return dn;
339b4b9fc2fSDavid du Colombier }
340b4b9fc2fSDavid du Colombier 
341b4b9fc2fSDavid du Colombier void
freealldn(void)342b4b9fc2fSDavid du Colombier freealldn(void)
343b4b9fc2fSDavid du Colombier {
344b4b9fc2fSDavid du Colombier 	DN *dn;
345b4b9fc2fSDavid du Colombier 
346b4b9fc2fSDavid du Colombier 	while(dn = alldn){
347b4b9fc2fSDavid du Colombier 		alldn = dn->next;
348b4b9fc2fSDavid du Colombier 		free(dn->name);
349b4b9fc2fSDavid du Colombier 		free(dn);
350b4b9fc2fSDavid du Colombier 	}
351b4b9fc2fSDavid du Colombier }
352b4b9fc2fSDavid du Colombier 
353*b1c161c2SDavid du Colombier int debug;				/* for ndb/dns.h */
3544f8f669cSDavid du Colombier ulong now = 0;
3554f8f669cSDavid du Colombier 
3564f8f669cSDavid du Colombier void
dnslog(char * fmt,...)3574f8f669cSDavid du Colombier dnslog(char *fmt, ...)			/* don't log */
3584f8f669cSDavid du Colombier {
3594f8f669cSDavid du Colombier 	USED(fmt);
3604f8f669cSDavid du Colombier }
361b4b9fc2fSDavid du Colombier 
362b4b9fc2fSDavid du Colombier /*************************************************
363b751ae26SDavid du Colombier  * Everything below here is copied from /sys/src/cmd/ndb/dn.c
3644f8f669cSDavid du Colombier  * without modification and can be recopied to update.
365b4b9fc2fSDavid du Colombier  */
366b4b9fc2fSDavid du Colombier 
367b4b9fc2fSDavid du Colombier /*
3684f8f669cSDavid du Colombier  *  convert an integer RR type to it's ascii name
3694f8f669cSDavid du Colombier  */
3704f8f669cSDavid du Colombier char*
rrname(int type,char * buf,int len)3714f8f669cSDavid du Colombier rrname(int type, char *buf, int len)
3724f8f669cSDavid du Colombier {
3734f8f669cSDavid du Colombier 	char *t;
3744f8f669cSDavid du Colombier 
3754f8f669cSDavid du Colombier 	t = nil;
3764f8f669cSDavid du Colombier 	if(type >= 0 && type <= Tall)
3774f8f669cSDavid du Colombier 		t = rrtname[type];
3784f8f669cSDavid du Colombier 	if(t==nil){
3794f8f669cSDavid du Colombier 		snprint(buf, len, "%d", type);
3804f8f669cSDavid du Colombier 		t = buf;
3814f8f669cSDavid du Colombier 	}
3824f8f669cSDavid du Colombier 	return t;
3834f8f669cSDavid du Colombier }
3844f8f669cSDavid du Colombier 
3854f8f669cSDavid du Colombier /*
386b4b9fc2fSDavid du Colombier  *  free a list of resource records and any related structs
387b4b9fc2fSDavid du Colombier  */
388b4b9fc2fSDavid du Colombier void
rrfreelist(RR * rp)389b4b9fc2fSDavid du Colombier rrfreelist(RR *rp)
390b4b9fc2fSDavid du Colombier {
391b4b9fc2fSDavid du Colombier 	RR *next;
392b4b9fc2fSDavid du Colombier 
393b4b9fc2fSDavid du Colombier 	for(; rp; rp = next){
394b4b9fc2fSDavid du Colombier 		next = rp->next;
395b4b9fc2fSDavid du Colombier 		rrfree(rp);
396b4b9fc2fSDavid du Colombier 	}
397b4b9fc2fSDavid du Colombier }
398b751ae26SDavid du Colombier 
399b4b9fc2fSDavid du Colombier void
freeserverlist(Server * s)400b4b9fc2fSDavid du Colombier freeserverlist(Server *s)
401b4b9fc2fSDavid du Colombier {
402b4b9fc2fSDavid du Colombier 	Server *next;
403b4b9fc2fSDavid du Colombier 
404b4b9fc2fSDavid du Colombier 	for(; s != nil; s = next){
405b4b9fc2fSDavid du Colombier 		next = s->next;
406b4b9fc2fSDavid du Colombier 		free(s);
407b4b9fc2fSDavid du Colombier 	}
408b4b9fc2fSDavid du Colombier }
409b4b9fc2fSDavid du Colombier 
410b4b9fc2fSDavid du Colombier /*
411b4b9fc2fSDavid du Colombier  *  allocate a resource record of a given type
412b4b9fc2fSDavid du Colombier  */
413b4b9fc2fSDavid du Colombier RR*
rralloc(int type)414b4b9fc2fSDavid du Colombier rralloc(int type)
415b4b9fc2fSDavid du Colombier {
416b4b9fc2fSDavid du Colombier 	RR *rp;
417b4b9fc2fSDavid du Colombier 
418b4b9fc2fSDavid du Colombier 	rp = emalloc(sizeof(*rp));
419b4b9fc2fSDavid du Colombier 	rp->magic = RRmagic;
420b4b9fc2fSDavid du Colombier 	rp->pc = getcallerpc(&type);
421b4b9fc2fSDavid du Colombier 	rp->type = type;
422b751ae26SDavid du Colombier 	setmalloctag(rp, rp->pc);
423b4b9fc2fSDavid du Colombier 	switch(type){
424b4b9fc2fSDavid du Colombier 	case Tsoa:
425b4b9fc2fSDavid du Colombier 		rp->soa = emalloc(sizeof(*rp->soa));
426b4b9fc2fSDavid du Colombier 		rp->soa->slaves = nil;
427b751ae26SDavid du Colombier 		setmalloctag(rp->soa, rp->pc);
428b751ae26SDavid du Colombier 		break;
429b751ae26SDavid du Colombier 	case Tsrv:
430b751ae26SDavid du Colombier 		rp->srv = emalloc(sizeof(*rp->srv));
431b751ae26SDavid du Colombier 		setmalloctag(rp->srv, rp->pc);
432b4b9fc2fSDavid du Colombier 		break;
433b4b9fc2fSDavid du Colombier 	case Tkey:
434b4b9fc2fSDavid du Colombier 		rp->key = emalloc(sizeof(*rp->key));
435b751ae26SDavid du Colombier 		setmalloctag(rp->key, rp->pc);
436b4b9fc2fSDavid du Colombier 		break;
437b4b9fc2fSDavid du Colombier 	case Tcert:
438b4b9fc2fSDavid du Colombier 		rp->cert = emalloc(sizeof(*rp->cert));
439b751ae26SDavid du Colombier 		setmalloctag(rp->cert, rp->pc);
440b4b9fc2fSDavid du Colombier 		break;
441b4b9fc2fSDavid du Colombier 	case Tsig:
442b4b9fc2fSDavid du Colombier 		rp->sig = emalloc(sizeof(*rp->sig));
443b751ae26SDavid du Colombier 		setmalloctag(rp->sig, rp->pc);
444b4b9fc2fSDavid du Colombier 		break;
445b4b9fc2fSDavid du Colombier 	case Tnull:
446b4b9fc2fSDavid du Colombier 		rp->null = emalloc(sizeof(*rp->null));
447b751ae26SDavid du Colombier 		setmalloctag(rp->null, rp->pc);
448b4b9fc2fSDavid du Colombier 		break;
449b4b9fc2fSDavid du Colombier 	}
450b4b9fc2fSDavid du Colombier 	rp->ttl = 0;
451b4b9fc2fSDavid du Colombier 	rp->expire = 0;
452b4b9fc2fSDavid du Colombier 	rp->next = 0;
453b4b9fc2fSDavid du Colombier 	return rp;
454b4b9fc2fSDavid du Colombier }
455b4b9fc2fSDavid du Colombier 
456b4b9fc2fSDavid du Colombier /*
457b4b9fc2fSDavid du Colombier  *  free a resource record and any related structs
458b4b9fc2fSDavid du Colombier  */
459b4b9fc2fSDavid du Colombier void
rrfree(RR * rp)460b4b9fc2fSDavid du Colombier rrfree(RR *rp)
461b4b9fc2fSDavid du Colombier {
462b4b9fc2fSDavid du Colombier 	DN *dp;
463b4b9fc2fSDavid du Colombier 	RR *nrp;
464b4b9fc2fSDavid du Colombier 	Txt *t;
465b4b9fc2fSDavid du Colombier 
466b4b9fc2fSDavid du Colombier 	assert(rp->magic = RRmagic);
467b4b9fc2fSDavid du Colombier 	assert(!rp->cached);
468b4b9fc2fSDavid du Colombier 
469b4b9fc2fSDavid du Colombier 	dp = rp->owner;
470b4b9fc2fSDavid du Colombier 	if(dp){
471b4b9fc2fSDavid du Colombier 		assert(dp->magic == DNmagic);
472b4b9fc2fSDavid du Colombier 		for(nrp = dp->rr; nrp; nrp = nrp->next)
473b751ae26SDavid du Colombier 			assert(nrp != rp);	/* "rrfree of live rr" */
474b4b9fc2fSDavid du Colombier 	}
475b4b9fc2fSDavid du Colombier 
476b4b9fc2fSDavid du Colombier 	switch(rp->type){
477b4b9fc2fSDavid du Colombier 	case Tsoa:
478b4b9fc2fSDavid du Colombier 		freeserverlist(rp->soa->slaves);
479b751ae26SDavid du Colombier 		memset(rp->soa, 0, sizeof *rp->soa);	/* cause trouble */
480b4b9fc2fSDavid du Colombier 		free(rp->soa);
481b4b9fc2fSDavid du Colombier 		break;
482b751ae26SDavid du Colombier 	case Tsrv:
483b751ae26SDavid du Colombier 		memset(rp->srv, 0, sizeof *rp->srv);	/* cause trouble */
484b751ae26SDavid du Colombier 		free(rp->srv);
485b751ae26SDavid du Colombier 		break;
486b4b9fc2fSDavid du Colombier 	case Tkey:
487b4b9fc2fSDavid du Colombier 		free(rp->key->data);
488b751ae26SDavid du Colombier 		memset(rp->key, 0, sizeof *rp->key);	/* cause trouble */
489b4b9fc2fSDavid du Colombier 		free(rp->key);
490b4b9fc2fSDavid du Colombier 		break;
491b4b9fc2fSDavid du Colombier 	case Tcert:
492b4b9fc2fSDavid du Colombier 		free(rp->cert->data);
493b751ae26SDavid du Colombier 		memset(rp->cert, 0, sizeof *rp->cert);	/* cause trouble */
494b4b9fc2fSDavid du Colombier 		free(rp->cert);
495b4b9fc2fSDavid du Colombier 		break;
496b4b9fc2fSDavid du Colombier 	case Tsig:
497b4b9fc2fSDavid du Colombier 		free(rp->sig->data);
498b751ae26SDavid du Colombier 		memset(rp->sig, 0, sizeof *rp->sig);	/* cause trouble */
499b4b9fc2fSDavid du Colombier 		free(rp->sig);
500b4b9fc2fSDavid du Colombier 		break;
501b4b9fc2fSDavid du Colombier 	case Tnull:
502b4b9fc2fSDavid du Colombier 		free(rp->null->data);
503b751ae26SDavid du Colombier 		memset(rp->null, 0, sizeof *rp->null);	/* cause trouble */
504b4b9fc2fSDavid du Colombier 		free(rp->null);
505b4b9fc2fSDavid du Colombier 		break;
506b4b9fc2fSDavid du Colombier 	case Ttxt:
507b4b9fc2fSDavid du Colombier 		while(rp->txt != nil){
508b4b9fc2fSDavid du Colombier 			t = rp->txt;
509b4b9fc2fSDavid du Colombier 			rp->txt = t->next;
510b4b9fc2fSDavid du Colombier 			free(t->p);
511b751ae26SDavid du Colombier 			memset(t, 0, sizeof *t);	/* cause trouble */
512b4b9fc2fSDavid du Colombier 			free(t);
513b4b9fc2fSDavid du Colombier 		}
514b4b9fc2fSDavid du Colombier 		break;
515b4b9fc2fSDavid du Colombier 	}
516b4b9fc2fSDavid du Colombier 
517b4b9fc2fSDavid du Colombier 	rp->magic = ~rp->magic;
518b751ae26SDavid du Colombier 	memset(rp, 0, sizeof *rp);		/* cause trouble */
519b4b9fc2fSDavid du Colombier 	free(rp);
520b4b9fc2fSDavid du Colombier }
521