Blame


1 bc5d5771 2006-01-27 devnull #include <u.h>
2 bc5d5771 2006-01-27 devnull #include <netinet/in.h>
3 bc5d5771 2006-01-27 devnull #include <arpa/nameser.h>
4 bc5d5771 2006-01-27 devnull #include <resolv.h>
5 bc5d5771 2006-01-27 devnull #include <netdb.h>
6 bc5d5771 2006-01-27 devnull #include <libc.h>
7 bc5d5771 2006-01-27 devnull #include <ip.h>
8 bc5d5771 2006-01-27 devnull #include <bio.h>
9 bc5d5771 2006-01-27 devnull #include <ndb.h>
10 bc5d5771 2006-01-27 devnull #include "ndbhf.h"
11 bc5d5771 2006-01-27 devnull
12 bc5d5771 2006-01-27 devnull static void nstrcpy(char*, char*, int);
13 bc5d5771 2006-01-27 devnull static void mkptrname(char*, char*, int);
14 bc5d5771 2006-01-27 devnull static Ndbtuple *doquery(char*, char*);
15 bc5d5771 2006-01-27 devnull
16 bc5d5771 2006-01-27 devnull /*
17 bc5d5771 2006-01-27 devnull * Run a DNS lookup for val/type on net.
18 bc5d5771 2006-01-27 devnull */
19 bc5d5771 2006-01-27 devnull Ndbtuple*
20 bc5d5771 2006-01-27 devnull dnsquery(char *net, char *val, char *type)
21 bc5d5771 2006-01-27 devnull {
22 bc5d5771 2006-01-27 devnull static int init;
23 bc5d5771 2006-01-27 devnull char rip[128];
24 bc5d5771 2006-01-27 devnull Ndbtuple *t;
25 bc5d5771 2006-01-27 devnull
26 bc5d5771 2006-01-27 devnull USED(net);
27 bc5d5771 2006-01-27 devnull
28 bc5d5771 2006-01-27 devnull if(!init){
29 bc5d5771 2006-01-27 devnull init = 1;
30 bc5d5771 2006-01-27 devnull fmtinstall('I', eipfmt);
31 bc5d5771 2006-01-27 devnull }
32 bc5d5771 2006-01-27 devnull /* give up early on stupid questions - vwhois */
33 bc5d5771 2006-01-27 devnull if(strcmp(val, "::") == 0 || strcmp(val, "0.0.0.0") == 0)
34 bc5d5771 2006-01-27 devnull return nil;
35 bc5d5771 2006-01-27 devnull
36 bc5d5771 2006-01-27 devnull /* zero out the error string */
37 bc5d5771 2006-01-27 devnull werrstr("");
38 bc5d5771 2006-01-27 devnull
39 bc5d5771 2006-01-27 devnull /* if this is a reverse lookup, first look up the domain name */
40 bc5d5771 2006-01-27 devnull if(strcmp(type, "ptr") == 0){
41 bc5d5771 2006-01-27 devnull mkptrname(val, rip, sizeof rip);
42 bc5d5771 2006-01-27 devnull t = doquery(rip, "ptr");
43 bc5d5771 2006-01-27 devnull }else
44 bc5d5771 2006-01-27 devnull t = doquery(val, type);
45 bc5d5771 2006-01-27 devnull
46 bc5d5771 2006-01-27 devnull return t;
47 bc5d5771 2006-01-27 devnull }
48 bc5d5771 2006-01-27 devnull
49 bc5d5771 2006-01-27 devnull /*
50 bc5d5771 2006-01-27 devnull * convert address into a reverse lookup address
51 bc5d5771 2006-01-27 devnull */
52 bc5d5771 2006-01-27 devnull static void
53 bc5d5771 2006-01-27 devnull mkptrname(char *ip, char *rip, int rlen)
54 bc5d5771 2006-01-27 devnull {
55 bc5d5771 2006-01-27 devnull char buf[128];
56 bc5d5771 2006-01-27 devnull char *p, *np;
57 bc5d5771 2006-01-27 devnull int len;
58 bc5d5771 2006-01-27 devnull
59 bc5d5771 2006-01-27 devnull if(strstr(ip, "in-addr.arpa") || strstr(ip, "IN-ADDR.ARPA")){
60 bc5d5771 2006-01-27 devnull nstrcpy(rip, ip, rlen);
61 bc5d5771 2006-01-27 devnull return;
62 bc5d5771 2006-01-27 devnull }
63 bc5d5771 2006-01-27 devnull
64 bc5d5771 2006-01-27 devnull nstrcpy(buf, ip, sizeof buf);
65 bc5d5771 2006-01-27 devnull for(p = buf; *p; p++)
66 bc5d5771 2006-01-27 devnull ;
67 bc5d5771 2006-01-27 devnull *p = '.';
68 bc5d5771 2006-01-27 devnull np = rip;
69 bc5d5771 2006-01-27 devnull len = 0;
70 bc5d5771 2006-01-27 devnull while(p >= buf){
71 bc5d5771 2006-01-27 devnull len++;
72 bc5d5771 2006-01-27 devnull p--;
73 bc5d5771 2006-01-27 devnull if(*p == '.'){
74 bc5d5771 2006-01-27 devnull memmove(np, p+1, len);
75 bc5d5771 2006-01-27 devnull np += len;
76 bc5d5771 2006-01-27 devnull len = 0;
77 bc5d5771 2006-01-27 devnull }
78 bc5d5771 2006-01-27 devnull }
79 bc5d5771 2006-01-27 devnull memmove(np, p+1, len);
80 bc5d5771 2006-01-27 devnull np += len;
81 bc5d5771 2006-01-27 devnull strcpy(np, "in-addr.arpa");
82 bc5d5771 2006-01-27 devnull }
83 bc5d5771 2006-01-27 devnull
84 bc5d5771 2006-01-27 devnull static void
85 bc5d5771 2006-01-27 devnull nstrcpy(char *to, char *from, int len)
86 bc5d5771 2006-01-27 devnull {
87 bc5d5771 2006-01-27 devnull strncpy(to, from, len);
88 bc5d5771 2006-01-27 devnull to[len-1] = 0;
89 bc5d5771 2006-01-27 devnull }
90 bc5d5771 2006-01-27 devnull
91 bc5d5771 2006-01-27 devnull /*
92 bc5d5771 2006-01-27 devnull * Disgusting, ugly interface to libresolv,
93 bc5d5771 2006-01-27 devnull * which everyone seems to have.
94 bc5d5771 2006-01-27 devnull */
95 bc5d5771 2006-01-27 devnull enum
96 bc5d5771 2006-01-27 devnull {
97 bc5d5771 2006-01-27 devnull MAXRR = 100,
98 bc5d5771 2006-01-27 devnull MAXDNS = 4096,
99 18d5a36a 2006-01-27 devnull
100 18d5a36a 2006-01-27 devnull /* RR types */
101 18d5a36a 2006-01-27 devnull Ta= 1,
102 18d5a36a 2006-01-27 devnull Tns= 2,
103 18d5a36a 2006-01-27 devnull Tmd= 3,
104 18d5a36a 2006-01-27 devnull Tmf= 4,
105 18d5a36a 2006-01-27 devnull Tcname= 5,
106 18d5a36a 2006-01-27 devnull Tsoa= 6,
107 18d5a36a 2006-01-27 devnull Tmb= 7,
108 18d5a36a 2006-01-27 devnull Tmg= 8,
109 18d5a36a 2006-01-27 devnull Tmr= 9,
110 18d5a36a 2006-01-27 devnull Tnull= 10,
111 18d5a36a 2006-01-27 devnull Twks= 11,
112 18d5a36a 2006-01-27 devnull Tptr= 12,
113 18d5a36a 2006-01-27 devnull Thinfo= 13,
114 18d5a36a 2006-01-27 devnull Tminfo= 14,
115 18d5a36a 2006-01-27 devnull Tmx= 15,
116 18d5a36a 2006-01-27 devnull Ttxt= 16,
117 18d5a36a 2006-01-27 devnull Trp= 17,
118 18d5a36a 2006-01-27 devnull Tsig= 24,
119 18d5a36a 2006-01-27 devnull Tkey= 25,
120 18d5a36a 2006-01-27 devnull Taaaa= 28,
121 18d5a36a 2006-01-27 devnull Tcert= 37,
122 18d5a36a 2006-01-27 devnull
123 18d5a36a 2006-01-27 devnull /* query types (all RR types are also queries) */
124 18d5a36a 2006-01-27 devnull Tixfr= 251, /* incremental zone transfer */
125 18d5a36a 2006-01-27 devnull Taxfr= 252, /* zone transfer */
126 18d5a36a 2006-01-27 devnull Tmailb= 253, /* { Tmb, Tmg, Tmr } */
127 18d5a36a 2006-01-27 devnull Tall= 255, /* all records */
128 18d5a36a 2006-01-27 devnull
129 18d5a36a 2006-01-27 devnull /* classes */
130 18d5a36a 2006-01-27 devnull Csym= 0, /* internal symbols */
131 18d5a36a 2006-01-27 devnull Cin= 1, /* internet */
132 18d5a36a 2006-01-27 devnull Ccs, /* CSNET (obsolete) */
133 18d5a36a 2006-01-27 devnull Cch, /* Chaos net */
134 18d5a36a 2006-01-27 devnull Chs, /* Hesiod (?) */
135 18d5a36a 2006-01-27 devnull
136 18d5a36a 2006-01-27 devnull /* class queries (all class types are also queries) */
137 18d5a36a 2006-01-27 devnull Call= 255, /* all classes */
138 18d5a36a 2006-01-27 devnull
139 bc5d5771 2006-01-27 devnull };
140 bc5d5771 2006-01-27 devnull
141 18d5a36a 2006-01-27 devnull
142 bc5d5771 2006-01-27 devnull static int name2type(char*);
143 bc5d5771 2006-01-27 devnull static uchar *skipquestion(uchar*, uchar*, uchar*, int);
144 bc5d5771 2006-01-27 devnull static uchar *unpack(uchar*, uchar*, uchar*, Ndbtuple**, int);
145 bc5d5771 2006-01-27 devnull static uchar *rrnext(uchar*, uchar*, uchar*, Ndbtuple**);
146 bc5d5771 2006-01-27 devnull static Ndbtuple *rrunpack(uchar*, uchar*, uchar**, char*, ...);
147 bc5d5771 2006-01-27 devnull
148 bc5d5771 2006-01-27 devnull static Ndbtuple*
149 bc5d5771 2006-01-27 devnull doquery(char *name, char *type)
150 bc5d5771 2006-01-27 devnull {
151 bc5d5771 2006-01-27 devnull int n, nstype;
152 bc5d5771 2006-01-27 devnull uchar *buf, *p;
153 bc5d5771 2006-01-27 devnull Ndbtuple *t;
154 a7c0bddd 2006-01-29 devnull int qdcount, ancount;
155 bc5d5771 2006-01-27 devnull
156 bc5d5771 2006-01-27 devnull if((nstype = name2type(type)) < 0){
157 bc5d5771 2006-01-27 devnull werrstr("unknown dns type %s", type);
158 bc5d5771 2006-01-27 devnull return nil;
159 bc5d5771 2006-01-27 devnull }
160 bc5d5771 2006-01-27 devnull
161 bc5d5771 2006-01-27 devnull buf = malloc(MAXDNS);
162 bc5d5771 2006-01-27 devnull if(buf == nil)
163 bc5d5771 2006-01-27 devnull return nil;
164 bc5d5771 2006-01-27 devnull
165 18d5a36a 2006-01-27 devnull if((n = res_search(name, Cin, nstype, buf, MAXDNS)) < 0){
166 bc5d5771 2006-01-27 devnull free(buf);
167 bc5d5771 2006-01-27 devnull return nil;
168 bc5d5771 2006-01-27 devnull }
169 bc5d5771 2006-01-27 devnull if(n >= MAXDNS){
170 bc5d5771 2006-01-27 devnull free(buf);
171 bc5d5771 2006-01-27 devnull werrstr("too much dns information");
172 bc5d5771 2006-01-27 devnull return nil;
173 bc5d5771 2006-01-27 devnull }
174 a7c0bddd 2006-01-29 devnull
175 a7c0bddd 2006-01-29 devnull qdcount = (buf[4]<<8)|buf[5];
176 a7c0bddd 2006-01-29 devnull ancount = (buf[6]<<8)|buf[7];
177 bc5d5771 2006-01-27 devnull
178 a7c0bddd 2006-01-29 devnull p = buf+12;
179 a7c0bddd 2006-01-29 devnull p = skipquestion(buf, buf+n, p, qdcount);
180 a7c0bddd 2006-01-29 devnull p = unpack(buf, buf+n, p, &t, ancount);
181 bc5d5771 2006-01-27 devnull USED(p);
182 bc5d5771 2006-01-27 devnull return t;
183 bc5d5771 2006-01-27 devnull }
184 60218587 2006-01-27 devnull
185 bc5d5771 2006-01-27 devnull static struct {
186 bc5d5771 2006-01-27 devnull char *s;
187 bc5d5771 2006-01-27 devnull int t;
188 bc5d5771 2006-01-27 devnull } dnsnames[] =
189 bc5d5771 2006-01-27 devnull {
190 60218587 2006-01-27 devnull "ip", Ta,
191 60218587 2006-01-27 devnull "ns", Tns,
192 60218587 2006-01-27 devnull "md", Tmd,
193 60218587 2006-01-27 devnull "mf", Tmf,
194 60218587 2006-01-27 devnull "cname", Tcname,
195 60218587 2006-01-27 devnull "soa", Tsoa,
196 60218587 2006-01-27 devnull "mb", Tmb,
197 60218587 2006-01-27 devnull "mg", Tmg,
198 60218587 2006-01-27 devnull "mr", Tmr,
199 60218587 2006-01-27 devnull "null", Tnull,
200 60218587 2006-01-27 devnull "ptr", Tptr,
201 60218587 2006-01-27 devnull "hinfo", Thinfo,
202 60218587 2006-01-27 devnull "minfo", Tminfo,
203 60218587 2006-01-27 devnull "mx", Tmx,
204 60218587 2006-01-27 devnull "txt", Ttxt,
205 60218587 2006-01-27 devnull "rp", Trp,
206 60218587 2006-01-27 devnull "key", Tkey,
207 60218587 2006-01-27 devnull "cert", Tcert,
208 60218587 2006-01-27 devnull "sig", Tsig,
209 60218587 2006-01-27 devnull "aaaa", Taaaa,
210 60218587 2006-01-27 devnull "ixfr", Tixfr,
211 60218587 2006-01-27 devnull "axfr", Taxfr,
212 60218587 2006-01-27 devnull "all", Call,
213 bc5d5771 2006-01-27 devnull };
214 bc5d5771 2006-01-27 devnull
215 bc5d5771 2006-01-27 devnull static char*
216 bc5d5771 2006-01-27 devnull type2name(int t)
217 bc5d5771 2006-01-27 devnull {
218 bc5d5771 2006-01-27 devnull int i;
219 bc5d5771 2006-01-27 devnull
220 bc5d5771 2006-01-27 devnull for(i=0; i<nelem(dnsnames); i++)
221 bc5d5771 2006-01-27 devnull if(dnsnames[i].t == t)
222 bc5d5771 2006-01-27 devnull return dnsnames[i].s;
223 bc5d5771 2006-01-27 devnull return nil;
224 bc5d5771 2006-01-27 devnull }
225 bc5d5771 2006-01-27 devnull
226 bc5d5771 2006-01-27 devnull static int
227 bc5d5771 2006-01-27 devnull name2type(char *name)
228 bc5d5771 2006-01-27 devnull {
229 bc5d5771 2006-01-27 devnull int i;
230 bc5d5771 2006-01-27 devnull
231 bc5d5771 2006-01-27 devnull for(i=0; i<nelem(dnsnames); i++)
232 bc5d5771 2006-01-27 devnull if(strcmp(name, dnsnames[i].s) == 0)
233 bc5d5771 2006-01-27 devnull return dnsnames[i].t;
234 bc5d5771 2006-01-27 devnull return -1;
235 bc5d5771 2006-01-27 devnull }
236 bc5d5771 2006-01-27 devnull
237 bc5d5771 2006-01-27 devnull static uchar*
238 bc5d5771 2006-01-27 devnull skipquestion(uchar *buf, uchar *ebuf, uchar *p, int n)
239 bc5d5771 2006-01-27 devnull {
240 bc5d5771 2006-01-27 devnull int i, len;
241 bc5d5771 2006-01-27 devnull char tmp[100];
242 bc5d5771 2006-01-27 devnull
243 bc5d5771 2006-01-27 devnull for(i=0; i<n; i++){
244 bc5d5771 2006-01-27 devnull if((len = dn_expand(buf, ebuf, p, tmp, sizeof tmp)) <= 0)
245 bc5d5771 2006-01-27 devnull return nil;
246 da20ccc7 2006-01-27 devnull p += 4+len;
247 bc5d5771 2006-01-27 devnull }
248 bc5d5771 2006-01-27 devnull return p;
249 bc5d5771 2006-01-27 devnull }
250 bc5d5771 2006-01-27 devnull
251 bc5d5771 2006-01-27 devnull static uchar*
252 bc5d5771 2006-01-27 devnull unpack(uchar *buf, uchar *ebuf, uchar *p, Ndbtuple **tt, int n)
253 bc5d5771 2006-01-27 devnull {
254 bc5d5771 2006-01-27 devnull int i;
255 bc5d5771 2006-01-27 devnull Ndbtuple *first, *last, *t;
256 bc5d5771 2006-01-27 devnull
257 bc5d5771 2006-01-27 devnull *tt = nil;
258 bc5d5771 2006-01-27 devnull first = nil;
259 bc5d5771 2006-01-27 devnull last = nil;
260 bc5d5771 2006-01-27 devnull for(i=0; i<n; i++){
261 bc5d5771 2006-01-27 devnull if((p = rrnext(buf, ebuf, p, &t)) == nil){
262 bc5d5771 2006-01-27 devnull if(first)
263 bc5d5771 2006-01-27 devnull ndbfree(first);
264 bc5d5771 2006-01-27 devnull return nil;
265 bc5d5771 2006-01-27 devnull }
266 bc5d5771 2006-01-27 devnull if(t == nil) /* unimplemented rr type */
267 bc5d5771 2006-01-27 devnull continue;
268 bc5d5771 2006-01-27 devnull if(last)
269 bc5d5771 2006-01-27 devnull last->entry = t;
270 bc5d5771 2006-01-27 devnull else
271 bc5d5771 2006-01-27 devnull first = t;
272 bc5d5771 2006-01-27 devnull for(last=t; last->entry; last=last->entry)
273 bc5d5771 2006-01-27 devnull last->line = last->entry;
274 bc5d5771 2006-01-27 devnull last->line = t;
275 bc5d5771 2006-01-27 devnull }
276 bc5d5771 2006-01-27 devnull *tt = first;
277 bc5d5771 2006-01-27 devnull return p;
278 bc5d5771 2006-01-27 devnull }
279 bc5d5771 2006-01-27 devnull
280 bc5d5771 2006-01-27 devnull #define G2(p) nhgets(p)
281 bc5d5771 2006-01-27 devnull #define G4(p) nhgetl(p)
282 bc5d5771 2006-01-27 devnull
283 bc5d5771 2006-01-27 devnull static uchar*
284 bc5d5771 2006-01-27 devnull rrnext(uchar *buf, uchar *ebuf, uchar *p, Ndbtuple **tt)
285 bc5d5771 2006-01-27 devnull {
286 bc5d5771 2006-01-27 devnull char tmp[Ndbvlen];
287 bc5d5771 2006-01-27 devnull char b[MAXRR];
288 bc5d5771 2006-01-27 devnull uchar ip[IPaddrlen];
289 bc5d5771 2006-01-27 devnull int len;
290 bc5d5771 2006-01-27 devnull Ndbtuple *first, *t;
291 bc5d5771 2006-01-27 devnull int rrtype;
292 bc5d5771 2006-01-27 devnull int rrlen;
293 bc5d5771 2006-01-27 devnull
294 bc5d5771 2006-01-27 devnull first = nil;
295 bc5d5771 2006-01-27 devnull t = nil;
296 bc5d5771 2006-01-27 devnull *tt = nil;
297 bc5d5771 2006-01-27 devnull if(p == nil)
298 bc5d5771 2006-01-27 devnull return nil;
299 bc5d5771 2006-01-27 devnull
300 bc5d5771 2006-01-27 devnull if((len = dn_expand(buf, ebuf, p, b, sizeof b)) < 0){
301 bc5d5771 2006-01-27 devnull corrupt:
302 bc5d5771 2006-01-27 devnull werrstr("corrupt dns packet");
303 bc5d5771 2006-01-27 devnull if(first)
304 bc5d5771 2006-01-27 devnull ndbfree(first);
305 bc5d5771 2006-01-27 devnull return nil;
306 bc5d5771 2006-01-27 devnull }
307 bc5d5771 2006-01-27 devnull p += len;
308 bc5d5771 2006-01-27 devnull
309 bc5d5771 2006-01-27 devnull rrtype = G2(p);
310 bc5d5771 2006-01-27 devnull rrlen = G2(p+8);
311 bc5d5771 2006-01-27 devnull p += 10;
312 bc5d5771 2006-01-27 devnull
313 18d5a36a 2006-01-27 devnull if(rrtype == Tptr)
314 bc5d5771 2006-01-27 devnull first = ndbnew("ptr", b);
315 bc5d5771 2006-01-27 devnull else
316 bc5d5771 2006-01-27 devnull first = ndbnew("dom", b);
317 bc5d5771 2006-01-27 devnull
318 bc5d5771 2006-01-27 devnull switch(rrtype){
319 bc5d5771 2006-01-27 devnull default:
320 bc5d5771 2006-01-27 devnull goto end;
321 18d5a36a 2006-01-27 devnull case Thinfo:
322 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "YY", "cpu", "os");
323 bc5d5771 2006-01-27 devnull break;
324 18d5a36a 2006-01-27 devnull case Tminfo:
325 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "NN", "mbox", "mbox");
326 bc5d5771 2006-01-27 devnull break;
327 18d5a36a 2006-01-27 devnull case Tmx:
328 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SN", "pref", "mx");
329 bc5d5771 2006-01-27 devnull break;
330 18d5a36a 2006-01-27 devnull case Tcname:
331 18d5a36a 2006-01-27 devnull case Tmd:
332 18d5a36a 2006-01-27 devnull case Tmf:
333 18d5a36a 2006-01-27 devnull case Tmg:
334 18d5a36a 2006-01-27 devnull case Tmr:
335 18d5a36a 2006-01-27 devnull case Tmb:
336 18d5a36a 2006-01-27 devnull case Tns:
337 18d5a36a 2006-01-27 devnull case Tptr:
338 18d5a36a 2006-01-27 devnull case Trp:
339 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "N", type2name(rrtype));
340 bc5d5771 2006-01-27 devnull break;
341 18d5a36a 2006-01-27 devnull case Ta:
342 bc5d5771 2006-01-27 devnull if(rrlen != IPv4addrlen)
343 bc5d5771 2006-01-27 devnull goto corrupt;
344 bc5d5771 2006-01-27 devnull memmove(ip, v4prefix, IPaddrlen);
345 bc5d5771 2006-01-27 devnull memmove(ip+IPv4off, p, IPv4addrlen);
346 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%I", ip);
347 bc5d5771 2006-01-27 devnull t = ndbnew("ip", tmp);
348 bc5d5771 2006-01-27 devnull p += rrlen;
349 bc5d5771 2006-01-27 devnull break;
350 18d5a36a 2006-01-27 devnull case Taaaa:
351 bc5d5771 2006-01-27 devnull if(rrlen != IPaddrlen)
352 bc5d5771 2006-01-27 devnull goto corrupt;
353 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%I", ip);
354 bc5d5771 2006-01-27 devnull t = ndbnew("ip", tmp);
355 bc5d5771 2006-01-27 devnull p += rrlen;
356 bc5d5771 2006-01-27 devnull break;
357 18d5a36a 2006-01-27 devnull case Tnull:
358 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%.*H", rrlen, p);
359 bc5d5771 2006-01-27 devnull t = ndbnew("null", tmp);
360 bc5d5771 2006-01-27 devnull p += rrlen;
361 bc5d5771 2006-01-27 devnull break;
362 18d5a36a 2006-01-27 devnull case Ttxt:
363 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "Y", "txt");
364 bc5d5771 2006-01-27 devnull break;
365 bc5d5771 2006-01-27 devnull
366 18d5a36a 2006-01-27 devnull case Tsoa:
367 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "NNLLLLL", "ns", "mbox",
368 bc5d5771 2006-01-27 devnull "serial", "refresh", "retry", "expire", "ttl");
369 bc5d5771 2006-01-27 devnull break;
370 bc5d5771 2006-01-27 devnull
371 18d5a36a 2006-01-27 devnull case Tkey:
372 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SCCY", "flags", "proto", "alg", "key");
373 bc5d5771 2006-01-27 devnull break;
374 bc5d5771 2006-01-27 devnull
375 18d5a36a 2006-01-27 devnull case Tsig:
376 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SCCLLLSNY", "type", "alg", "labels",
377 bc5d5771 2006-01-27 devnull "ttl", "exp", "incep", "tag", "signer", "sig");
378 bc5d5771 2006-01-27 devnull break;
379 bc5d5771 2006-01-27 devnull
380 18d5a36a 2006-01-27 devnull case Tcert:
381 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SSCY", "type", "tag", "alg", "cert");
382 bc5d5771 2006-01-27 devnull break;
383 bc5d5771 2006-01-27 devnull }
384 bc5d5771 2006-01-27 devnull if(t == nil)
385 bc5d5771 2006-01-27 devnull goto corrupt;
386 bc5d5771 2006-01-27 devnull
387 bc5d5771 2006-01-27 devnull end:
388 bc5d5771 2006-01-27 devnull first->entry = t;
389 bc5d5771 2006-01-27 devnull *tt = first;
390 bc5d5771 2006-01-27 devnull return p;
391 bc5d5771 2006-01-27 devnull }
392 bc5d5771 2006-01-27 devnull
393 bc5d5771 2006-01-27 devnull static Ndbtuple*
394 bc5d5771 2006-01-27 devnull rrunpack(uchar *buf, uchar *ebuf, uchar **pp, char *fmt, ...)
395 bc5d5771 2006-01-27 devnull {
396 bc5d5771 2006-01-27 devnull char *name;
397 bc5d5771 2006-01-27 devnull int len, n;
398 bc5d5771 2006-01-27 devnull uchar *p;
399 bc5d5771 2006-01-27 devnull va_list arg;
400 bc5d5771 2006-01-27 devnull Ndbtuple *t, *first, *last;
401 bc5d5771 2006-01-27 devnull char tmp[Ndbvlen];
402 bc5d5771 2006-01-27 devnull
403 bc5d5771 2006-01-27 devnull p = *pp;
404 bc5d5771 2006-01-27 devnull va_start(arg, fmt);
405 bc5d5771 2006-01-27 devnull first = nil;
406 bc5d5771 2006-01-27 devnull last = nil;
407 bc5d5771 2006-01-27 devnull for(; *fmt; fmt++){
408 bc5d5771 2006-01-27 devnull name = va_arg(arg, char*);
409 bc5d5771 2006-01-27 devnull switch(*fmt){
410 bc5d5771 2006-01-27 devnull default:
411 bc5d5771 2006-01-27 devnull return nil;
412 bc5d5771 2006-01-27 devnull case 'C':
413 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%d", *p++);
414 bc5d5771 2006-01-27 devnull break;
415 bc5d5771 2006-01-27 devnull case 'S':
416 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%d", G2(p));
417 bc5d5771 2006-01-27 devnull p += 2;
418 bc5d5771 2006-01-27 devnull break;
419 bc5d5771 2006-01-27 devnull case 'L':
420 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%d", G4(p));
421 bc5d5771 2006-01-27 devnull p += 4;
422 bc5d5771 2006-01-27 devnull break;
423 bc5d5771 2006-01-27 devnull case 'N':
424 bc5d5771 2006-01-27 devnull if((len = dn_expand(buf, ebuf, p, tmp, sizeof tmp)) < 0)
425 bc5d5771 2006-01-27 devnull return nil;
426 bc5d5771 2006-01-27 devnull p += len;
427 bc5d5771 2006-01-27 devnull break;
428 bc5d5771 2006-01-27 devnull case 'Y':
429 bc5d5771 2006-01-27 devnull len = *p++;
430 bc5d5771 2006-01-27 devnull n = len;
431 bc5d5771 2006-01-27 devnull if(n >= sizeof tmp)
432 bc5d5771 2006-01-27 devnull n = sizeof tmp-1;
433 bc5d5771 2006-01-27 devnull memmove(tmp, p, n);
434 bc5d5771 2006-01-27 devnull p += len;
435 bc5d5771 2006-01-27 devnull tmp[n] = 0;
436 bc5d5771 2006-01-27 devnull break;
437 bc5d5771 2006-01-27 devnull }
438 bc5d5771 2006-01-27 devnull t = ndbnew(name, tmp);
439 bc5d5771 2006-01-27 devnull if(last)
440 bc5d5771 2006-01-27 devnull last->entry = t;
441 bc5d5771 2006-01-27 devnull else
442 bc5d5771 2006-01-27 devnull first = t;
443 bc5d5771 2006-01-27 devnull last = t;
444 bc5d5771 2006-01-27 devnull }
445 bc5d5771 2006-01-27 devnull *pp = p;
446 bc5d5771 2006-01-27 devnull return first;
447 bc5d5771 2006-01-27 devnull }