diff options
author | dm <> | 1996-02-19 19:53:30 +0000 |
---|---|---|
committer | dm <> | 1996-02-19 19:53:30 +0000 |
commit | 543eeae2382e5de0b9518bdd9f7a75e5686fd056 (patch) | |
tree | 094165ba891a348ad41b10f58ccb57f1a01f8e74 /src/lib/libc/net/res_debug.c | |
parent | 4a12c1341f3a7e10bd98cebfe52fc96867f82baf (diff) | |
download | openbsd-543eeae2382e5de0b9518bdd9f7a75e5686fd056.tar.gz openbsd-543eeae2382e5de0b9518bdd9f7a75e5686fd056.tar.bz2 openbsd-543eeae2382e5de0b9518bdd9f7a75e5686fd056.zip |
netbsd: bind 4.9.3
Diffstat (limited to 'src/lib/libc/net/res_debug.c')
-rw-r--r-- | src/lib/libc/net/res_debug.c | 513 |
1 files changed, 297 insertions, 216 deletions
diff --git a/src/lib/libc/net/res_debug.c b/src/lib/libc/net/res_debug.c index d841293f18..14e5ddf790 100644 --- a/src/lib/libc/net/res_debug.c +++ b/src/lib/libc/net/res_debug.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $NetBSD: res_debug.c,v 1.7 1995/02/25 06:20:56 cgd Exp $ */ | 1 | /* $NetBSD: res_debug.c,v 1.8 1996/02/02 15:22:27 mrg Exp $ */ |
2 | 2 | ||
3 | /*- | 3 | /*- |
4 | * Copyright (c) 1985, 1990, 1993 | 4 | * Copyright (c) 1985, 1990, 1993 |
@@ -56,8 +56,9 @@ | |||
56 | #if defined(LIBC_SCCS) && !defined(lint) | 56 | #if defined(LIBC_SCCS) && !defined(lint) |
57 | #if 0 | 57 | #if 0 |
58 | static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; | 58 | static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; |
59 | static char rcsid[] = "$Id: res_debug.c,v 8.7 1995/12/22 10:20:39 vixie Exp "; | ||
59 | #else | 60 | #else |
60 | static char rcsid[] = "$NetBSD: res_debug.c,v 1.7 1995/02/25 06:20:56 cgd Exp $"; | 61 | static char rcsid[] = "$NetBSD: res_debug.c,v 1.8 1996/02/02 15:22:27 mrg Exp $"; |
61 | #endif | 62 | #endif |
62 | #endif /* LIBC_SCCS and not lint */ | 63 | #endif /* LIBC_SCCS and not lint */ |
63 | 64 | ||
@@ -68,18 +69,16 @@ static char rcsid[] = "$NetBSD: res_debug.c,v 1.7 1995/02/25 06:20:56 cgd Exp $" | |||
68 | #include <resolv.h> | 69 | #include <resolv.h> |
69 | #include <stdio.h> | 70 | #include <stdio.h> |
70 | #include <string.h> | 71 | #include <string.h> |
72 | #include <netdb.h> | ||
71 | 73 | ||
72 | void __fp_query(); | 74 | void __fp_query(); |
73 | char *__p_class(), *__p_time(), *__p_type(); | ||
74 | char *p_cdname(), *p_fqname(), *p_rr(); | ||
75 | static char *p_option __P((u_int32_t)); | ||
76 | 75 | ||
77 | char *_res_opcodes[] = { | 76 | char *_res_opcodes[] = { |
78 | "QUERY", | 77 | "QUERY", |
79 | "IQUERY", | 78 | "IQUERY", |
80 | "CQUERYM", | 79 | "CQUERYM", |
81 | "CQUERYU", | 80 | "CQUERYU", /* experimental */ |
82 | "4", | 81 | "NOTIFY", /* experimental */ |
83 | "5", | 82 | "5", |
84 | "6", | 83 | "6", |
85 | "7", | 84 | "7", |
@@ -112,102 +111,118 @@ char *_res_resultcodes[] = { | |||
112 | "NOCHANGE", | 111 | "NOCHANGE", |
113 | }; | 112 | }; |
114 | 113 | ||
115 | static char retbuf[16]; | ||
116 | |||
117 | static char * | 114 | static char * |
118 | dewks(wks) | 115 | dewks(wks) |
119 | int wks; | 116 | int wks; |
120 | { | 117 | { |
118 | static char nbuf[20]; | ||
119 | |||
121 | switch (wks) { | 120 | switch (wks) { |
122 | case 5: return("rje"); | 121 | case 5: return "rje"; |
123 | case 7: return("echo"); | 122 | case 7: return "echo"; |
124 | case 9: return("discard"); | 123 | case 9: return "discard"; |
125 | case 11: return("systat"); | 124 | case 11: return "systat"; |
126 | case 13: return("daytime"); | 125 | case 13: return "daytime"; |
127 | case 15: return("netstat"); | 126 | case 15: return "netstat"; |
128 | case 17: return("qotd"); | 127 | case 17: return "qotd"; |
129 | case 19: return("chargen"); | 128 | case 19: return "chargen"; |
130 | case 20: return("ftp-data"); | 129 | case 20: return "ftp-data"; |
131 | case 21: return("ftp"); | 130 | case 21: return "ftp"; |
132 | case 23: return("telnet"); | 131 | case 23: return "telnet"; |
133 | case 25: return("smtp"); | 132 | case 25: return "smtp"; |
134 | case 37: return("time"); | 133 | case 37: return "time"; |
135 | case 39: return("rlp"); | 134 | case 39: return "rlp"; |
136 | case 42: return("name"); | 135 | case 42: return "name"; |
137 | case 43: return("whois"); | 136 | case 43: return "whois"; |
138 | case 53: return("domain"); | 137 | case 53: return "domain"; |
139 | case 57: return("apts"); | 138 | case 57: return "apts"; |
140 | case 59: return("apfs"); | 139 | case 59: return "apfs"; |
141 | case 67: return("bootps"); | 140 | case 67: return "bootps"; |
142 | case 68: return("bootpc"); | 141 | case 68: return "bootpc"; |
143 | case 69: return("tftp"); | 142 | case 69: return "tftp"; |
144 | case 77: return("rje"); | 143 | case 77: return "rje"; |
145 | case 79: return("finger"); | 144 | case 79: return "finger"; |
146 | case 87: return("link"); | 145 | case 87: return "link"; |
147 | case 95: return("supdup"); | 146 | case 95: return "supdup"; |
148 | case 100: return("newacct"); | 147 | case 100: return "newacct"; |
149 | case 101: return("hostnames"); | 148 | case 101: return "hostnames"; |
150 | case 102: return("iso-tsap"); | 149 | case 102: return "iso-tsap"; |
151 | case 103: return("x400"); | 150 | case 103: return "x400"; |
152 | case 104: return("x400-snd"); | 151 | case 104: return "x400-snd"; |
153 | case 105: return("csnet-ns"); | 152 | case 105: return "csnet-ns"; |
154 | case 109: return("pop-2"); | 153 | case 109: return "pop-2"; |
155 | case 111: return("sunrpc"); | 154 | case 111: return "sunrpc"; |
156 | case 113: return("auth"); | 155 | case 113: return "auth"; |
157 | case 115: return("sftp"); | 156 | case 115: return "sftp"; |
158 | case 117: return("uucp-path"); | 157 | case 117: return "uucp-path"; |
159 | case 119: return("nntp"); | 158 | case 119: return "nntp"; |
160 | case 121: return("erpc"); | 159 | case 121: return "erpc"; |
161 | case 123: return("ntp"); | 160 | case 123: return "ntp"; |
162 | case 133: return("statsrv"); | 161 | case 133: return "statsrv"; |
163 | case 136: return("profile"); | 162 | case 136: return "profile"; |
164 | case 144: return("NeWS"); | 163 | case 144: return "NeWS"; |
165 | case 161: return("snmp"); | 164 | case 161: return "snmp"; |
166 | case 162: return("snmp-trap"); | 165 | case 162: return "snmp-trap"; |
167 | case 170: return("print-srv"); | 166 | case 170: return "print-srv"; |
168 | default: (void) sprintf(retbuf, "%d", wks); return(retbuf); | 167 | default: (void) sprintf(nbuf, "%d", wks); return (nbuf); |
169 | } | 168 | } |
170 | } | 169 | } |
171 | 170 | ||
172 | static char * | 171 | /* XXX: we should use getprotobynumber() instead. */ |
172 | static const char * | ||
173 | deproto(protonum) | 173 | deproto(protonum) |
174 | int protonum; | 174 | int protonum; |
175 | { | 175 | { |
176 | static char nbuf[20]; | ||
177 | |||
176 | switch (protonum) { | 178 | switch (protonum) { |
177 | case 1: return("icmp"); | 179 | case 1: return "icmp"; |
178 | case 2: return("igmp"); | 180 | case 2: return "igmp"; |
179 | case 3: return("ggp"); | 181 | case 3: return "ggp"; |
180 | case 5: return("st"); | 182 | case 5: return "st"; |
181 | case 6: return("tcp"); | 183 | case 6: return "tcp"; |
182 | case 7: return("ucl"); | 184 | case 7: return "ucl"; |
183 | case 8: return("egp"); | 185 | case 8: return "egp"; |
184 | case 9: return("igp"); | 186 | case 9: return "igp"; |
185 | case 11: return("nvp-II"); | 187 | case 11: return "nvp-II"; |
186 | case 12: return("pup"); | 188 | case 12: return "pup"; |
187 | case 16: return("chaos"); | 189 | case 16: return "chaos"; |
188 | case 17: return("udp"); | 190 | case 17: return "udp"; |
189 | default: (void) sprintf(retbuf, "%d", protonum); return(retbuf); | 191 | default: (void) sprintf(nbuf, "%d", protonum); return (nbuf); |
190 | } | 192 | } |
191 | } | 193 | } |
192 | 194 | ||
193 | static char * | 195 | static const u_char * |
194 | do_rrset(msg, cp, cnt, pflag, file, hs) | 196 | do_rrset(msg, len, cp, cnt, pflag, file, hs) |
195 | int cnt, pflag; | 197 | int cnt, pflag, len; |
196 | char *cp,*msg, *hs; | 198 | const u_char *cp, *msg; |
199 | const char *hs; | ||
197 | FILE *file; | 200 | FILE *file; |
198 | { | 201 | { |
199 | int n; | 202 | int n; |
200 | int sflag; | 203 | int sflag; |
204 | |||
201 | /* | 205 | /* |
202 | * Print answer records | 206 | * Print answer records. |
203 | */ | 207 | */ |
204 | sflag = (_res.pfcode & pflag); | 208 | sflag = (_res.pfcode & pflag); |
205 | if (n = ntohs(cnt)) { | 209 | if (n = ntohs(cnt)) { |
206 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) | 210 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) |
207 | fprintf(file, hs); | 211 | fprintf(file, hs); |
208 | while (--n >= 0) { | 212 | while (--n >= 0) { |
209 | cp = p_rr(cp, msg, file); | 213 | if ((!_res.pfcode) || sflag) { |
210 | if ((cp-msg) > PACKETSZ) | 214 | cp = p_rr(cp, msg, file); |
215 | } else { | ||
216 | unsigned int dlen; | ||
217 | cp += __dn_skipname(cp, cp + MAXCDNAME); | ||
218 | cp += sizeof(u_int16_t); | ||
219 | cp += sizeof(u_int16_t); | ||
220 | cp += sizeof(u_int32_t); | ||
221 | dlen = _getshort((u_char*)cp); | ||
222 | cp += sizeof(u_int16_t); | ||
223 | cp += dlen; | ||
224 | } | ||
225 | if ((cp - msg) > len) | ||
211 | return (NULL); | 226 | return (NULL); |
212 | } | 227 | } |
213 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) | 228 | if ((!_res.pfcode) || ((sflag) && (_res.pfcode & RES_PRF_HEAD1))) |
@@ -216,8 +231,9 @@ do_rrset(msg, cp, cnt, pflag, file, hs) | |||
216 | return(cp); | 231 | return(cp); |
217 | } | 232 | } |
218 | 233 | ||
234 | void | ||
219 | __p_query(msg) | 235 | __p_query(msg) |
220 | char *msg; | 236 | const u_char *msg; |
221 | { | 237 | { |
222 | __fp_query(msg, stdout); | 238 | __fp_query(msg, stdout); |
223 | } | 239 | } |
@@ -231,15 +247,14 @@ __fp_resstat(statp, file) | |||
231 | struct __res_state *statp; | 247 | struct __res_state *statp; |
232 | FILE *file; | 248 | FILE *file; |
233 | { | 249 | { |
234 | int bit; | 250 | register u_long mask; |
235 | 251 | ||
236 | fprintf(file, ";; res options:"); | 252 | fprintf(file, ";; res options:"); |
237 | if (!statp) | 253 | if (!statp) |
238 | statp = &_res; | 254 | statp = &_res; |
239 | for (bit = 0; bit < 32; bit++) { /* XXX 32 - bad assumption! */ | 255 | for (mask = 1; mask != 0; mask <<= 1) |
240 | if (statp->options & (1<<bit)) | 256 | if (statp->options & mask) |
241 | fprintf(file, " %s", p_option(1<<bit)); | 257 | fprintf(file, " %s", p_option(mask)); |
242 | } | ||
243 | putc('\n', file); | 258 | putc('\n', file); |
244 | } | 259 | } |
245 | 260 | ||
@@ -248,19 +263,27 @@ __fp_resstat(statp, file) | |||
248 | * This is intended to be primarily a debugging routine. | 263 | * This is intended to be primarily a debugging routine. |
249 | */ | 264 | */ |
250 | void | 265 | void |
251 | __fp_query(msg,file) | 266 | __fp_nquery(msg, len, file) |
252 | char *msg; | 267 | const u_char *msg; |
268 | int len; | ||
253 | FILE *file; | 269 | FILE *file; |
254 | { | 270 | { |
255 | register char *cp; | 271 | register const u_char *cp, *endMark; |
256 | register HEADER *hp; | 272 | register const HEADER *hp; |
257 | register int n; | 273 | register int n; |
258 | 274 | ||
275 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) | ||
276 | return; | ||
277 | |||
278 | #define TruncTest(x) if (x >= endMark) goto trunc | ||
279 | #define ErrorTest(x) if (x == NULL) goto error | ||
280 | |||
259 | /* | 281 | /* |
260 | * Print header fields. | 282 | * Print header fields. |
261 | */ | 283 | */ |
262 | hp = (HEADER *)msg; | 284 | hp = (HEADER *)msg; |
263 | cp = msg + sizeof(HEADER); | 285 | cp = msg + HFIXEDSZ; |
286 | endMark = cp + len; | ||
264 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || hp->rcode) { | 287 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX) || hp->rcode) { |
265 | fprintf(file,";; ->>HEADER<<- opcode: %s, status: %s, id: %d", | 288 | fprintf(file,";; ->>HEADER<<- opcode: %s, status: %s, id: %d", |
266 | _res_opcodes[hp->opcode], | 289 | _res_opcodes[hp->opcode], |
@@ -268,7 +291,8 @@ __fp_query(msg,file) | |||
268 | ntohs(hp->id)); | 291 | ntohs(hp->id)); |
269 | putc('\n', file); | 292 | putc('\n', file); |
270 | } | 293 | } |
271 | putc(';', file); | 294 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEADX)) |
295 | putc(';', file); | ||
272 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) { | 296 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD2)) { |
273 | fprintf(file,"; flags:"); | 297 | fprintf(file,"; flags:"); |
274 | if (hp->qr) | 298 | if (hp->qr) |
@@ -281,20 +305,17 @@ __fp_query(msg,file) | |||
281 | fprintf(file," rd"); | 305 | fprintf(file," rd"); |
282 | if (hp->ra) | 306 | if (hp->ra) |
283 | fprintf(file," ra"); | 307 | fprintf(file," ra"); |
284 | if (hp->pr) | ||
285 | fprintf(file," pr"); | ||
286 | } | 308 | } |
287 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) { | 309 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_HEAD1)) { |
288 | fprintf(file,"; Ques: %d", ntohs(hp->qdcount)); | 310 | fprintf(file,"; Ques: %d", ntohs(hp->qdcount)); |
289 | fprintf(file,", Ans: %d", ntohs(hp->ancount)); | 311 | fprintf(file,", Ans: %d", ntohs(hp->ancount)); |
290 | fprintf(file,", Auth: %d", ntohs(hp->nscount)); | 312 | fprintf(file,", Auth: %d", ntohs(hp->nscount)); |
291 | fprintf(file,", Addit: %d\n", ntohs(hp->arcount)); | 313 | fprintf(file, ", Addit: %d", ntohs(hp->arcount)); |
292 | } | 314 | } |
293 | #if 0 | 315 | if ((!_res.pfcode) || (_res.pfcode & |
294 | if (_res.pfcode & (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1)) { | 316 | (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1))) { |
295 | putc('\n',file); | 317 | putc('\n',file); |
296 | } | 318 | } |
297 | #endif | ||
298 | /* | 319 | /* |
299 | * Print question records. | 320 | * Print question records. |
300 | */ | 321 | */ |
@@ -302,55 +323,85 @@ __fp_query(msg,file) | |||
302 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 323 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) |
303 | fprintf(file,";; QUESTIONS:\n"); | 324 | fprintf(file,";; QUESTIONS:\n"); |
304 | while (--n >= 0) { | 325 | while (--n >= 0) { |
326 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | ||
305 | fprintf(file,";;\t"); | 327 | fprintf(file,";;\t"); |
306 | cp = p_cdname(cp, msg, file); | 328 | TruncTest(cp); |
307 | if (cp == NULL) | 329 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) |
308 | return; | 330 | cp = p_cdnname(cp, msg, len, file); |
331 | else { | ||
332 | int n; | ||
333 | char name[MAXDNAME]; | ||
334 | |||
335 | if ((n = dn_expand(msg, msg+len, cp, name, | ||
336 | sizeof name)) < 0) | ||
337 | cp = NULL; | ||
338 | else | ||
339 | cp += n; | ||
340 | } | ||
341 | ErrorTest(cp); | ||
342 | TruncTest(cp); | ||
309 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 343 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) |
310 | fprintf(file, ", type = %s", | 344 | fprintf(file, ", type = %s", |
311 | __p_type(_getshort(cp))); | 345 | __p_type(_getshort((u_char*)cp))); |
312 | cp += sizeof(u_int16_t); | 346 | cp += INT16SZ; |
347 | TruncTest(cp); | ||
313 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | 348 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) |
314 | fprintf(file, ", class = %s\n\n", | 349 | fprintf(file, ", class = %s\n", |
315 | __p_class(_getshort(cp))); | 350 | __p_class(_getshort((u_char*)cp))); |
316 | cp += sizeof(u_int16_t); | 351 | cp += INT16SZ; |
352 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_QUES)) | ||
353 | putc('\n', file); | ||
317 | } | 354 | } |
318 | } | 355 | } |
319 | /* | 356 | /* |
320 | * Print authoritative answer records | 357 | * Print authoritative answer records |
321 | */ | 358 | */ |
322 | cp = do_rrset(msg, cp, hp->ancount, RES_PRF_ANS, file, | 359 | TruncTest(cp); |
360 | cp = do_rrset(msg, len, cp, hp->ancount, RES_PRF_ANS, file, | ||
323 | ";; ANSWERS:\n"); | 361 | ";; ANSWERS:\n"); |
324 | if (cp == NULL) | 362 | ErrorTest(cp); |
325 | return; | ||
326 | 363 | ||
327 | /* | 364 | /* |
328 | * print name server records | 365 | * print name server records |
329 | */ | 366 | */ |
330 | cp = do_rrset(msg, cp, hp->nscount, RES_PRF_AUTH, file, | 367 | TruncTest(cp); |
368 | cp = do_rrset(msg, len, cp, hp->nscount, RES_PRF_AUTH, file, | ||
331 | ";; AUTHORITY RECORDS:\n"); | 369 | ";; AUTHORITY RECORDS:\n"); |
332 | if (!cp) | 370 | ErrorTest(cp); |
333 | return; | ||
334 | 371 | ||
372 | TruncTest(cp); | ||
335 | /* | 373 | /* |
336 | * print additional records | 374 | * print additional records |
337 | */ | 375 | */ |
338 | cp = do_rrset(msg, cp, hp->arcount, RES_PRF_ADD, file, | 376 | cp = do_rrset(msg, len, cp, hp->arcount, RES_PRF_ADD, file, |
339 | ";; ADDITIONAL RECORDS:\n"); | 377 | ";; ADDITIONAL RECORDS:\n"); |
340 | if (!cp) | 378 | ErrorTest(cp); |
379 | return; | ||
380 | trunc: | ||
381 | fprintf(file, "\n;; ...truncated\n"); | ||
341 | return; | 382 | return; |
383 | error: | ||
384 | fprintf(file, "\n;; ...malformed\n"); | ||
342 | } | 385 | } |
343 | 386 | ||
344 | char * | 387 | void |
345 | p_cdname(cp, msg, file) | 388 | __fp_query(msg, file) |
346 | char *cp, *msg; | 389 | const u_char *msg; |
390 | FILE *file; | ||
391 | { | ||
392 | fp_nquery(msg, PACKETSZ, file); | ||
393 | } | ||
394 | |||
395 | const u_char * | ||
396 | __p_cdnname(cp, msg, len, file) | ||
397 | const u_char *cp, *msg; | ||
398 | int len; | ||
347 | FILE *file; | 399 | FILE *file; |
348 | { | 400 | { |
349 | char name[MAXDNAME]; | 401 | char name[MAXDNAME]; |
350 | int n; | 402 | int n; |
351 | 403 | ||
352 | if ((n = dn_expand((u_char *)msg, (u_char *)cp + MAXCDNAME, | 404 | if ((n = dn_expand(msg, msg + len, cp, name, sizeof name)) < 0) |
353 | (u_char *)cp, (u_char *)name, sizeof(name))) < 0) | ||
354 | return (NULL); | 405 | return (NULL); |
355 | if (name[0] == '\0') | 406 | if (name[0] == '\0') |
356 | putc('.', file); | 407 | putc('.', file); |
@@ -359,16 +410,26 @@ p_cdname(cp, msg, file) | |||
359 | return (cp + n); | 410 | return (cp + n); |
360 | } | 411 | } |
361 | 412 | ||
362 | char * | 413 | const u_char * |
363 | p_fqname(cp, msg, file) | 414 | __p_cdname(cp, msg, file) |
364 | char *cp, *msg; | 415 | const u_char *cp, *msg; |
416 | FILE *file; | ||
417 | { | ||
418 | return (p_cdnname(cp, msg, PACKETSZ, file)); | ||
419 | } | ||
420 | |||
421 | /* XXX: the rest of these functions need to become length-limited, too. (vix) | ||
422 | */ | ||
423 | |||
424 | const u_char * | ||
425 | __p_fqname(cp, msg, file) | ||
426 | const u_char *cp, *msg; | ||
365 | FILE *file; | 427 | FILE *file; |
366 | { | 428 | { |
367 | char name[MAXDNAME]; | 429 | char name[MAXDNAME]; |
368 | int n, len; | 430 | int n; |
369 | 431 | ||
370 | if ((n = dn_expand((u_char *)msg, (u_char *)cp + MAXCDNAME, | 432 | if ((n = dn_expand(msg, cp + MAXCDNAME, cp, name, sizeof name)) < 0) |
371 | (u_char *)cp, (u_char *)name, sizeof(name))) < 0) | ||
372 | return (NULL); | 433 | return (NULL); |
373 | if (name[0] == '\0') { | 434 | if (name[0] == '\0') { |
374 | putc('.', file); | 435 | putc('.', file); |
@@ -383,17 +444,21 @@ p_fqname(cp, msg, file) | |||
383 | /* | 444 | /* |
384 | * Print resource record fields in human readable form. | 445 | * Print resource record fields in human readable form. |
385 | */ | 446 | */ |
386 | char * | 447 | const u_char * |
387 | p_rr(cp, msg, file) | 448 | __p_rr(cp, msg, file) |
388 | char *cp, *msg; | 449 | const u_char *cp, *msg; |
389 | FILE *file; | 450 | FILE *file; |
390 | { | 451 | { |
391 | int type, class, dlen, n, c; | 452 | int type, class, dlen, n, c; |
392 | struct in_addr inaddr; | 453 | struct in_addr inaddr; |
393 | char *cp1, *cp2; | 454 | const u_char *cp1, *cp2; |
394 | u_int32_t tmpttl, t; | 455 | u_int32_t tmpttl, t; |
395 | int lcnt; | 456 | int lcnt; |
396 | 457 | ||
458 | if ((_res.options & RES_INIT) == 0 && res_init() == -1) { | ||
459 | h_errno = NETDB_INTERNAL; | ||
460 | return (NULL); | ||
461 | } | ||
397 | if ((cp = p_fqname(cp, msg, file)) == NULL) | 462 | if ((cp = p_fqname(cp, msg, file)) == NULL) |
398 | return (NULL); /* compression error */ | 463 | return (NULL); /* compression error */ |
399 | type = _getshort(cp); | 464 | type = _getshort(cp); |
@@ -406,7 +471,7 @@ p_rr(cp, msg, file) | |||
406 | cp += sizeof(u_int16_t); | 471 | cp += sizeof(u_int16_t); |
407 | cp1 = cp; | 472 | cp1 = cp; |
408 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_TTLID)) | 473 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_TTLID)) |
409 | fprintf(file, "\t%lu", tmpttl); | 474 | fprintf(file, "\t%lu", (u_long)tmpttl); |
410 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_CLASS)) | 475 | if ((!_res.pfcode) || (_res.pfcode & RES_PRF_CLASS)) |
411 | fprintf(file, "\t%s", __p_class(class)); | 476 | fprintf(file, "\t%s", __p_class(class)); |
412 | fprintf(file, "\t%s", __p_type(type)); | 477 | fprintf(file, "\t%s", __p_type(type)); |
@@ -429,7 +494,7 @@ p_rr(cp, msg, file) | |||
429 | 494 | ||
430 | address = inet_ntoa(inaddr); | 495 | address = inet_ntoa(inaddr); |
431 | cp += sizeof(inaddr); | 496 | cp += sizeof(inaddr); |
432 | protocol = *(u_char*)cp; | 497 | protocol = *cp; |
433 | cp += sizeof(u_char); | 498 | cp += sizeof(u_char); |
434 | port = _getshort(cp); | 499 | port = _getshort(cp); |
435 | cp += sizeof(u_int16_t); | 500 | cp += sizeof(u_int16_t); |
@@ -448,52 +513,75 @@ p_rr(cp, msg, file) | |||
448 | case T_NS: | 513 | case T_NS: |
449 | case T_PTR: | 514 | case T_PTR: |
450 | putc('\t', file); | 515 | putc('\t', file); |
451 | cp = p_fqname(cp, msg, file); | 516 | if ((cp = p_fqname(cp, msg, file)) == NULL) |
517 | return (NULL); | ||
452 | break; | 518 | break; |
453 | 519 | ||
454 | case T_HINFO: | 520 | case T_HINFO: |
521 | case T_ISDN: | ||
522 | cp2 = cp + dlen; | ||
455 | if (n = *cp++) { | 523 | if (n = *cp++) { |
456 | fprintf(file,"\t%.*s", n, cp); | 524 | fprintf(file,"\t%.*s", n, cp); |
457 | cp += n; | 525 | cp += n; |
458 | } | 526 | } |
459 | if (n = *cp++) { | 527 | if ((cp < cp2) && (n = *cp++)) { |
460 | fprintf(file,"\t%.*s", n, cp); | 528 | fprintf(file,"\t%.*s", n, cp); |
461 | cp += n; | 529 | cp += n; |
462 | } | 530 | } else if (type == T_HINFO) |
531 | fprintf(file, "\n;; *** Warning *** OS-type missing"); | ||
463 | break; | 532 | break; |
464 | 533 | ||
465 | case T_SOA: | 534 | case T_SOA: |
466 | putc('\t', file); | 535 | putc('\t', file); |
467 | cp = p_fqname(cp, msg, file); /* origin */ | 536 | if ((cp = p_fqname(cp, msg, file)) == NULL) |
537 | return (NULL); | ||
468 | putc(' ', file); | 538 | putc(' ', file); |
469 | cp = p_fqname(cp, msg, file); /* mail addr */ | 539 | if ((cp = p_fqname(cp, msg, file)) == NULL) |
540 | return (NULL); | ||
470 | fputs(" (\n", file); | 541 | fputs(" (\n", file); |
471 | t = _getlong(cp); cp += sizeof(u_int32_t); | 542 | t = _getlong(cp); cp += sizeof(u_int32_t); |
472 | fprintf(file,"\t\t\t%lu\t; serial\n", t); | 543 | fprintf(file, "\t\t\t%lu\t; serial\n", (u_long)t); |
473 | t = _getlong(cp); cp += sizeof(u_int32_t); | 544 | t = _getlong(cp); cp += sizeof(u_int32_t); |
474 | fprintf(file,"\t\t\t%lu\t; refresh (%s)\n", t, __p_time(t)); | 545 | fprintf(file, "\t\t\t%lu\t; refresh (%s)\n", |
546 | (u_long)t, __p_time(t)); | ||
475 | t = _getlong(cp); cp += sizeof(u_int32_t); | 547 | t = _getlong(cp); cp += sizeof(u_int32_t); |
476 | fprintf(file,"\t\t\t%lu\t; retry (%s)\n", t, __p_time(t)); | 548 | fprintf(file, "\t\t\t%lu\t; retry (%s)\n", |
549 | (u_long)t, __p_time(t)); | ||
477 | t = _getlong(cp); cp += sizeof(u_int32_t); | 550 | t = _getlong(cp); cp += sizeof(u_int32_t); |
478 | fprintf(file,"\t\t\t%lu\t; expire (%s)\n", t, __p_time(t)); | 551 | fprintf(file, "\t\t\t%lu\t; expire (%s)\n", |
552 | (u_long)t, __p_time(t)); | ||
479 | t = _getlong(cp); cp += sizeof(u_int32_t); | 553 | t = _getlong(cp); cp += sizeof(u_int32_t); |
480 | fprintf(file,"\t\t\t%lu )\t; minimum (%s)", t, __p_time(t)); | 554 | fprintf(file, "\t\t\t%lu )\t; minimum (%s)", |
555 | (u_long)t, __p_time(t)); | ||
481 | break; | 556 | break; |
482 | 557 | ||
483 | case T_MX: | 558 | case T_MX: |
484 | case T_AFSDB: | 559 | case T_AFSDB: |
485 | fprintf(file,"\t%d ", _getshort(cp)); | 560 | case T_RT: |
486 | cp += sizeof(u_int16_t); | 561 | fprintf(file, "\t%d ", _getshort(cp)); |
487 | cp = p_fqname(cp, msg, file); | 562 | cp += INT16SZ; |
563 | if ((cp = p_fqname(cp, msg, file)) == NULL) | ||
564 | return (NULL); | ||
565 | break; | ||
566 | |||
567 | case T_PX: | ||
568 | fprintf(file, "\t%d ", _getshort(cp)); | ||
569 | cp += INT16SZ; | ||
570 | if ((cp = p_fqname(cp, msg, file)) == NULL) | ||
571 | return (NULL); | ||
572 | putc(' ', file); | ||
573 | if ((cp = p_fqname(cp, msg, file)) == NULL) | ||
574 | return (NULL); | ||
488 | break; | 575 | break; |
489 | 576 | ||
490 | case T_TXT: | 577 | case T_TXT: |
578 | case T_X25: | ||
491 | (void) fputs("\t\"", file); | 579 | (void) fputs("\t\"", file); |
492 | cp2 = cp1 + dlen; | 580 | cp2 = cp1 + dlen; |
493 | while (cp < cp2) { | 581 | while (cp < cp2) { |
494 | if (n = (unsigned char) *cp++) { | 582 | if (n = (unsigned char) *cp++) { |
495 | for (c = n; c > 0 && cp < cp2; c--) | 583 | for (c = n; c > 0 && cp < cp2; c--) |
496 | if (*cp == '\n') { | 584 | if ((*cp == '\n') || (*cp == '"')) { |
497 | (void) putc('\\', file); | 585 | (void) putc('\\', file); |
498 | (void) putc(*cp++, file); | 586 | (void) putc(*cp++, file); |
499 | } else | 587 | } else |
@@ -503,12 +591,19 @@ p_rr(cp, msg, file) | |||
503 | putc('"', file); | 591 | putc('"', file); |
504 | break; | 592 | break; |
505 | 593 | ||
594 | case T_NSAP: | ||
595 | (void) fprintf(file, "\t%s", inet_nsap_ntoa(dlen, cp, NULL)); | ||
596 | cp += dlen; | ||
597 | break; | ||
598 | |||
506 | case T_MINFO: | 599 | case T_MINFO: |
507 | case T_RP: | 600 | case T_RP: |
508 | putc('\t', file); | 601 | putc('\t', file); |
509 | cp = p_fqname(cp, msg, file); | 602 | if ((cp = p_fqname(cp, msg, file)) == NULL) |
603 | return (NULL); | ||
510 | putc(' ', file); | 604 | putc(' ', file); |
511 | cp = p_fqname(cp, msg, file); | 605 | if ((cp = p_fqname(cp, msg, file)) == NULL) |
606 | return (NULL); | ||
512 | break; | 607 | break; |
513 | 608 | ||
514 | case T_UINFO: | 609 | case T_UINFO: |
@@ -558,7 +653,7 @@ p_rr(cp, msg, file) | |||
558 | case T_UNSPEC: | 653 | case T_UNSPEC: |
559 | { | 654 | { |
560 | int NumBytes = 8; | 655 | int NumBytes = 8; |
561 | char *DataPtr; | 656 | u_char *DataPtr; |
562 | int i; | 657 | int i; |
563 | 658 | ||
564 | if (dlen < NumBytes) NumBytes = dlen; | 659 | if (dlen < NumBytes) NumBytes = dlen; |
@@ -588,113 +683,98 @@ p_rr(cp, msg, file) | |||
588 | return (cp); | 683 | return (cp); |
589 | } | 684 | } |
590 | 685 | ||
591 | static char nbuf[40]; | ||
592 | |||
593 | /* | 686 | /* |
594 | * Return a string for the type | 687 | * Return a string for the type |
595 | */ | 688 | */ |
596 | char * | 689 | const char * |
597 | __p_type(type) | 690 | __p_type(type) |
598 | int type; | 691 | int type; |
599 | { | 692 | { |
693 | static char nbuf[20]; | ||
694 | |||
600 | switch (type) { | 695 | switch (type) { |
601 | case T_A: | 696 | case T_A: return "A"; |
602 | return("A"); | 697 | case T_NS: return "NS"; |
603 | case T_NS: /* authoritative server */ | 698 | case T_CNAME: return "CNAME"; |
604 | return("NS"); | 699 | case T_SOA: return "SOA"; |
605 | case T_CNAME: /* canonical name */ | 700 | case T_MB: return "MB"; |
606 | return("CNAME"); | 701 | case T_MG: return "MG"; |
607 | case T_SOA: /* start of authority zone */ | 702 | case T_MR: return "MR"; |
608 | return("SOA"); | 703 | case T_NULL: return "NULL"; |
609 | case T_MB: /* mailbox domain name */ | 704 | case T_WKS: return "WKS"; |
610 | return("MB"); | 705 | case T_PTR: return "PTR"; |
611 | case T_MG: /* mail group member */ | 706 | case T_HINFO: return "HINFO"; |
612 | return("MG"); | 707 | case T_MINFO: return "MINFO"; |
613 | case T_MR: /* mail rename name */ | 708 | case T_MX: return "MX"; |
614 | return("MR"); | 709 | case T_TXT: return "TXT"; |
615 | case T_NULL: /* null resource record */ | 710 | case T_RP: return "RP"; |
616 | return("NULL"); | 711 | case T_AFSDB: return "AFSDB"; |
617 | case T_WKS: /* well known service */ | 712 | case T_X25: return "X25"; |
618 | return("WKS"); | 713 | case T_ISDN: return "ISDN"; |
619 | case T_PTR: /* domain name pointer */ | 714 | case T_RT: return "RT"; |
620 | return("PTR"); | 715 | case T_NSAP: return "NSAP"; |
621 | case T_HINFO: /* host information */ | 716 | case T_NSAP_PTR: return "NSAP_PTR"; |
622 | return("HINFO"); | 717 | case T_SIG: return "SIG"; |
623 | case T_MINFO: /* mailbox information */ | 718 | case T_KEY: return "KEY"; |
624 | return("MINFO"); | 719 | case T_PX: return "PX"; |
625 | case T_MX: /* mail routing info */ | 720 | case T_GPOS: return "GPOS"; |
626 | return("MX"); | 721 | case T_AAAA: return "AAAA"; |
627 | case T_TXT: /* text */ | 722 | case T_LOC: return "LOC"; |
628 | return("TXT"); | 723 | case T_AXFR: return "AXFR"; |
629 | case T_RP: /* responsible person */ | 724 | case T_MAILB: return "MAILB"; |
630 | return("RP"); | 725 | case T_MAILA: return "MAILA"; |
631 | case T_AFSDB: /* AFS cell database */ | 726 | case T_ANY: return "ANY"; |
632 | return("AFSDB"); | 727 | case T_UINFO: return "UINFO"; |
633 | case T_AXFR: /* zone transfer */ | 728 | case T_UID: return "UID"; |
634 | return("AXFR"); | 729 | case T_GID: return "GID"; |
635 | case T_MAILB: /* mail box */ | ||
636 | return("MAILB"); | ||
637 | case T_MAILA: /* mail address */ | ||
638 | return("MAILA"); | ||
639 | case T_ANY: /* matches any type */ | ||
640 | return("ANY"); | ||
641 | case T_UINFO: | ||
642 | return("UINFO"); | ||
643 | case T_UID: | ||
644 | return("UID"); | ||
645 | case T_GID: | ||
646 | return("GID"); | ||
647 | #ifdef ALLOW_T_UNSPEC | 730 | #ifdef ALLOW_T_UNSPEC |
648 | case T_UNSPEC: | 731 | case T_UNSPEC: return "UNSPEC"; |
649 | return("UNSPEC"); | ||
650 | #endif /* ALLOW_T_UNSPEC */ | 732 | #endif /* ALLOW_T_UNSPEC */ |
651 | 733 | default: (void)sprintf(nbuf, "%d", type); return (nbuf); | |
652 | default: | ||
653 | (void)sprintf(nbuf, "%d", type); | ||
654 | return(nbuf); | ||
655 | } | 734 | } |
656 | } | 735 | } |
657 | 736 | ||
658 | /* | 737 | /* |
659 | * Return a mnemonic for class | 738 | * Return a mnemonic for class |
660 | */ | 739 | */ |
661 | char * | 740 | const char * |
662 | __p_class(class) | 741 | __p_class(class) |
663 | int class; | 742 | int class; |
664 | { | 743 | { |
744 | static char nbuf[20]; | ||
665 | 745 | ||
666 | switch (class) { | 746 | switch (class) { |
667 | case C_IN: /* internet class */ | 747 | case C_IN: return "IN"; |
668 | return("IN"); | 748 | case C_HS: return "HS"; |
669 | case C_HS: /* hesiod class */ | 749 | case C_ANY: return "ANY"; |
670 | return("HS"); | 750 | default: (void)sprintf(nbuf, "%d", class); return (nbuf); |
671 | case C_ANY: /* matches any class */ | ||
672 | return("ANY"); | ||
673 | default: | ||
674 | (void)sprintf(nbuf, "%d", class); | ||
675 | return(nbuf); | ||
676 | } | 751 | } |
677 | } | 752 | } |
678 | 753 | ||
679 | /* | 754 | /* |
680 | * Return a mnemonic for an option | 755 | * Return a mnemonic for an option |
681 | */ | 756 | */ |
682 | static char * | 757 | const char * |
683 | p_option(option) | 758 | __p_option(option) |
684 | u_int32_t option; | 759 | u_long option; |
685 | { | 760 | { |
761 | static char nbuf[40]; | ||
762 | |||
686 | switch (option) { | 763 | switch (option) { |
687 | case RES_INIT: return "init"; | 764 | case RES_INIT: return "init"; |
688 | case RES_DEBUG: return "debug"; | 765 | case RES_DEBUG: return "debug"; |
689 | case RES_AAONLY: return "aaonly"; | 766 | case RES_AAONLY: return "aaonly(unimpl)"; |
690 | case RES_USEVC: return "usevc"; | 767 | case RES_USEVC: return "usevc"; |
691 | case RES_PRIMARY: return "primry"; | 768 | case RES_PRIMARY: return "primry(unimpl)"; |
692 | case RES_IGNTC: return "igntc"; | 769 | case RES_IGNTC: return "igntc"; |
693 | case RES_RECURSE: return "recurs"; | 770 | case RES_RECURSE: return "recurs"; |
694 | case RES_DEFNAMES: return "defnam"; | 771 | case RES_DEFNAMES: return "defnam"; |
695 | case RES_STAYOPEN: return "styopn"; | 772 | case RES_STAYOPEN: return "styopn"; |
696 | case RES_DNSRCH: return "dnsrch"; | 773 | case RES_DNSRCH: return "dnsrch"; |
697 | default: sprintf(nbuf, "?0x%x?", option); return nbuf; | 774 | case RES_INSECURE1: return "insecure1"; |
775 | case RES_INSECURE2: return "insecure2"; | ||
776 | default: sprintf(nbuf, "?0x%lx?", (u_long)option); | ||
777 | return (nbuf); | ||
698 | } | 778 | } |
699 | } | 779 | } |
700 | 780 | ||
@@ -705,6 +785,7 @@ char * | |||
705 | __p_time(value) | 785 | __p_time(value) |
706 | u_int32_t value; | 786 | u_int32_t value; |
707 | { | 787 | { |
788 | static char nbuf[40]; | ||
708 | int secs, mins, hours, days; | 789 | int secs, mins, hours, days; |
709 | register char *p; | 790 | register char *p; |
710 | 791 | ||