Blame


1 3e0d8fb3 2005-12-27 devnull #include <u.h>
2 3e0d8fb3 2005-12-27 devnull #include <libc.h>
3 3e0d8fb3 2005-12-27 devnull #include <ip.h>
4 3e0d8fb3 2005-12-27 devnull #include <bio.h>
5 3e0d8fb3 2005-12-27 devnull #include <ndb.h>
6 3e0d8fb3 2005-12-27 devnull #include "dns.h"
7 3e0d8fb3 2005-12-27 devnull
8 3e0d8fb3 2005-12-27 devnull typedef struct Scan Scan;
9 3e0d8fb3 2005-12-27 devnull struct Scan
10 3e0d8fb3 2005-12-27 devnull {
11 3e0d8fb3 2005-12-27 devnull uchar *base;
12 3e0d8fb3 2005-12-27 devnull uchar *p;
13 3e0d8fb3 2005-12-27 devnull uchar *ep;
14 3e0d8fb3 2005-12-27 devnull char *err;
15 3e0d8fb3 2005-12-27 devnull };
16 3e0d8fb3 2005-12-27 devnull
17 3e0d8fb3 2005-12-27 devnull #define NAME(x) gname(x, sp)
18 3e0d8fb3 2005-12-27 devnull #define SYMBOL(x) (x = gsym(sp))
19 3e0d8fb3 2005-12-27 devnull #define STRING(x) (x = gstr(sp))
20 3e0d8fb3 2005-12-27 devnull #define USHORT(x) (x = gshort(sp))
21 3e0d8fb3 2005-12-27 devnull #define ULONG(x) (x = glong(sp))
22 3e0d8fb3 2005-12-27 devnull #define UCHAR(x) (x = gchar(sp))
23 3e0d8fb3 2005-12-27 devnull #define V4ADDR(x) (x = gv4addr(sp))
24 3e0d8fb3 2005-12-27 devnull #define V6ADDR(x) (x = gv6addr(sp))
25 3e0d8fb3 2005-12-27 devnull #define BYTES(x, y) (y = gbytes(sp, &x, len - (sp->p - data)))
26 3e0d8fb3 2005-12-27 devnull
27 3e0d8fb3 2005-12-27 devnull static char *toolong = "too long";
28 3e0d8fb3 2005-12-27 devnull
29 3e0d8fb3 2005-12-27 devnull /*
30 3e0d8fb3 2005-12-27 devnull * get a ushort/ulong
31 3e0d8fb3 2005-12-27 devnull */
32 3e0d8fb3 2005-12-27 devnull static ushort
33 3e0d8fb3 2005-12-27 devnull gchar(Scan *sp)
34 3e0d8fb3 2005-12-27 devnull {
35 3e0d8fb3 2005-12-27 devnull ushort x;
36 3e0d8fb3 2005-12-27 devnull
37 3e0d8fb3 2005-12-27 devnull if(sp->err)
38 3e0d8fb3 2005-12-27 devnull return 0;
39 3e0d8fb3 2005-12-27 devnull if(sp->ep - sp->p < 1){
40 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
41 3e0d8fb3 2005-12-27 devnull return 0;
42 3e0d8fb3 2005-12-27 devnull }
43 3e0d8fb3 2005-12-27 devnull x = sp->p[0];
44 3e0d8fb3 2005-12-27 devnull sp->p += 1;
45 3e0d8fb3 2005-12-27 devnull return x;
46 3e0d8fb3 2005-12-27 devnull }
47 3e0d8fb3 2005-12-27 devnull static ushort
48 3e0d8fb3 2005-12-27 devnull gshort(Scan *sp)
49 3e0d8fb3 2005-12-27 devnull {
50 3e0d8fb3 2005-12-27 devnull ushort x;
51 3e0d8fb3 2005-12-27 devnull
52 3e0d8fb3 2005-12-27 devnull if(sp->err)
53 3e0d8fb3 2005-12-27 devnull return 0;
54 3e0d8fb3 2005-12-27 devnull if(sp->ep - sp->p < 2){
55 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
56 3e0d8fb3 2005-12-27 devnull return 0;
57 3e0d8fb3 2005-12-27 devnull }
58 3e0d8fb3 2005-12-27 devnull x = (sp->p[0]<<8) | sp->p[1];
59 3e0d8fb3 2005-12-27 devnull sp->p += 2;
60 3e0d8fb3 2005-12-27 devnull return x;
61 3e0d8fb3 2005-12-27 devnull }
62 3e0d8fb3 2005-12-27 devnull static ulong
63 3e0d8fb3 2005-12-27 devnull glong(Scan *sp)
64 3e0d8fb3 2005-12-27 devnull {
65 3e0d8fb3 2005-12-27 devnull ulong x;
66 3e0d8fb3 2005-12-27 devnull
67 3e0d8fb3 2005-12-27 devnull if(sp->err)
68 3e0d8fb3 2005-12-27 devnull return 0;
69 3e0d8fb3 2005-12-27 devnull if(sp->ep - sp->p < 4){
70 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
71 3e0d8fb3 2005-12-27 devnull return 0;
72 3e0d8fb3 2005-12-27 devnull }
73 3e0d8fb3 2005-12-27 devnull x = (sp->p[0]<<24) | (sp->p[1]<<16) | (sp->p[2]<<8) | sp->p[3];
74 3e0d8fb3 2005-12-27 devnull sp->p += 4;
75 3e0d8fb3 2005-12-27 devnull return x;
76 3e0d8fb3 2005-12-27 devnull }
77 3e0d8fb3 2005-12-27 devnull
78 3e0d8fb3 2005-12-27 devnull /*
79 3e0d8fb3 2005-12-27 devnull * get an ip address
80 3e0d8fb3 2005-12-27 devnull */
81 3e0d8fb3 2005-12-27 devnull static DN*
82 3e0d8fb3 2005-12-27 devnull gv4addr(Scan *sp)
83 3e0d8fb3 2005-12-27 devnull {
84 3e0d8fb3 2005-12-27 devnull char addr[32];
85 3e0d8fb3 2005-12-27 devnull
86 3e0d8fb3 2005-12-27 devnull if(sp->err)
87 3e0d8fb3 2005-12-27 devnull return 0;
88 3e0d8fb3 2005-12-27 devnull if(sp->ep - sp->p < 4){
89 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
90 3e0d8fb3 2005-12-27 devnull return 0;
91 3e0d8fb3 2005-12-27 devnull }
92 3e0d8fb3 2005-12-27 devnull snprint(addr, sizeof(addr), "%V", sp->p);
93 3e0d8fb3 2005-12-27 devnull sp->p += 4;
94 3e0d8fb3 2005-12-27 devnull
95 3e0d8fb3 2005-12-27 devnull return dnlookup(addr, Cin, 1);
96 3e0d8fb3 2005-12-27 devnull }
97 3e0d8fb3 2005-12-27 devnull static DN*
98 3e0d8fb3 2005-12-27 devnull gv6addr(Scan *sp)
99 3e0d8fb3 2005-12-27 devnull {
100 3e0d8fb3 2005-12-27 devnull char addr[64];
101 3e0d8fb3 2005-12-27 devnull
102 3e0d8fb3 2005-12-27 devnull if(sp->err)
103 3e0d8fb3 2005-12-27 devnull return 0;
104 3e0d8fb3 2005-12-27 devnull if(sp->ep - sp->p < IPaddrlen){
105 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
106 3e0d8fb3 2005-12-27 devnull return 0;
107 3e0d8fb3 2005-12-27 devnull }
108 3e0d8fb3 2005-12-27 devnull snprint(addr, sizeof(addr), "%I", sp->p);
109 3e0d8fb3 2005-12-27 devnull sp->p += IPaddrlen;
110 3e0d8fb3 2005-12-27 devnull
111 3e0d8fb3 2005-12-27 devnull return dnlookup(addr, Cin, 1);
112 3e0d8fb3 2005-12-27 devnull }
113 3e0d8fb3 2005-12-27 devnull
114 3e0d8fb3 2005-12-27 devnull /*
115 3e0d8fb3 2005-12-27 devnull * get a string. make it an internal symbol.
116 3e0d8fb3 2005-12-27 devnull */
117 3e0d8fb3 2005-12-27 devnull static DN*
118 3e0d8fb3 2005-12-27 devnull gsym(Scan *sp)
119 3e0d8fb3 2005-12-27 devnull {
120 3e0d8fb3 2005-12-27 devnull int n;
121 3e0d8fb3 2005-12-27 devnull char sym[Strlen+1];
122 3e0d8fb3 2005-12-27 devnull
123 3e0d8fb3 2005-12-27 devnull if(sp->err)
124 3e0d8fb3 2005-12-27 devnull return 0;
125 3e0d8fb3 2005-12-27 devnull n = *(sp->p++);
126 3e0d8fb3 2005-12-27 devnull if(sp->p+n > sp->ep){
127 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
128 3e0d8fb3 2005-12-27 devnull return 0;
129 3e0d8fb3 2005-12-27 devnull }
130 3e0d8fb3 2005-12-27 devnull
131 3e0d8fb3 2005-12-27 devnull if(n > Strlen){
132 3e0d8fb3 2005-12-27 devnull sp->err = "illegal string";
133 3e0d8fb3 2005-12-27 devnull return 0;
134 3e0d8fb3 2005-12-27 devnull }
135 3e0d8fb3 2005-12-27 devnull strncpy(sym, (char*)sp->p, n);
136 3e0d8fb3 2005-12-27 devnull sym[n] = 0;
137 3e0d8fb3 2005-12-27 devnull sp->p += n;
138 3e0d8fb3 2005-12-27 devnull
139 3e0d8fb3 2005-12-27 devnull return dnlookup(sym, Csym, 1);
140 3e0d8fb3 2005-12-27 devnull }
141 3e0d8fb3 2005-12-27 devnull
142 3e0d8fb3 2005-12-27 devnull /*
143 3e0d8fb3 2005-12-27 devnull * get a string. don't make it an internal symbol.
144 3e0d8fb3 2005-12-27 devnull */
145 3e0d8fb3 2005-12-27 devnull static Txt*
146 3e0d8fb3 2005-12-27 devnull gstr(Scan *sp)
147 3e0d8fb3 2005-12-27 devnull {
148 3e0d8fb3 2005-12-27 devnull int n;
149 3e0d8fb3 2005-12-27 devnull char sym[Strlen+1];
150 3e0d8fb3 2005-12-27 devnull Txt *t;
151 3e0d8fb3 2005-12-27 devnull
152 3e0d8fb3 2005-12-27 devnull if(sp->err)
153 3e0d8fb3 2005-12-27 devnull return 0;
154 3e0d8fb3 2005-12-27 devnull n = *(sp->p++);
155 3e0d8fb3 2005-12-27 devnull if(sp->p+n > sp->ep){
156 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
157 3e0d8fb3 2005-12-27 devnull return 0;
158 3e0d8fb3 2005-12-27 devnull }
159 3e0d8fb3 2005-12-27 devnull
160 3e0d8fb3 2005-12-27 devnull if(n > Strlen){
161 3e0d8fb3 2005-12-27 devnull sp->err = "illegal string";
162 3e0d8fb3 2005-12-27 devnull return 0;
163 3e0d8fb3 2005-12-27 devnull }
164 3e0d8fb3 2005-12-27 devnull strncpy(sym, (char*)sp->p, n);
165 3e0d8fb3 2005-12-27 devnull sym[n] = 0;
166 3e0d8fb3 2005-12-27 devnull sp->p += n;
167 3e0d8fb3 2005-12-27 devnull
168 3e0d8fb3 2005-12-27 devnull t = emalloc(sizeof(*t));
169 3e0d8fb3 2005-12-27 devnull t->next = nil;
170 3e0d8fb3 2005-12-27 devnull t->p = estrdup(sym);
171 3e0d8fb3 2005-12-27 devnull return t;
172 3e0d8fb3 2005-12-27 devnull }
173 3e0d8fb3 2005-12-27 devnull
174 3e0d8fb3 2005-12-27 devnull /*
175 3e0d8fb3 2005-12-27 devnull * get a sequence of bytes
176 3e0d8fb3 2005-12-27 devnull */
177 3e0d8fb3 2005-12-27 devnull static int
178 3e0d8fb3 2005-12-27 devnull gbytes(Scan *sp, uchar **p, int n)
179 3e0d8fb3 2005-12-27 devnull {
180 3e0d8fb3 2005-12-27 devnull if(sp->err)
181 3e0d8fb3 2005-12-27 devnull return 0;
182 3e0d8fb3 2005-12-27 devnull if(sp->p+n > sp->ep || n < 0){
183 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
184 3e0d8fb3 2005-12-27 devnull return 0;
185 3e0d8fb3 2005-12-27 devnull }
186 3e0d8fb3 2005-12-27 devnull *p = emalloc(n);
187 3e0d8fb3 2005-12-27 devnull memmove(*p, sp->p, n);
188 3e0d8fb3 2005-12-27 devnull sp->p += n;
189 3e0d8fb3 2005-12-27 devnull
190 3e0d8fb3 2005-12-27 devnull return n;
191 3e0d8fb3 2005-12-27 devnull }
192 3e0d8fb3 2005-12-27 devnull
193 3e0d8fb3 2005-12-27 devnull /*
194 3e0d8fb3 2005-12-27 devnull * get a domain name. 'to' must point to a buffer at least Domlen+1 long.
195 3e0d8fb3 2005-12-27 devnull */
196 3e0d8fb3 2005-12-27 devnull static char*
197 3e0d8fb3 2005-12-27 devnull gname(char *to, Scan *sp)
198 3e0d8fb3 2005-12-27 devnull {
199 3e0d8fb3 2005-12-27 devnull int len, off;
200 3e0d8fb3 2005-12-27 devnull int pointer;
201 3e0d8fb3 2005-12-27 devnull int n;
202 3e0d8fb3 2005-12-27 devnull char *tostart;
203 3e0d8fb3 2005-12-27 devnull char *toend;
204 3e0d8fb3 2005-12-27 devnull uchar *p;
205 3e0d8fb3 2005-12-27 devnull
206 3e0d8fb3 2005-12-27 devnull tostart = to;
207 3e0d8fb3 2005-12-27 devnull if(sp->err)
208 3e0d8fb3 2005-12-27 devnull goto err;
209 3e0d8fb3 2005-12-27 devnull pointer = 0;
210 3e0d8fb3 2005-12-27 devnull p = sp->p;
211 3e0d8fb3 2005-12-27 devnull toend = to + Domlen;
212 3e0d8fb3 2005-12-27 devnull for(len = 0; *p; len += pointer ? 0 : (n+1)){
213 3e0d8fb3 2005-12-27 devnull if((*p & 0xc0) == 0xc0){
214 3e0d8fb3 2005-12-27 devnull /* pointer to other spot in message */
215 3e0d8fb3 2005-12-27 devnull if(pointer++ > 10){
216 3e0d8fb3 2005-12-27 devnull sp->err = "pointer loop";
217 3e0d8fb3 2005-12-27 devnull goto err;
218 3e0d8fb3 2005-12-27 devnull }
219 3e0d8fb3 2005-12-27 devnull off = ((p[0]<<8) + p[1]) & 0x3ff;
220 3e0d8fb3 2005-12-27 devnull p = sp->base + off;
221 3e0d8fb3 2005-12-27 devnull if(p >= sp->ep){
222 3e0d8fb3 2005-12-27 devnull sp->err = "bad pointer";
223 3e0d8fb3 2005-12-27 devnull goto err;
224 3e0d8fb3 2005-12-27 devnull }
225 3e0d8fb3 2005-12-27 devnull n = 0;
226 3e0d8fb3 2005-12-27 devnull continue;
227 3e0d8fb3 2005-12-27 devnull }
228 3e0d8fb3 2005-12-27 devnull n = *p++;
229 3e0d8fb3 2005-12-27 devnull if(len + n < Domlen - 1){
230 3e0d8fb3 2005-12-27 devnull if(to + n > toend){
231 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
232 3e0d8fb3 2005-12-27 devnull goto err;
233 3e0d8fb3 2005-12-27 devnull }
234 3e0d8fb3 2005-12-27 devnull memmove(to, p, n);
235 3e0d8fb3 2005-12-27 devnull to += n;
236 3e0d8fb3 2005-12-27 devnull }
237 3e0d8fb3 2005-12-27 devnull p += n;
238 3e0d8fb3 2005-12-27 devnull if(*p){
239 3e0d8fb3 2005-12-27 devnull if(to >= toend){
240 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
241 3e0d8fb3 2005-12-27 devnull goto err;
242 3e0d8fb3 2005-12-27 devnull }
243 3e0d8fb3 2005-12-27 devnull *to++ = '.';
244 3e0d8fb3 2005-12-27 devnull }
245 3e0d8fb3 2005-12-27 devnull }
246 3e0d8fb3 2005-12-27 devnull *to = 0;
247 3e0d8fb3 2005-12-27 devnull if(pointer)
248 3e0d8fb3 2005-12-27 devnull sp->p += len + 2; /* + 2 for pointer */
249 3e0d8fb3 2005-12-27 devnull else
250 3e0d8fb3 2005-12-27 devnull sp->p += len + 1; /* + 1 for the null domain */
251 3e0d8fb3 2005-12-27 devnull return tostart;
252 3e0d8fb3 2005-12-27 devnull err:
253 3e0d8fb3 2005-12-27 devnull *tostart = 0;
254 3e0d8fb3 2005-12-27 devnull return tostart;
255 3e0d8fb3 2005-12-27 devnull }
256 3e0d8fb3 2005-12-27 devnull
257 3e0d8fb3 2005-12-27 devnull /*
258 3e0d8fb3 2005-12-27 devnull * convert the next RR from a message
259 3e0d8fb3 2005-12-27 devnull */
260 3e0d8fb3 2005-12-27 devnull static RR*
261 3e0d8fb3 2005-12-27 devnull convM2RR(Scan *sp)
262 3e0d8fb3 2005-12-27 devnull {
263 3e0d8fb3 2005-12-27 devnull RR *rp;
264 3e0d8fb3 2005-12-27 devnull int type;
265 3e0d8fb3 2005-12-27 devnull int class;
266 3e0d8fb3 2005-12-27 devnull uchar *data;
267 3e0d8fb3 2005-12-27 devnull int len;
268 3e0d8fb3 2005-12-27 devnull char dname[Domlen+1];
269 3e0d8fb3 2005-12-27 devnull Txt *t, **l;
270 3e0d8fb3 2005-12-27 devnull
271 3e0d8fb3 2005-12-27 devnull retry:
272 3e0d8fb3 2005-12-27 devnull NAME(dname);
273 3e0d8fb3 2005-12-27 devnull USHORT(type);
274 3e0d8fb3 2005-12-27 devnull USHORT(class);
275 3e0d8fb3 2005-12-27 devnull
276 3e0d8fb3 2005-12-27 devnull rp = rralloc(type);
277 3e0d8fb3 2005-12-27 devnull rp->owner = dnlookup(dname, class, 1);
278 3e0d8fb3 2005-12-27 devnull rp->type = type;
279 3e0d8fb3 2005-12-27 devnull
280 3e0d8fb3 2005-12-27 devnull ULONG(rp->ttl);
281 3e0d8fb3 2005-12-27 devnull rp->ttl += now;
282 3e0d8fb3 2005-12-27 devnull USHORT(len);
283 3e0d8fb3 2005-12-27 devnull data = sp->p;
284 3e0d8fb3 2005-12-27 devnull
285 3e0d8fb3 2005-12-27 devnull if(sp->p + len > sp->ep)
286 3e0d8fb3 2005-12-27 devnull sp->err = toolong;
287 3e0d8fb3 2005-12-27 devnull if(sp->err){
288 3e0d8fb3 2005-12-27 devnull rrfree(rp);
289 3e0d8fb3 2005-12-27 devnull return 0;
290 3e0d8fb3 2005-12-27 devnull }
291 3e0d8fb3 2005-12-27 devnull
292 3e0d8fb3 2005-12-27 devnull switch(type){
293 3e0d8fb3 2005-12-27 devnull default:
294 3e0d8fb3 2005-12-27 devnull /* unknown type, just ignore it */
295 3e0d8fb3 2005-12-27 devnull sp->p = data + len;
296 3e0d8fb3 2005-12-27 devnull rrfree(rp);
297 3e0d8fb3 2005-12-27 devnull goto retry;
298 3e0d8fb3 2005-12-27 devnull case Thinfo:
299 3e0d8fb3 2005-12-27 devnull SYMBOL(rp->cpu);
300 3e0d8fb3 2005-12-27 devnull SYMBOL(rp->os);
301 3e0d8fb3 2005-12-27 devnull break;
302 3e0d8fb3 2005-12-27 devnull case Tcname:
303 3e0d8fb3 2005-12-27 devnull case Tmb:
304 3e0d8fb3 2005-12-27 devnull case Tmd:
305 3e0d8fb3 2005-12-27 devnull case Tmf:
306 3e0d8fb3 2005-12-27 devnull case Tns:
307 3e0d8fb3 2005-12-27 devnull rp->host = dnlookup(NAME(dname), Cin, 1);
308 3e0d8fb3 2005-12-27 devnull break;
309 3e0d8fb3 2005-12-27 devnull case Tmg:
310 3e0d8fb3 2005-12-27 devnull case Tmr:
311 3e0d8fb3 2005-12-27 devnull rp->mb = dnlookup(NAME(dname), Cin, 1);
312 3e0d8fb3 2005-12-27 devnull break;
313 3e0d8fb3 2005-12-27 devnull case Tminfo:
314 3e0d8fb3 2005-12-27 devnull rp->rmb = dnlookup(NAME(dname), Cin, 1);
315 3e0d8fb3 2005-12-27 devnull rp->mb = dnlookup(NAME(dname), Cin, 1);
316 3e0d8fb3 2005-12-27 devnull break;
317 3e0d8fb3 2005-12-27 devnull case Tmx:
318 3e0d8fb3 2005-12-27 devnull USHORT(rp->pref);
319 3e0d8fb3 2005-12-27 devnull rp->host = dnlookup(NAME(dname), Cin, 1);
320 3e0d8fb3 2005-12-27 devnull break;
321 3e0d8fb3 2005-12-27 devnull case Ta:
322 3e0d8fb3 2005-12-27 devnull V4ADDR(rp->ip);
323 3e0d8fb3 2005-12-27 devnull break;
324 3e0d8fb3 2005-12-27 devnull case Taaaa:
325 3e0d8fb3 2005-12-27 devnull V6ADDR(rp->ip);
326 3e0d8fb3 2005-12-27 devnull break;
327 3e0d8fb3 2005-12-27 devnull case Tptr:
328 3e0d8fb3 2005-12-27 devnull rp->ptr = dnlookup(NAME(dname), Cin, 1);
329 3e0d8fb3 2005-12-27 devnull break;
330 3e0d8fb3 2005-12-27 devnull case Tsoa:
331 3e0d8fb3 2005-12-27 devnull rp->host = dnlookup(NAME(dname), Cin, 1);
332 3e0d8fb3 2005-12-27 devnull rp->rmb = dnlookup(NAME(dname), Cin, 1);
333 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->serial);
334 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->refresh);
335 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->retry);
336 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->expire);
337 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->minttl);
338 3e0d8fb3 2005-12-27 devnull break;
339 3e0d8fb3 2005-12-27 devnull case Ttxt:
340 3e0d8fb3 2005-12-27 devnull l = &rp->txt;
341 3e0d8fb3 2005-12-27 devnull *l = nil;
342 3e0d8fb3 2005-12-27 devnull while(sp->p-data < len){
343 3e0d8fb3 2005-12-27 devnull STRING(t);
344 3e0d8fb3 2005-12-27 devnull *l = t;
345 3e0d8fb3 2005-12-27 devnull l = &t->next;
346 3e0d8fb3 2005-12-27 devnull }
347 3e0d8fb3 2005-12-27 devnull break;
348 3e0d8fb3 2005-12-27 devnull case Tnull:
349 3e0d8fb3 2005-12-27 devnull BYTES(rp->null->data, rp->null->dlen);
350 3e0d8fb3 2005-12-27 devnull break;
351 3e0d8fb3 2005-12-27 devnull case Trp:
352 3e0d8fb3 2005-12-27 devnull rp->rmb = dnlookup(NAME(dname), Cin, 1);
353 3e0d8fb3 2005-12-27 devnull rp->rp = dnlookup(NAME(dname), Cin, 1);
354 3e0d8fb3 2005-12-27 devnull break;
355 3e0d8fb3 2005-12-27 devnull case Tkey:
356 3e0d8fb3 2005-12-27 devnull USHORT(rp->key->flags);
357 3e0d8fb3 2005-12-27 devnull UCHAR(rp->key->proto);
358 3e0d8fb3 2005-12-27 devnull UCHAR(rp->key->alg);
359 3e0d8fb3 2005-12-27 devnull BYTES(rp->key->data, rp->key->dlen);
360 3e0d8fb3 2005-12-27 devnull break;
361 3e0d8fb3 2005-12-27 devnull case Tsig:
362 3e0d8fb3 2005-12-27 devnull USHORT(rp->sig->type);
363 3e0d8fb3 2005-12-27 devnull UCHAR(rp->sig->alg);
364 3e0d8fb3 2005-12-27 devnull UCHAR(rp->sig->labels);
365 3e0d8fb3 2005-12-27 devnull ULONG(rp->sig->ttl);
366 3e0d8fb3 2005-12-27 devnull ULONG(rp->sig->exp);
367 3e0d8fb3 2005-12-27 devnull ULONG(rp->sig->incep);
368 3e0d8fb3 2005-12-27 devnull USHORT(rp->sig->tag);
369 3e0d8fb3 2005-12-27 devnull rp->sig->signer = dnlookup(NAME(dname), Cin, 1);
370 3e0d8fb3 2005-12-27 devnull BYTES(rp->sig->data, rp->sig->dlen);
371 3e0d8fb3 2005-12-27 devnull break;
372 3e0d8fb3 2005-12-27 devnull case Tcert:
373 3e0d8fb3 2005-12-27 devnull USHORT(rp->cert->type);
374 3e0d8fb3 2005-12-27 devnull USHORT(rp->cert->tag);
375 3e0d8fb3 2005-12-27 devnull UCHAR(rp->cert->alg);
376 3e0d8fb3 2005-12-27 devnull BYTES(rp->cert->data, rp->cert->dlen);
377 3e0d8fb3 2005-12-27 devnull break;
378 3e0d8fb3 2005-12-27 devnull }
379 3e0d8fb3 2005-12-27 devnull if(sp->p - data != len)
380 3e0d8fb3 2005-12-27 devnull sp->err = "bad RR len";
381 3e0d8fb3 2005-12-27 devnull return rp;
382 3e0d8fb3 2005-12-27 devnull }
383 3e0d8fb3 2005-12-27 devnull
384 3e0d8fb3 2005-12-27 devnull /*
385 3e0d8fb3 2005-12-27 devnull * convert the next question from a message
386 3e0d8fb3 2005-12-27 devnull */
387 3e0d8fb3 2005-12-27 devnull static RR*
388 3e0d8fb3 2005-12-27 devnull convM2Q(Scan *sp)
389 3e0d8fb3 2005-12-27 devnull {
390 3e0d8fb3 2005-12-27 devnull char dname[Domlen+1];
391 3e0d8fb3 2005-12-27 devnull int type;
392 3e0d8fb3 2005-12-27 devnull int class;
393 3e0d8fb3 2005-12-27 devnull RR *rp;
394 3e0d8fb3 2005-12-27 devnull
395 3e0d8fb3 2005-12-27 devnull NAME(dname);
396 3e0d8fb3 2005-12-27 devnull USHORT(type);
397 3e0d8fb3 2005-12-27 devnull USHORT(class);
398 3e0d8fb3 2005-12-27 devnull if(sp->err)
399 3e0d8fb3 2005-12-27 devnull return 0;
400 3e0d8fb3 2005-12-27 devnull
401 3e0d8fb3 2005-12-27 devnull rp = rralloc(type);
402 3e0d8fb3 2005-12-27 devnull rp->owner = dnlookup(dname, class, 1);
403 3e0d8fb3 2005-12-27 devnull
404 3e0d8fb3 2005-12-27 devnull return rp;
405 3e0d8fb3 2005-12-27 devnull }
406 3e0d8fb3 2005-12-27 devnull
407 3e0d8fb3 2005-12-27 devnull static RR*
408 3e0d8fb3 2005-12-27 devnull rrloop(Scan *sp, int count, int quest)
409 3e0d8fb3 2005-12-27 devnull {
410 3e0d8fb3 2005-12-27 devnull int i;
411 3e0d8fb3 2005-12-27 devnull RR *first, *rp, **l;
412 3e0d8fb3 2005-12-27 devnull
413 3e0d8fb3 2005-12-27 devnull if(sp->err)
414 3e0d8fb3 2005-12-27 devnull return 0;
415 3e0d8fb3 2005-12-27 devnull l = &first;
416 3e0d8fb3 2005-12-27 devnull first = 0;
417 3e0d8fb3 2005-12-27 devnull for(i = 0; i < count; i++){
418 3e0d8fb3 2005-12-27 devnull rp = quest ? convM2Q(sp) : convM2RR(sp);
419 3e0d8fb3 2005-12-27 devnull if(rp == 0)
420 3e0d8fb3 2005-12-27 devnull break;
421 3e0d8fb3 2005-12-27 devnull if(sp->err){
422 3e0d8fb3 2005-12-27 devnull rrfree(rp);
423 3e0d8fb3 2005-12-27 devnull break;
424 3e0d8fb3 2005-12-27 devnull }
425 3e0d8fb3 2005-12-27 devnull *l = rp;
426 3e0d8fb3 2005-12-27 devnull l = &rp->next;
427 3e0d8fb3 2005-12-27 devnull }
428 3e0d8fb3 2005-12-27 devnull return first;
429 3e0d8fb3 2005-12-27 devnull }
430 3e0d8fb3 2005-12-27 devnull
431 3e0d8fb3 2005-12-27 devnull /*
432 3e0d8fb3 2005-12-27 devnull * convert the next DNS from a message stream
433 3e0d8fb3 2005-12-27 devnull */
434 3e0d8fb3 2005-12-27 devnull char*
435 3e0d8fb3 2005-12-27 devnull convM2DNS(uchar *buf, int len, DNSmsg *m)
436 3e0d8fb3 2005-12-27 devnull {
437 3e0d8fb3 2005-12-27 devnull Scan scan;
438 3e0d8fb3 2005-12-27 devnull Scan *sp;
439 3e0d8fb3 2005-12-27 devnull char *err;
440 3e0d8fb3 2005-12-27 devnull
441 3e0d8fb3 2005-12-27 devnull scan.base = buf;
442 3e0d8fb3 2005-12-27 devnull scan.p = buf;
443 3e0d8fb3 2005-12-27 devnull scan.ep = buf + len;
444 3e0d8fb3 2005-12-27 devnull scan.err = 0;
445 3e0d8fb3 2005-12-27 devnull sp = &scan;
446 3e0d8fb3 2005-12-27 devnull memset(m, 0, sizeof(DNSmsg));
447 3e0d8fb3 2005-12-27 devnull USHORT(m->id);
448 3e0d8fb3 2005-12-27 devnull USHORT(m->flags);
449 3e0d8fb3 2005-12-27 devnull USHORT(m->qdcount);
450 3e0d8fb3 2005-12-27 devnull USHORT(m->ancount);
451 3e0d8fb3 2005-12-27 devnull USHORT(m->nscount);
452 3e0d8fb3 2005-12-27 devnull USHORT(m->arcount);
453 3e0d8fb3 2005-12-27 devnull m->qd = rrloop(sp, m->qdcount, 1);
454 3e0d8fb3 2005-12-27 devnull m->an = rrloop(sp, m->ancount, 0);
455 3e0d8fb3 2005-12-27 devnull m->ns = rrloop(sp, m->nscount, 0);
456 3e0d8fb3 2005-12-27 devnull err = scan.err; /* live with bad ar's */
457 3e0d8fb3 2005-12-27 devnull m->ar = rrloop(sp, m->arcount, 0);
458 3e0d8fb3 2005-12-27 devnull return err;
459 3e0d8fb3 2005-12-27 devnull }