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 /*
9 3e0d8fb3 2005-12-27 devnull * a dictionary of domain names for packing messages
10 3e0d8fb3 2005-12-27 devnull */
11 3e0d8fb3 2005-12-27 devnull enum
12 3e0d8fb3 2005-12-27 devnull {
13 226d80b8 2006-04-01 devnull Ndict= 64
14 3e0d8fb3 2005-12-27 devnull };
15 3e0d8fb3 2005-12-27 devnull typedef struct Dict Dict;
16 3e0d8fb3 2005-12-27 devnull struct Dict
17 3e0d8fb3 2005-12-27 devnull {
18 3e0d8fb3 2005-12-27 devnull struct {
19 3e0d8fb3 2005-12-27 devnull ushort offset; /* pointer to packed name in message */
20 3e0d8fb3 2005-12-27 devnull char *name; /* pointer to unpacked name in buf */
21 3e0d8fb3 2005-12-27 devnull } x[Ndict];
22 3e0d8fb3 2005-12-27 devnull int n; /* size of dictionary */
23 3e0d8fb3 2005-12-27 devnull uchar *start; /* start of packed message */
24 3e0d8fb3 2005-12-27 devnull char buf[4*1024]; /* buffer for unpacked names */
25 3e0d8fb3 2005-12-27 devnull char *ep; /* first free char in buf */
26 3e0d8fb3 2005-12-27 devnull };
27 3e0d8fb3 2005-12-27 devnull
28 3e0d8fb3 2005-12-27 devnull #define NAME(x) p = pname(p, ep, x, dp)
29 3e0d8fb3 2005-12-27 devnull #define SYMBOL(x) p = psym(p, ep, x)
30 3e0d8fb3 2005-12-27 devnull #define STRING(x) p = pstr(p, ep, x)
31 3e0d8fb3 2005-12-27 devnull #define BYTES(x, n) p = pbytes(p, ep, x, n)
32 3e0d8fb3 2005-12-27 devnull #define USHORT(x) p = pushort(p, ep, x)
33 3e0d8fb3 2005-12-27 devnull #define UCHAR(x) p = puchar(p, ep, x)
34 3e0d8fb3 2005-12-27 devnull #define ULONG(x) p = pulong(p, ep, x)
35 3e0d8fb3 2005-12-27 devnull #define V4ADDR(x) p = pv4addr(p, ep, x)
36 3e0d8fb3 2005-12-27 devnull #define V6ADDR(x) p = pv6addr(p, ep, x)
37 3e0d8fb3 2005-12-27 devnull
38 3e0d8fb3 2005-12-27 devnull static uchar*
39 3e0d8fb3 2005-12-27 devnull psym(uchar *p, uchar *ep, char *np)
40 3e0d8fb3 2005-12-27 devnull {
41 3e0d8fb3 2005-12-27 devnull int n;
42 3e0d8fb3 2005-12-27 devnull
43 3e0d8fb3 2005-12-27 devnull n = strlen(np);
44 3e0d8fb3 2005-12-27 devnull if(n >= Strlen) /* DNS maximum length string */
45 3e0d8fb3 2005-12-27 devnull n = Strlen - 1;
46 3e0d8fb3 2005-12-27 devnull if(ep - p < n+1) /* see if it fits in the buffer */
47 3e0d8fb3 2005-12-27 devnull return ep+1;
48 3e0d8fb3 2005-12-27 devnull *p++ = n;
49 3e0d8fb3 2005-12-27 devnull memcpy(p, np, n);
50 3e0d8fb3 2005-12-27 devnull return p + n;
51 3e0d8fb3 2005-12-27 devnull }
52 3e0d8fb3 2005-12-27 devnull
53 3e0d8fb3 2005-12-27 devnull static uchar*
54 3e0d8fb3 2005-12-27 devnull pstr(uchar *p, uchar *ep, char *np)
55 3e0d8fb3 2005-12-27 devnull {
56 3e0d8fb3 2005-12-27 devnull int n;
57 3e0d8fb3 2005-12-27 devnull
58 3e0d8fb3 2005-12-27 devnull n = strlen(np);
59 3e0d8fb3 2005-12-27 devnull if(n >= Strlen) /* DNS maximum length string */
60 3e0d8fb3 2005-12-27 devnull n = Strlen - 1;
61 3e0d8fb3 2005-12-27 devnull if(ep - p < n+1) /* see if it fits in the buffer */
62 3e0d8fb3 2005-12-27 devnull return ep+1;
63 3e0d8fb3 2005-12-27 devnull *p++ = n;
64 3e0d8fb3 2005-12-27 devnull memcpy(p, np, n);
65 3e0d8fb3 2005-12-27 devnull return p + n;
66 3e0d8fb3 2005-12-27 devnull }
67 3e0d8fb3 2005-12-27 devnull
68 3e0d8fb3 2005-12-27 devnull static uchar*
69 3e0d8fb3 2005-12-27 devnull pbytes(uchar *p, uchar *ep, uchar *np, int n)
70 3e0d8fb3 2005-12-27 devnull {
71 3e0d8fb3 2005-12-27 devnull if(ep - p < n)
72 3e0d8fb3 2005-12-27 devnull return ep+1;
73 3e0d8fb3 2005-12-27 devnull memcpy(p, np, n);
74 3e0d8fb3 2005-12-27 devnull return p + n;
75 3e0d8fb3 2005-12-27 devnull }
76 3e0d8fb3 2005-12-27 devnull
77 3e0d8fb3 2005-12-27 devnull static uchar*
78 3e0d8fb3 2005-12-27 devnull puchar(uchar *p, uchar *ep, int val)
79 3e0d8fb3 2005-12-27 devnull {
80 3e0d8fb3 2005-12-27 devnull if(ep - p < 1)
81 3e0d8fb3 2005-12-27 devnull return ep+1;
82 3e0d8fb3 2005-12-27 devnull *p++ = val;
83 3e0d8fb3 2005-12-27 devnull return p;
84 3e0d8fb3 2005-12-27 devnull }
85 3e0d8fb3 2005-12-27 devnull
86 3e0d8fb3 2005-12-27 devnull static uchar*
87 3e0d8fb3 2005-12-27 devnull pushort(uchar *p, uchar *ep, int val)
88 3e0d8fb3 2005-12-27 devnull {
89 3e0d8fb3 2005-12-27 devnull if(ep - p < 2)
90 3e0d8fb3 2005-12-27 devnull return ep+1;
91 3e0d8fb3 2005-12-27 devnull *p++ = val>>8;
92 3e0d8fb3 2005-12-27 devnull *p++ = val;
93 3e0d8fb3 2005-12-27 devnull return p;
94 3e0d8fb3 2005-12-27 devnull }
95 3e0d8fb3 2005-12-27 devnull
96 3e0d8fb3 2005-12-27 devnull static uchar*
97 3e0d8fb3 2005-12-27 devnull pulong(uchar *p, uchar *ep, int val)
98 3e0d8fb3 2005-12-27 devnull {
99 3e0d8fb3 2005-12-27 devnull if(ep - p < 4)
100 3e0d8fb3 2005-12-27 devnull return ep+1;
101 3e0d8fb3 2005-12-27 devnull *p++ = val>>24;
102 3e0d8fb3 2005-12-27 devnull *p++ = val>>16;
103 3e0d8fb3 2005-12-27 devnull *p++ = val>>8;
104 3e0d8fb3 2005-12-27 devnull *p++ = val;
105 3e0d8fb3 2005-12-27 devnull return p;
106 3e0d8fb3 2005-12-27 devnull }
107 3e0d8fb3 2005-12-27 devnull
108 3e0d8fb3 2005-12-27 devnull static uchar*
109 3e0d8fb3 2005-12-27 devnull pv4addr(uchar *p, uchar *ep, char *name)
110 3e0d8fb3 2005-12-27 devnull {
111 3e0d8fb3 2005-12-27 devnull uchar ip[IPaddrlen];
112 3e0d8fb3 2005-12-27 devnull
113 3e0d8fb3 2005-12-27 devnull if(ep - p < 4)
114 3e0d8fb3 2005-12-27 devnull return ep+1;
115 3e0d8fb3 2005-12-27 devnull parseip(ip, name);
116 3e0d8fb3 2005-12-27 devnull v6tov4(p, ip);
117 3e0d8fb3 2005-12-27 devnull return p + 4;
118 3e0d8fb3 2005-12-27 devnull
119 3e0d8fb3 2005-12-27 devnull }
120 3e0d8fb3 2005-12-27 devnull
121 3e0d8fb3 2005-12-27 devnull static uchar*
122 3e0d8fb3 2005-12-27 devnull pv6addr(uchar *p, uchar *ep, char *name)
123 3e0d8fb3 2005-12-27 devnull {
124 3e0d8fb3 2005-12-27 devnull if(ep - p < IPaddrlen)
125 3e0d8fb3 2005-12-27 devnull return ep+1;
126 3e0d8fb3 2005-12-27 devnull parseip(p, name);
127 3e0d8fb3 2005-12-27 devnull return p + IPaddrlen;
128 3e0d8fb3 2005-12-27 devnull
129 3e0d8fb3 2005-12-27 devnull }
130 3e0d8fb3 2005-12-27 devnull
131 3e0d8fb3 2005-12-27 devnull static uchar*
132 3e0d8fb3 2005-12-27 devnull pname(uchar *p, uchar *ep, char *np, Dict *dp)
133 3e0d8fb3 2005-12-27 devnull {
134 3e0d8fb3 2005-12-27 devnull char *cp;
135 3e0d8fb3 2005-12-27 devnull int i;
136 3e0d8fb3 2005-12-27 devnull char *last; /* last component packed */
137 3e0d8fb3 2005-12-27 devnull
138 3e0d8fb3 2005-12-27 devnull if(strlen(np) >= Domlen) /* make sure we don't exceed DNS limits */
139 3e0d8fb3 2005-12-27 devnull return ep+1;
140 3e0d8fb3 2005-12-27 devnull
141 3e0d8fb3 2005-12-27 devnull last = 0;
142 3e0d8fb3 2005-12-27 devnull while(*np){
143 3e0d8fb3 2005-12-27 devnull /* look through every component in the dictionary for a match */
144 3e0d8fb3 2005-12-27 devnull for(i = 0; i < dp->n; i++){
145 3e0d8fb3 2005-12-27 devnull if(strcmp(np, dp->x[i].name) == 0){
146 3e0d8fb3 2005-12-27 devnull if(ep - p < 2)
147 3e0d8fb3 2005-12-27 devnull return ep+1;
148 3e0d8fb3 2005-12-27 devnull *p++ = (dp->x[i].offset>>8) | 0xc0;
149 3e0d8fb3 2005-12-27 devnull *p++ = dp->x[i].offset;
150 3e0d8fb3 2005-12-27 devnull return p;
151 3e0d8fb3 2005-12-27 devnull }
152 3e0d8fb3 2005-12-27 devnull }
153 3e0d8fb3 2005-12-27 devnull
154 3e0d8fb3 2005-12-27 devnull /* if there's room, enter this name in dictionary */
155 3e0d8fb3 2005-12-27 devnull if(dp->n < Ndict){
156 3e0d8fb3 2005-12-27 devnull if(last){
157 3e0d8fb3 2005-12-27 devnull /* the whole name is already in dp->buf */
158 3e0d8fb3 2005-12-27 devnull last = strchr(last, '.') + 1;
159 3e0d8fb3 2005-12-27 devnull dp->x[dp->n].name = last;
160 3e0d8fb3 2005-12-27 devnull dp->x[dp->n].offset = p - dp->start;
161 3e0d8fb3 2005-12-27 devnull dp->n++;
162 3e0d8fb3 2005-12-27 devnull } else {
163 3e0d8fb3 2005-12-27 devnull /* add to dp->buf */
164 3e0d8fb3 2005-12-27 devnull i = strlen(np);
165 3e0d8fb3 2005-12-27 devnull if(dp->ep + i + 1 < &dp->buf[sizeof(dp->buf)]){
166 3e0d8fb3 2005-12-27 devnull strcpy(dp->ep, np);
167 3e0d8fb3 2005-12-27 devnull dp->x[dp->n].name = dp->ep;
168 3e0d8fb3 2005-12-27 devnull last = dp->ep;
169 3e0d8fb3 2005-12-27 devnull dp->x[dp->n].offset = p - dp->start;
170 3e0d8fb3 2005-12-27 devnull dp->ep += i + 1;
171 3e0d8fb3 2005-12-27 devnull dp->n++;
172 3e0d8fb3 2005-12-27 devnull }
173 3e0d8fb3 2005-12-27 devnull }
174 3e0d8fb3 2005-12-27 devnull }
175 3e0d8fb3 2005-12-27 devnull
176 3e0d8fb3 2005-12-27 devnull /* put next component into message */
177 3e0d8fb3 2005-12-27 devnull cp = strchr(np, '.');
178 3e0d8fb3 2005-12-27 devnull if(cp == 0){
179 3e0d8fb3 2005-12-27 devnull i = strlen(np);
180 3e0d8fb3 2005-12-27 devnull cp = np + i; /* point to null terminator */
181 3e0d8fb3 2005-12-27 devnull } else {
182 3e0d8fb3 2005-12-27 devnull i = cp - np;
183 3e0d8fb3 2005-12-27 devnull cp++; /* point past '.' */
184 3e0d8fb3 2005-12-27 devnull }
185 3e0d8fb3 2005-12-27 devnull if(ep-p < i+1)
186 3e0d8fb3 2005-12-27 devnull return ep+1;
187 3e0d8fb3 2005-12-27 devnull *p++ = i; /* count of chars in label */
188 3e0d8fb3 2005-12-27 devnull memcpy(p, np, i);
189 3e0d8fb3 2005-12-27 devnull np = cp;
190 3e0d8fb3 2005-12-27 devnull p += i;
191 3e0d8fb3 2005-12-27 devnull }
192 3e0d8fb3 2005-12-27 devnull
193 3e0d8fb3 2005-12-27 devnull if(p >= ep)
194 3e0d8fb3 2005-12-27 devnull return ep+1;
195 3e0d8fb3 2005-12-27 devnull *p++ = 0; /* add top level domain */
196 3e0d8fb3 2005-12-27 devnull
197 3e0d8fb3 2005-12-27 devnull return p;
198 3e0d8fb3 2005-12-27 devnull }
199 3e0d8fb3 2005-12-27 devnull
200 3e0d8fb3 2005-12-27 devnull static uchar*
201 3e0d8fb3 2005-12-27 devnull convRR2M(RR *rp, uchar *p, uchar *ep, Dict *dp)
202 3e0d8fb3 2005-12-27 devnull {
203 3e0d8fb3 2005-12-27 devnull uchar *lp, *data;
204 3e0d8fb3 2005-12-27 devnull int len, ttl;
205 3e0d8fb3 2005-12-27 devnull Txt *t;
206 3e0d8fb3 2005-12-27 devnull
207 3e0d8fb3 2005-12-27 devnull NAME(rp->owner->name);
208 3e0d8fb3 2005-12-27 devnull USHORT(rp->type);
209 3e0d8fb3 2005-12-27 devnull USHORT(rp->owner->class);
210 3e0d8fb3 2005-12-27 devnull
211 3e0d8fb3 2005-12-27 devnull /* egregious overuse of ttl (it's absolute time in the cache) */
212 3e0d8fb3 2005-12-27 devnull if(rp->db)
213 3e0d8fb3 2005-12-27 devnull ttl = rp->ttl;
214 3e0d8fb3 2005-12-27 devnull else
215 3e0d8fb3 2005-12-27 devnull ttl = rp->ttl - now;
216 3e0d8fb3 2005-12-27 devnull if(ttl < 0)
217 3e0d8fb3 2005-12-27 devnull ttl = 0;
218 3e0d8fb3 2005-12-27 devnull ULONG(ttl);
219 3e0d8fb3 2005-12-27 devnull
220 3e0d8fb3 2005-12-27 devnull lp = p; /* leave room for the rdata length */
221 3e0d8fb3 2005-12-27 devnull p += 2;
222 3e0d8fb3 2005-12-27 devnull data = p;
223 3e0d8fb3 2005-12-27 devnull
224 3e0d8fb3 2005-12-27 devnull if(data >= ep)
225 3e0d8fb3 2005-12-27 devnull return p+1;
226 3e0d8fb3 2005-12-27 devnull
227 3e0d8fb3 2005-12-27 devnull switch(rp->type){
228 3e0d8fb3 2005-12-27 devnull case Thinfo:
229 3e0d8fb3 2005-12-27 devnull SYMBOL(rp->cpu->name);
230 3e0d8fb3 2005-12-27 devnull SYMBOL(rp->os->name);
231 3e0d8fb3 2005-12-27 devnull break;
232 3e0d8fb3 2005-12-27 devnull case Tcname:
233 3e0d8fb3 2005-12-27 devnull case Tmb:
234 3e0d8fb3 2005-12-27 devnull case Tmd:
235 3e0d8fb3 2005-12-27 devnull case Tmf:
236 3e0d8fb3 2005-12-27 devnull case Tns:
237 3e0d8fb3 2005-12-27 devnull NAME(rp->host->name);
238 3e0d8fb3 2005-12-27 devnull break;
239 3e0d8fb3 2005-12-27 devnull case Tmg:
240 3e0d8fb3 2005-12-27 devnull case Tmr:
241 3e0d8fb3 2005-12-27 devnull NAME(rp->mb->name);
242 3e0d8fb3 2005-12-27 devnull break;
243 3e0d8fb3 2005-12-27 devnull case Tminfo:
244 3e0d8fb3 2005-12-27 devnull NAME(rp->rmb->name);
245 3e0d8fb3 2005-12-27 devnull NAME(rp->mb->name);
246 3e0d8fb3 2005-12-27 devnull break;
247 3e0d8fb3 2005-12-27 devnull case Tmx:
248 3e0d8fb3 2005-12-27 devnull USHORT(rp->pref);
249 3e0d8fb3 2005-12-27 devnull NAME(rp->host->name);
250 3e0d8fb3 2005-12-27 devnull break;
251 3e0d8fb3 2005-12-27 devnull case Ta:
252 3e0d8fb3 2005-12-27 devnull V4ADDR(rp->ip->name);
253 3e0d8fb3 2005-12-27 devnull break;
254 3e0d8fb3 2005-12-27 devnull case Taaaa:
255 3e0d8fb3 2005-12-27 devnull V6ADDR(rp->ip->name);
256 3e0d8fb3 2005-12-27 devnull break;
257 3e0d8fb3 2005-12-27 devnull case Tptr:
258 3e0d8fb3 2005-12-27 devnull NAME(rp->ptr->name);
259 3e0d8fb3 2005-12-27 devnull break;
260 3e0d8fb3 2005-12-27 devnull case Tsoa:
261 3e0d8fb3 2005-12-27 devnull NAME(rp->host->name);
262 3e0d8fb3 2005-12-27 devnull NAME(rp->rmb->name);
263 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->serial);
264 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->refresh);
265 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->retry);
266 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->expire);
267 3e0d8fb3 2005-12-27 devnull ULONG(rp->soa->minttl);
268 3e0d8fb3 2005-12-27 devnull break;
269 3e0d8fb3 2005-12-27 devnull case Ttxt:
270 3e0d8fb3 2005-12-27 devnull for(t = rp->txt; t != nil; t = t->next)
271 3e0d8fb3 2005-12-27 devnull STRING(t->p);
272 3e0d8fb3 2005-12-27 devnull break;
273 3e0d8fb3 2005-12-27 devnull case Tnull:
274 3e0d8fb3 2005-12-27 devnull BYTES(rp->null->data, rp->null->dlen);
275 3e0d8fb3 2005-12-27 devnull break;
276 3e0d8fb3 2005-12-27 devnull case Trp:
277 3e0d8fb3 2005-12-27 devnull NAME(rp->rmb->name);
278 3e0d8fb3 2005-12-27 devnull NAME(rp->rp->name);
279 3e0d8fb3 2005-12-27 devnull break;
280 3e0d8fb3 2005-12-27 devnull case Tkey:
281 3e0d8fb3 2005-12-27 devnull USHORT(rp->key->flags);
282 3e0d8fb3 2005-12-27 devnull UCHAR(rp->key->proto);
283 3e0d8fb3 2005-12-27 devnull UCHAR(rp->key->alg);
284 3e0d8fb3 2005-12-27 devnull BYTES(rp->key->data, rp->key->dlen);
285 3e0d8fb3 2005-12-27 devnull break;
286 3e0d8fb3 2005-12-27 devnull case Tsig:
287 3e0d8fb3 2005-12-27 devnull USHORT(rp->sig->type);
288 3e0d8fb3 2005-12-27 devnull UCHAR(rp->sig->alg);
289 3e0d8fb3 2005-12-27 devnull UCHAR(rp->sig->labels);
290 3e0d8fb3 2005-12-27 devnull ULONG(rp->sig->ttl);
291 3e0d8fb3 2005-12-27 devnull ULONG(rp->sig->exp);
292 3e0d8fb3 2005-12-27 devnull ULONG(rp->sig->incep);
293 3e0d8fb3 2005-12-27 devnull USHORT(rp->sig->tag);
294 3e0d8fb3 2005-12-27 devnull NAME(rp->sig->signer->name);
295 3e0d8fb3 2005-12-27 devnull BYTES(rp->sig->data, rp->sig->dlen);
296 3e0d8fb3 2005-12-27 devnull break;
297 3e0d8fb3 2005-12-27 devnull case Tcert:
298 3e0d8fb3 2005-12-27 devnull USHORT(rp->cert->type);
299 3e0d8fb3 2005-12-27 devnull USHORT(rp->cert->tag);
300 3e0d8fb3 2005-12-27 devnull UCHAR(rp->cert->alg);
301 3e0d8fb3 2005-12-27 devnull BYTES(rp->cert->data, rp->cert->dlen);
302 3e0d8fb3 2005-12-27 devnull break;
303 3e0d8fb3 2005-12-27 devnull }
304 3e0d8fb3 2005-12-27 devnull
305 3e0d8fb3 2005-12-27 devnull /* stuff in the rdata section length */
306 3e0d8fb3 2005-12-27 devnull len = p - data;
307 3e0d8fb3 2005-12-27 devnull *lp++ = len >> 8;
308 3e0d8fb3 2005-12-27 devnull *lp = len;
309 3e0d8fb3 2005-12-27 devnull
310 3e0d8fb3 2005-12-27 devnull return p;
311 3e0d8fb3 2005-12-27 devnull }
312 3e0d8fb3 2005-12-27 devnull
313 3e0d8fb3 2005-12-27 devnull static uchar*
314 3e0d8fb3 2005-12-27 devnull convQ2M(RR *rp, uchar *p, uchar *ep, Dict *dp)
315 3e0d8fb3 2005-12-27 devnull {
316 3e0d8fb3 2005-12-27 devnull NAME(rp->owner->name);
317 3e0d8fb3 2005-12-27 devnull USHORT(rp->type);
318 3e0d8fb3 2005-12-27 devnull USHORT(rp->owner->class);
319 3e0d8fb3 2005-12-27 devnull return p;
320 3e0d8fb3 2005-12-27 devnull }
321 3e0d8fb3 2005-12-27 devnull
322 3e0d8fb3 2005-12-27 devnull static uchar*
323 3e0d8fb3 2005-12-27 devnull rrloop(RR *rp, int *countp, uchar *p, uchar *ep, Dict *dp, int quest)
324 3e0d8fb3 2005-12-27 devnull {
325 3e0d8fb3 2005-12-27 devnull uchar *np;
326 3e0d8fb3 2005-12-27 devnull
327 3e0d8fb3 2005-12-27 devnull *countp = 0;
328 3e0d8fb3 2005-12-27 devnull for(; rp && p < ep; rp = rp->next){
329 3e0d8fb3 2005-12-27 devnull if(quest)
330 3e0d8fb3 2005-12-27 devnull np = convQ2M(rp, p, ep, dp);
331 3e0d8fb3 2005-12-27 devnull else
332 3e0d8fb3 2005-12-27 devnull np = convRR2M(rp, p, ep, dp);
333 3e0d8fb3 2005-12-27 devnull if(np > ep)
334 3e0d8fb3 2005-12-27 devnull break;
335 3e0d8fb3 2005-12-27 devnull p = np;
336 3e0d8fb3 2005-12-27 devnull (*countp)++;
337 3e0d8fb3 2005-12-27 devnull }
338 3e0d8fb3 2005-12-27 devnull return p;
339 3e0d8fb3 2005-12-27 devnull }
340 3e0d8fb3 2005-12-27 devnull
341 3e0d8fb3 2005-12-27 devnull /*
342 3e0d8fb3 2005-12-27 devnull * convert into a message
343 3e0d8fb3 2005-12-27 devnull */
344 3e0d8fb3 2005-12-27 devnull int
345 3e0d8fb3 2005-12-27 devnull convDNS2M(DNSmsg *m, uchar *buf, int len)
346 3e0d8fb3 2005-12-27 devnull {
347 3e0d8fb3 2005-12-27 devnull uchar *p, *ep, *np;
348 3e0d8fb3 2005-12-27 devnull Dict d;
349 3e0d8fb3 2005-12-27 devnull
350 3e0d8fb3 2005-12-27 devnull d.n = 0;
351 3e0d8fb3 2005-12-27 devnull d.start = buf;
352 3e0d8fb3 2005-12-27 devnull d.ep = d.buf;
353 3e0d8fb3 2005-12-27 devnull memset(buf, 0, len);
354 3e0d8fb3 2005-12-27 devnull m->qdcount = m->ancount = m->nscount = m->arcount = 0;
355 3e0d8fb3 2005-12-27 devnull
356 3e0d8fb3 2005-12-27 devnull /* first pack in the RR's so we can get real counts */
357 3e0d8fb3 2005-12-27 devnull p = buf + 12;
358 3e0d8fb3 2005-12-27 devnull ep = buf + len;
359 3e0d8fb3 2005-12-27 devnull p = rrloop(m->qd, &m->qdcount, p, ep, &d, 1);
360 3e0d8fb3 2005-12-27 devnull p = rrloop(m->an, &m->ancount, p, ep, &d, 0);
361 3e0d8fb3 2005-12-27 devnull p = rrloop(m->ns, &m->nscount, p, ep, &d, 0);
362 3e0d8fb3 2005-12-27 devnull p = rrloop(m->ar, &m->arcount, p, ep, &d, 0);
363 3e0d8fb3 2005-12-27 devnull if(p > ep)
364 3e0d8fb3 2005-12-27 devnull return -1;
365 3e0d8fb3 2005-12-27 devnull
366 3e0d8fb3 2005-12-27 devnull /* now pack the rest */
367 3e0d8fb3 2005-12-27 devnull np = p;
368 3e0d8fb3 2005-12-27 devnull p = buf;
369 3e0d8fb3 2005-12-27 devnull ep = buf + len;
370 3e0d8fb3 2005-12-27 devnull USHORT(m->id);
371 3e0d8fb3 2005-12-27 devnull USHORT(m->flags);
372 3e0d8fb3 2005-12-27 devnull USHORT(m->qdcount);
373 3e0d8fb3 2005-12-27 devnull USHORT(m->ancount);
374 3e0d8fb3 2005-12-27 devnull USHORT(m->nscount);
375 3e0d8fb3 2005-12-27 devnull USHORT(m->arcount);
376 3e0d8fb3 2005-12-27 devnull if(p > ep)
377 3e0d8fb3 2005-12-27 devnull return -1;
378 3e0d8fb3 2005-12-27 devnull
379 3e0d8fb3 2005-12-27 devnull return np - buf;
380 3e0d8fb3 2005-12-27 devnull }