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