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 fa325e9b 2020-01-10 cross 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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
36 bc5d5771 2006-01-27 devnull /* zero out the error string */
37 bc5d5771 2006-01-27 devnull werrstr("");
38 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 e6ed10f2 2020-01-07 crossd strncpy(to, from, len-1);
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 fa325e9b 2020-01-10 cross 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 cbeb0b26 2006-04-01 devnull Call= 255 /* all classes */
138 bc5d5771 2006-01-27 devnull };
139 bc5d5771 2006-01-27 devnull
140 18d5a36a 2006-01-27 devnull
141 bc5d5771 2006-01-27 devnull static int name2type(char*);
142 bc5d5771 2006-01-27 devnull static uchar *skipquestion(uchar*, uchar*, uchar*, int);
143 bc5d5771 2006-01-27 devnull static uchar *unpack(uchar*, uchar*, uchar*, Ndbtuple**, int);
144 bc5d5771 2006-01-27 devnull static uchar *rrnext(uchar*, uchar*, uchar*, Ndbtuple**);
145 bc5d5771 2006-01-27 devnull static Ndbtuple *rrunpack(uchar*, uchar*, uchar**, char*, ...);
146 bc5d5771 2006-01-27 devnull
147 bc5d5771 2006-01-27 devnull static Ndbtuple*
148 bc5d5771 2006-01-27 devnull doquery(char *name, char *type)
149 bc5d5771 2006-01-27 devnull {
150 bc5d5771 2006-01-27 devnull int n, nstype;
151 bc5d5771 2006-01-27 devnull uchar *buf, *p;
152 bc5d5771 2006-01-27 devnull Ndbtuple *t;
153 a7c0bddd 2006-01-29 devnull int qdcount, ancount;
154 bc5d5771 2006-01-27 devnull
155 bc5d5771 2006-01-27 devnull if((nstype = name2type(type)) < 0){
156 bc5d5771 2006-01-27 devnull werrstr("unknown dns type %s", type);
157 bc5d5771 2006-01-27 devnull return nil;
158 bc5d5771 2006-01-27 devnull }
159 bc5d5771 2006-01-27 devnull
160 bc5d5771 2006-01-27 devnull buf = malloc(MAXDNS);
161 bc5d5771 2006-01-27 devnull if(buf == nil)
162 bc5d5771 2006-01-27 devnull return nil;
163 bc5d5771 2006-01-27 devnull
164 18d5a36a 2006-01-27 devnull if((n = res_search(name, Cin, nstype, buf, MAXDNS)) < 0){
165 bc5d5771 2006-01-27 devnull free(buf);
166 bc5d5771 2006-01-27 devnull return nil;
167 bc5d5771 2006-01-27 devnull }
168 bc5d5771 2006-01-27 devnull if(n >= MAXDNS){
169 bc5d5771 2006-01-27 devnull free(buf);
170 bc5d5771 2006-01-27 devnull werrstr("too much dns information");
171 bc5d5771 2006-01-27 devnull return nil;
172 bc5d5771 2006-01-27 devnull }
173 a7c0bddd 2006-01-29 devnull
174 a7c0bddd 2006-01-29 devnull qdcount = (buf[4]<<8)|buf[5];
175 a7c0bddd 2006-01-29 devnull ancount = (buf[6]<<8)|buf[7];
176 fa325e9b 2020-01-10 cross
177 a7c0bddd 2006-01-29 devnull p = buf+12;
178 a7c0bddd 2006-01-29 devnull p = skipquestion(buf, buf+n, p, qdcount);
179 a7c0bddd 2006-01-29 devnull p = unpack(buf, buf+n, p, &t, ancount);
180 bc5d5771 2006-01-27 devnull USED(p);
181 bc5d5771 2006-01-27 devnull return t;
182 bc5d5771 2006-01-27 devnull }
183 60218587 2006-01-27 devnull
184 bc5d5771 2006-01-27 devnull static struct {
185 bc5d5771 2006-01-27 devnull char *s;
186 bc5d5771 2006-01-27 devnull int t;
187 bc5d5771 2006-01-27 devnull } dnsnames[] =
188 bc5d5771 2006-01-27 devnull {
189 60218587 2006-01-27 devnull "ip", Ta,
190 60218587 2006-01-27 devnull "ns", Tns,
191 60218587 2006-01-27 devnull "md", Tmd,
192 60218587 2006-01-27 devnull "mf", Tmf,
193 60218587 2006-01-27 devnull "cname", Tcname,
194 60218587 2006-01-27 devnull "soa", Tsoa,
195 60218587 2006-01-27 devnull "mb", Tmb,
196 60218587 2006-01-27 devnull "mg", Tmg,
197 60218587 2006-01-27 devnull "mr", Tmr,
198 60218587 2006-01-27 devnull "null", Tnull,
199 60218587 2006-01-27 devnull "ptr", Tptr,
200 60218587 2006-01-27 devnull "hinfo", Thinfo,
201 60218587 2006-01-27 devnull "minfo", Tminfo,
202 60218587 2006-01-27 devnull "mx", Tmx,
203 60218587 2006-01-27 devnull "txt", Ttxt,
204 60218587 2006-01-27 devnull "rp", Trp,
205 60218587 2006-01-27 devnull "key", Tkey,
206 60218587 2006-01-27 devnull "cert", Tcert,
207 60218587 2006-01-27 devnull "sig", Tsig,
208 60218587 2006-01-27 devnull "aaaa", Taaaa,
209 60218587 2006-01-27 devnull "ixfr", Tixfr,
210 60218587 2006-01-27 devnull "axfr", Taxfr,
211 60218587 2006-01-27 devnull "all", Call,
212 bc5d5771 2006-01-27 devnull };
213 bc5d5771 2006-01-27 devnull
214 bc5d5771 2006-01-27 devnull static char*
215 bc5d5771 2006-01-27 devnull type2name(int t)
216 bc5d5771 2006-01-27 devnull {
217 bc5d5771 2006-01-27 devnull int i;
218 fa325e9b 2020-01-10 cross
219 bc5d5771 2006-01-27 devnull for(i=0; i<nelem(dnsnames); i++)
220 bc5d5771 2006-01-27 devnull if(dnsnames[i].t == t)
221 bc5d5771 2006-01-27 devnull return dnsnames[i].s;
222 bc5d5771 2006-01-27 devnull return nil;
223 bc5d5771 2006-01-27 devnull }
224 bc5d5771 2006-01-27 devnull
225 bc5d5771 2006-01-27 devnull static int
226 bc5d5771 2006-01-27 devnull name2type(char *name)
227 bc5d5771 2006-01-27 devnull {
228 bc5d5771 2006-01-27 devnull int i;
229 fa325e9b 2020-01-10 cross
230 bc5d5771 2006-01-27 devnull for(i=0; i<nelem(dnsnames); i++)
231 bc5d5771 2006-01-27 devnull if(strcmp(name, dnsnames[i].s) == 0)
232 bc5d5771 2006-01-27 devnull return dnsnames[i].t;
233 bc5d5771 2006-01-27 devnull return -1;
234 bc5d5771 2006-01-27 devnull }
235 bc5d5771 2006-01-27 devnull
236 bc5d5771 2006-01-27 devnull static uchar*
237 bc5d5771 2006-01-27 devnull skipquestion(uchar *buf, uchar *ebuf, uchar *p, int n)
238 bc5d5771 2006-01-27 devnull {
239 bc5d5771 2006-01-27 devnull int i, len;
240 bc5d5771 2006-01-27 devnull char tmp[100];
241 fa325e9b 2020-01-10 cross
242 bc5d5771 2006-01-27 devnull for(i=0; i<n; i++){
243 bc5d5771 2006-01-27 devnull if((len = dn_expand(buf, ebuf, p, tmp, sizeof tmp)) <= 0)
244 bc5d5771 2006-01-27 devnull return nil;
245 da20ccc7 2006-01-27 devnull p += 4+len;
246 bc5d5771 2006-01-27 devnull }
247 bc5d5771 2006-01-27 devnull return p;
248 bc5d5771 2006-01-27 devnull }
249 bc5d5771 2006-01-27 devnull
250 bc5d5771 2006-01-27 devnull static uchar*
251 bc5d5771 2006-01-27 devnull unpack(uchar *buf, uchar *ebuf, uchar *p, Ndbtuple **tt, int n)
252 bc5d5771 2006-01-27 devnull {
253 bc5d5771 2006-01-27 devnull int i;
254 bc5d5771 2006-01-27 devnull Ndbtuple *first, *last, *t;
255 bc5d5771 2006-01-27 devnull
256 bc5d5771 2006-01-27 devnull *tt = nil;
257 bc5d5771 2006-01-27 devnull first = nil;
258 bc5d5771 2006-01-27 devnull last = nil;
259 bc5d5771 2006-01-27 devnull for(i=0; i<n; i++){
260 bc5d5771 2006-01-27 devnull if((p = rrnext(buf, ebuf, p, &t)) == nil){
261 bc5d5771 2006-01-27 devnull if(first)
262 bc5d5771 2006-01-27 devnull ndbfree(first);
263 bc5d5771 2006-01-27 devnull return nil;
264 bc5d5771 2006-01-27 devnull }
265 bc5d5771 2006-01-27 devnull if(t == nil) /* unimplemented rr type */
266 bc5d5771 2006-01-27 devnull continue;
267 bc5d5771 2006-01-27 devnull if(last)
268 bc5d5771 2006-01-27 devnull last->entry = t;
269 bc5d5771 2006-01-27 devnull else
270 bc5d5771 2006-01-27 devnull first = t;
271 bc5d5771 2006-01-27 devnull for(last=t; last->entry; last=last->entry)
272 bc5d5771 2006-01-27 devnull last->line = last->entry;
273 bc5d5771 2006-01-27 devnull last->line = t;
274 bc5d5771 2006-01-27 devnull }
275 bc5d5771 2006-01-27 devnull *tt = first;
276 bc5d5771 2006-01-27 devnull return p;
277 bc5d5771 2006-01-27 devnull }
278 bc5d5771 2006-01-27 devnull
279 bc5d5771 2006-01-27 devnull #define G2(p) nhgets(p)
280 bc5d5771 2006-01-27 devnull #define G4(p) nhgetl(p)
281 bc5d5771 2006-01-27 devnull
282 bc5d5771 2006-01-27 devnull static uchar*
283 bc5d5771 2006-01-27 devnull rrnext(uchar *buf, uchar *ebuf, uchar *p, Ndbtuple **tt)
284 bc5d5771 2006-01-27 devnull {
285 bc5d5771 2006-01-27 devnull char tmp[Ndbvlen];
286 bc5d5771 2006-01-27 devnull char b[MAXRR];
287 bc5d5771 2006-01-27 devnull uchar ip[IPaddrlen];
288 bc5d5771 2006-01-27 devnull int len;
289 bc5d5771 2006-01-27 devnull Ndbtuple *first, *t;
290 bc5d5771 2006-01-27 devnull int rrtype;
291 bc5d5771 2006-01-27 devnull int rrlen;
292 bc5d5771 2006-01-27 devnull
293 bc5d5771 2006-01-27 devnull first = nil;
294 bc5d5771 2006-01-27 devnull t = nil;
295 bc5d5771 2006-01-27 devnull *tt = nil;
296 bc5d5771 2006-01-27 devnull if(p == nil)
297 bc5d5771 2006-01-27 devnull return nil;
298 bc5d5771 2006-01-27 devnull
299 bc5d5771 2006-01-27 devnull if((len = dn_expand(buf, ebuf, p, b, sizeof b)) < 0){
300 bc5d5771 2006-01-27 devnull corrupt:
301 bc5d5771 2006-01-27 devnull werrstr("corrupt dns packet");
302 bc5d5771 2006-01-27 devnull if(first)
303 bc5d5771 2006-01-27 devnull ndbfree(first);
304 bc5d5771 2006-01-27 devnull return nil;
305 bc5d5771 2006-01-27 devnull }
306 bc5d5771 2006-01-27 devnull p += len;
307 fa325e9b 2020-01-10 cross
308 bc5d5771 2006-01-27 devnull rrtype = G2(p);
309 bc5d5771 2006-01-27 devnull rrlen = G2(p+8);
310 bc5d5771 2006-01-27 devnull p += 10;
311 fa325e9b 2020-01-10 cross
312 18d5a36a 2006-01-27 devnull if(rrtype == Tptr)
313 bc5d5771 2006-01-27 devnull first = ndbnew("ptr", b);
314 bc5d5771 2006-01-27 devnull else
315 bc5d5771 2006-01-27 devnull first = ndbnew("dom", b);
316 bc5d5771 2006-01-27 devnull
317 bc5d5771 2006-01-27 devnull switch(rrtype){
318 bc5d5771 2006-01-27 devnull default:
319 bc5d5771 2006-01-27 devnull goto end;
320 18d5a36a 2006-01-27 devnull case Thinfo:
321 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "YY", "cpu", "os");
322 bc5d5771 2006-01-27 devnull break;
323 18d5a36a 2006-01-27 devnull case Tminfo:
324 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "NN", "mbox", "mbox");
325 bc5d5771 2006-01-27 devnull break;
326 18d5a36a 2006-01-27 devnull case Tmx:
327 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SN", "pref", "mx");
328 bc5d5771 2006-01-27 devnull break;
329 18d5a36a 2006-01-27 devnull case Tcname:
330 18d5a36a 2006-01-27 devnull case Tmd:
331 18d5a36a 2006-01-27 devnull case Tmf:
332 18d5a36a 2006-01-27 devnull case Tmg:
333 18d5a36a 2006-01-27 devnull case Tmr:
334 18d5a36a 2006-01-27 devnull case Tmb:
335 18d5a36a 2006-01-27 devnull case Tns:
336 18d5a36a 2006-01-27 devnull case Tptr:
337 18d5a36a 2006-01-27 devnull case Trp:
338 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "N", type2name(rrtype));
339 bc5d5771 2006-01-27 devnull break;
340 18d5a36a 2006-01-27 devnull case Ta:
341 bc5d5771 2006-01-27 devnull if(rrlen != IPv4addrlen)
342 bc5d5771 2006-01-27 devnull goto corrupt;
343 bc5d5771 2006-01-27 devnull memmove(ip, v4prefix, IPaddrlen);
344 bc5d5771 2006-01-27 devnull memmove(ip+IPv4off, p, IPv4addrlen);
345 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%I", ip);
346 bc5d5771 2006-01-27 devnull t = ndbnew("ip", tmp);
347 bc5d5771 2006-01-27 devnull p += rrlen;
348 bc5d5771 2006-01-27 devnull break;
349 18d5a36a 2006-01-27 devnull case Taaaa:
350 bc5d5771 2006-01-27 devnull if(rrlen != IPaddrlen)
351 bc5d5771 2006-01-27 devnull goto corrupt;
352 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%I", ip);
353 bc5d5771 2006-01-27 devnull t = ndbnew("ip", tmp);
354 bc5d5771 2006-01-27 devnull p += rrlen;
355 bc5d5771 2006-01-27 devnull break;
356 18d5a36a 2006-01-27 devnull case Tnull:
357 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%.*H", rrlen, p);
358 bc5d5771 2006-01-27 devnull t = ndbnew("null", tmp);
359 bc5d5771 2006-01-27 devnull p += rrlen;
360 bc5d5771 2006-01-27 devnull break;
361 18d5a36a 2006-01-27 devnull case Ttxt:
362 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "Y", "txt");
363 bc5d5771 2006-01-27 devnull break;
364 bc5d5771 2006-01-27 devnull
365 18d5a36a 2006-01-27 devnull case Tsoa:
366 fa325e9b 2020-01-10 cross t = rrunpack(buf, ebuf, &p, "NNLLLLL", "ns", "mbox",
367 bc5d5771 2006-01-27 devnull "serial", "refresh", "retry", "expire", "ttl");
368 bc5d5771 2006-01-27 devnull break;
369 bc5d5771 2006-01-27 devnull
370 18d5a36a 2006-01-27 devnull case Tkey:
371 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SCCY", "flags", "proto", "alg", "key");
372 bc5d5771 2006-01-27 devnull break;
373 fa325e9b 2020-01-10 cross
374 18d5a36a 2006-01-27 devnull case Tsig:
375 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SCCLLLSNY", "type", "alg", "labels",
376 bc5d5771 2006-01-27 devnull "ttl", "exp", "incep", "tag", "signer", "sig");
377 bc5d5771 2006-01-27 devnull break;
378 fa325e9b 2020-01-10 cross
379 18d5a36a 2006-01-27 devnull case Tcert:
380 bc5d5771 2006-01-27 devnull t = rrunpack(buf, ebuf, &p, "SSCY", "type", "tag", "alg", "cert");
381 bc5d5771 2006-01-27 devnull break;
382 bc5d5771 2006-01-27 devnull }
383 bc5d5771 2006-01-27 devnull if(t == nil)
384 bc5d5771 2006-01-27 devnull goto corrupt;
385 bc5d5771 2006-01-27 devnull
386 bc5d5771 2006-01-27 devnull end:
387 bc5d5771 2006-01-27 devnull first->entry = t;
388 bc5d5771 2006-01-27 devnull *tt = first;
389 bc5d5771 2006-01-27 devnull return p;
390 bc5d5771 2006-01-27 devnull }
391 bc5d5771 2006-01-27 devnull
392 bc5d5771 2006-01-27 devnull static Ndbtuple*
393 bc5d5771 2006-01-27 devnull rrunpack(uchar *buf, uchar *ebuf, uchar **pp, char *fmt, ...)
394 bc5d5771 2006-01-27 devnull {
395 bc5d5771 2006-01-27 devnull char *name;
396 bc5d5771 2006-01-27 devnull int len, n;
397 bc5d5771 2006-01-27 devnull uchar *p;
398 bc5d5771 2006-01-27 devnull va_list arg;
399 bc5d5771 2006-01-27 devnull Ndbtuple *t, *first, *last;
400 bc5d5771 2006-01-27 devnull char tmp[Ndbvlen];
401 fa325e9b 2020-01-10 cross
402 bc5d5771 2006-01-27 devnull p = *pp;
403 bc5d5771 2006-01-27 devnull va_start(arg, fmt);
404 bc5d5771 2006-01-27 devnull first = nil;
405 bc5d5771 2006-01-27 devnull last = nil;
406 bc5d5771 2006-01-27 devnull for(; *fmt; fmt++){
407 bc5d5771 2006-01-27 devnull name = va_arg(arg, char*);
408 bc5d5771 2006-01-27 devnull switch(*fmt){
409 bc5d5771 2006-01-27 devnull default:
410 bc5d5771 2006-01-27 devnull return nil;
411 bc5d5771 2006-01-27 devnull case 'C':
412 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%d", *p++);
413 bc5d5771 2006-01-27 devnull break;
414 bc5d5771 2006-01-27 devnull case 'S':
415 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%d", G2(p));
416 bc5d5771 2006-01-27 devnull p += 2;
417 bc5d5771 2006-01-27 devnull break;
418 bc5d5771 2006-01-27 devnull case 'L':
419 bc5d5771 2006-01-27 devnull snprint(tmp, sizeof tmp, "%d", G4(p));
420 bc5d5771 2006-01-27 devnull p += 4;
421 bc5d5771 2006-01-27 devnull break;
422 bc5d5771 2006-01-27 devnull case 'N':
423 bc5d5771 2006-01-27 devnull if((len = dn_expand(buf, ebuf, p, tmp, sizeof tmp)) < 0)
424 bc5d5771 2006-01-27 devnull return nil;
425 bc5d5771 2006-01-27 devnull p += len;
426 bc5d5771 2006-01-27 devnull break;
427 bc5d5771 2006-01-27 devnull case 'Y':
428 bc5d5771 2006-01-27 devnull len = *p++;
429 bc5d5771 2006-01-27 devnull n = len;
430 bc5d5771 2006-01-27 devnull if(n >= sizeof tmp)
431 bc5d5771 2006-01-27 devnull n = sizeof tmp-1;
432 bc5d5771 2006-01-27 devnull memmove(tmp, p, n);
433 bc5d5771 2006-01-27 devnull p += len;
434 bc5d5771 2006-01-27 devnull tmp[n] = 0;
435 bc5d5771 2006-01-27 devnull break;
436 bc5d5771 2006-01-27 devnull }
437 bc5d5771 2006-01-27 devnull t = ndbnew(name, tmp);
438 bc5d5771 2006-01-27 devnull if(last)
439 bc5d5771 2006-01-27 devnull last->entry = t;
440 bc5d5771 2006-01-27 devnull else
441 bc5d5771 2006-01-27 devnull first = t;
442 bc5d5771 2006-01-27 devnull last = t;
443 bc5d5771 2006-01-27 devnull }
444 bc5d5771 2006-01-27 devnull *pp = p;
445 bc5d5771 2006-01-27 devnull return first;
446 bc5d5771 2006-01-27 devnull }