summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/res_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/net/res_debug.c')
-rw-r--r--src/lib/libc/net/res_debug.c513
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
58static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; 58static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93";
59static char rcsid[] = "$Id: res_debug.c,v 8.7 1995/12/22 10:20:39 vixie Exp ";
59#else 60#else
60static char rcsid[] = "$NetBSD: res_debug.c,v 1.7 1995/02/25 06:20:56 cgd Exp $"; 61static 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
72void __fp_query(); 74void __fp_query();
73char *__p_class(), *__p_time(), *__p_type();
74char *p_cdname(), *p_fqname(), *p_rr();
75static char *p_option __P((u_int32_t));
76 75
77char *_res_opcodes[] = { 76char *_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
115static char retbuf[16];
116
117static char * 114static char *
118dewks(wks) 115dewks(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
172static char * 171/* XXX: we should use getprotobynumber() instead. */
172static const char *
173deproto(protonum) 173deproto(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
193static char * 195static const u_char *
194do_rrset(msg, cp, cnt, pflag, file, hs) 196do_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
234void
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 */
250void 265void
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
344char * 387void
345p_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
395const 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
362char * 413const u_char *
363p_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
424const 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 */
386char * 447const u_char *
387p_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
591static char nbuf[40];
592
593/* 686/*
594 * Return a string for the type 687 * Return a string for the type
595 */ 688 */
596char * 689const 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 */
661char * 740const 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 */
682static char * 757const char *
683p_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