vm_resident.c becomes vm_page.c (as it was in MACH)
[unix-history] / usr / src / lib / libc / net / res_debug.c
CommitLineData
00976ca1 1/*-
ad5ac231 2 * Copyright (c) 1985, 1990 Regents of the University of California.
6b2f9dd0
KB
3 * All rights reserved.
4 *
00976ca1
JB
5 * %sccs.include.redist.c%
6 *
7 * @(#)res_debug.c 5.30 (Berkeley) %G%
b423e985
RC
8 */
9
2ce81398 10#if defined(LIBC_SCCS) && !defined(lint)
00976ca1 11static char sccsid[] = "@(#)res_debug.c 5.30 (Berkeley) %G%";
6b2f9dd0 12#endif /* LIBC_SCCS and not lint */
8ea4199d 13
0d22afd1
RC
14#include <sys/types.h>
15#include <netinet/in.h>
16#include <stdio.h>
02a51825 17#include <arpa/nameser.h>
0d22afd1 18
7134abf2 19extern char *p_cdname(), *p_rr(), *p_type(), *p_class(), *p_time();
0d22afd1
RC
20extern char *inet_ntoa();
21
cd43bd6a 22char *_res_opcodes[] = {
0d22afd1
RC
23 "QUERY",
24 "IQUERY",
25 "CQUERYM",
26 "CQUERYU",
27 "4",
28 "5",
29 "6",
30 "7",
31 "8",
0d22afd1
RC
32 "UPDATEA",
33 "UPDATED",
3e8361d9 34 "UPDATEDA",
0d22afd1 35 "UPDATEM",
3e8361d9 36 "UPDATEMA",
0d22afd1
RC
37 "ZONEINIT",
38 "ZONEREF",
39};
40
cd43bd6a 41char *_res_resultcodes[] = {
0d22afd1
RC
42 "NOERROR",
43 "FORMERR",
44 "SERVFAIL",
45 "NXDOMAIN",
46 "NOTIMP",
47 "REFUSED",
48 "6",
49 "7",
50 "8",
51 "9",
52 "10",
53 "11",
54 "12",
55 "13",
56 "14",
57 "NOCHANGE",
58};
59
a73d974c
KD
60p_query(msg)
61 char *msg;
62{
63 fp_query(msg,stdout);
64}
65
0d22afd1
RC
66/*
67 * Print the contents of a query.
68 * This is intended to be primarily a debugging routine.
69 */
a73d974c 70fp_query(msg,file)
e515a559 71 char *msg;
a73d974c 72 FILE *file;
0d22afd1
RC
73{
74 register char *cp;
75 register HEADER *hp;
76 register int n;
77
78 /*
79 * Print header fields.
80 */
e515a559
RC
81 hp = (HEADER *)msg;
82 cp = msg + sizeof(HEADER);
a73d974c 83 fprintf(file,"HEADER:\n");
d7070d01 84 fprintf(file,"\topcode = %s", _res_opcodes[hp->opcode]);
a73d974c 85 fprintf(file,", id = %d", ntohs(hp->id));
d7070d01 86 fprintf(file,", rcode = %s\n", _res_resultcodes[hp->rcode]);
a73d974c 87 fprintf(file,"\theader flags: ");
0d22afd1 88 if (hp->qr)
a73d974c 89 fprintf(file," qr");
0d22afd1 90 if (hp->aa)
a73d974c 91 fprintf(file," aa");
0d22afd1 92 if (hp->tc)
a73d974c 93 fprintf(file," tc");
0d22afd1 94 if (hp->rd)
a73d974c 95 fprintf(file," rd");
0d22afd1 96 if (hp->ra)
a73d974c 97 fprintf(file," ra");
0d22afd1 98 if (hp->pr)
a73d974c
KD
99 fprintf(file," pr");
100 fprintf(file,"\n\tqdcount = %d", ntohs(hp->qdcount));
101 fprintf(file,", ancount = %d", ntohs(hp->ancount));
102 fprintf(file,", nscount = %d", ntohs(hp->nscount));
103 fprintf(file,", arcount = %d\n\n", ntohs(hp->arcount));
0d22afd1
RC
104 /*
105 * Print question records.
106 */
107 if (n = ntohs(hp->qdcount)) {
a73d974c 108 fprintf(file,"QUESTIONS:\n");
0d22afd1 109 while (--n >= 0) {
a73d974c
KD
110 fprintf(file,"\t");
111 cp = p_cdname(cp, msg, file);
0d22afd1
RC
112 if (cp == NULL)
113 return;
20087cad 114 fprintf(file,", type = %s", p_type(_getshort(cp)));
0d22afd1 115 cp += sizeof(u_short);
20087cad 116 fprintf(file,", class = %s\n\n", p_class(_getshort(cp)));
0d22afd1
RC
117 cp += sizeof(u_short);
118 }
119 }
120 /*
121 * Print authoritative answer records
122 */
123 if (n = ntohs(hp->ancount)) {
a73d974c 124 fprintf(file,"ANSWERS:\n");
0d22afd1 125 while (--n >= 0) {
a73d974c
KD
126 fprintf(file,"\t");
127 cp = p_rr(cp, msg, file);
0d22afd1
RC
128 if (cp == NULL)
129 return;
130 }
131 }
132 /*
133 * print name server records
134 */
135 if (n = ntohs(hp->nscount)) {
a73d974c 136 fprintf(file,"NAME SERVERS:\n");
0d22afd1 137 while (--n >= 0) {
a73d974c
KD
138 fprintf(file,"\t");
139 cp = p_rr(cp, msg, file);
0d22afd1
RC
140 if (cp == NULL)
141 return;
142 }
143 }
144 /*
145 * print additional records
146 */
147 if (n = ntohs(hp->arcount)) {
a73d974c 148 fprintf(file,"ADDITIONAL RECORDS:\n");
0d22afd1 149 while (--n >= 0) {
a73d974c
KD
150 fprintf(file,"\t");
151 cp = p_rr(cp, msg, file);
0d22afd1
RC
152 if (cp == NULL)
153 return;
154 }
155 }
156}
157
158char *
a73d974c 159p_cdname(cp, msg, file)
e515a559 160 char *cp, *msg;
a73d974c 161 FILE *file;
0d22afd1
RC
162{
163 char name[MAXDNAME];
164 int n;
165
127b68cb 166 if ((n = dn_expand(msg, msg + 512, cp, name, sizeof(name))) < 0)
0d22afd1
RC
167 return (NULL);
168 if (name[0] == '\0') {
169 name[0] = '.';
170 name[1] = '\0';
171 }
a73d974c 172 fputs(name, file);
0d22afd1
RC
173 return (cp + n);
174}
175
176/*
177 * Print resource record fields in human readable form.
178 */
179char *
a73d974c 180p_rr(cp, msg, file)
e515a559 181 char *cp, *msg;
a73d974c 182 FILE *file;
0d22afd1
RC
183{
184 int type, class, dlen, n, c;
185 struct in_addr inaddr;
4a7d845b 186 char *cp1, *cp2;
0d22afd1 187
a73d974c 188 if ((cp = p_cdname(cp, msg, file)) == NULL)
0d22afd1 189 return (NULL); /* compression error */
20087cad 190 fprintf(file,"\n\ttype = %s", p_type(type = _getshort(cp)));
0d22afd1 191 cp += sizeof(u_short);
20087cad 192 fprintf(file,", class = %s", p_class(class = _getshort(cp)));
0d22afd1 193 cp += sizeof(u_short);
606dc84e 194 fprintf(file,", ttl = %s", p_time(_getlong(cp)));
0d22afd1 195 cp += sizeof(u_long);
20087cad 196 fprintf(file,", dlen = %d\n", dlen = _getshort(cp));
0d22afd1
RC
197 cp += sizeof(u_short);
198 cp1 = cp;
199 /*
200 * Print type specific data, if appropriate
201 */
202 switch (type) {
203 case T_A:
204 switch (class) {
205 case C_IN:
ad5ac231 206 case C_HS:
11e57e73 207 bcopy(cp, (char *)&inaddr, sizeof(inaddr));
0d22afd1 208 if (dlen == 4) {
a73d974c 209 fprintf(file,"\tinternet address = %s\n",
0d22afd1
RC
210 inet_ntoa(inaddr));
211 cp += dlen;
212 } else if (dlen == 7) {
a73d974c 213 fprintf(file,"\tinternet address = %s",
0d22afd1 214 inet_ntoa(inaddr));
a73d974c
KD
215 fprintf(file,", protocol = %d", cp[4]);
216 fprintf(file,", port = %d\n",
0d22afd1
RC
217 (cp[5] << 8) + cp[6]);
218 cp += dlen;
219 }
220 break;
e0dd8906
KD
221 default:
222 cp += dlen;
0d22afd1
RC
223 }
224 break;
225 case T_CNAME:
226 case T_MB:
0d22afd1
RC
227 case T_MG:
228 case T_MR:
229 case T_NS:
230 case T_PTR:
a73d974c
KD
231 fprintf(file,"\tdomain name = ");
232 cp = p_cdname(cp, msg, file);
233 fprintf(file,"\n");
0d22afd1
RC
234 break;
235
236 case T_HINFO:
237 if (n = *cp++) {
a73d974c 238 fprintf(file,"\tCPU=%.*s\n", n, cp);
0d22afd1
RC
239 cp += n;
240 }
241 if (n = *cp++) {
a73d974c 242 fprintf(file,"\tOS=%.*s\n", n, cp);
0d22afd1
RC
243 cp += n;
244 }
245 break;
246
247 case T_SOA:
a73d974c
KD
248 fprintf(file,"\torigin = ");
249 cp = p_cdname(cp, msg, file);
250 fprintf(file,"\n\tmail addr = ");
251 cp = p_cdname(cp, msg, file);
606dc84e 252 fprintf(file,"\n\tserial = %ld", _getlong(cp));
0d22afd1 253 cp += sizeof(u_long);
606dc84e 254 fprintf(file,"\n\trefresh = %s", p_time(_getlong(cp)));
0d22afd1 255 cp += sizeof(u_long);
606dc84e 256 fprintf(file,"\n\tretry = %s", p_time(_getlong(cp)));
0d22afd1 257 cp += sizeof(u_long);
606dc84e 258 fprintf(file,"\n\texpire = %s", p_time(_getlong(cp)));
0d22afd1 259 cp += sizeof(u_long);
606dc84e 260 fprintf(file,"\n\tmin = %s\n", p_time(_getlong(cp)));
0d22afd1
RC
261 cp += sizeof(u_long);
262 break;
263
73546a32 264 case T_MX:
20087cad 265 fprintf(file,"\tpreference = %ld,",_getshort(cp));
018df4a9
KD
266 cp += sizeof(u_short);
267 fprintf(file," name = ");
73546a32 268 cp = p_cdname(cp, msg, file);
73546a32
KD
269 break;
270
ad5ac231
JB
271 case T_TXT:
272 (void) fputs("\t\"", file);
273 cp2 = cp1 + dlen;
274 while (cp < cp2) {
275 if (n = (unsigned char) *cp++) {
276 for (c = n; c > 0 && cp < cp2; c--)
277 if (*cp == '\n') {
278 (void) putc('\\', file);
279 (void) putc(*cp++, file);
280 } else
281 (void) putc(*cp++, file);
282 }
283 }
284 (void) fputs("\"\n", file);
285 break;
0af159f3 286
e515a559 287 case T_MINFO:
a73d974c
KD
288 fprintf(file,"\trequests = ");
289 cp = p_cdname(cp, msg, file);
290 fprintf(file,"\n\terrors = ");
291 cp = p_cdname(cp, msg, file);
e515a559
RC
292 break;
293
0d22afd1 294 case T_UINFO:
a73d974c 295 fprintf(file,"\t%s\n", cp);
0d22afd1
RC
296 cp += dlen;
297 break;
298
299 case T_UID:
300 case T_GID:
301 if (dlen == 4) {
20087cad 302 fprintf(file,"\t%ld\n", _getlong(cp));
0d22afd1
RC
303 cp += sizeof(int);
304 }
305 break;
306
307 case T_WKS:
308 if (dlen < sizeof(u_long) + 1)
309 break;
11e57e73 310 bcopy(cp, (char *)&inaddr, sizeof(inaddr));
0d22afd1 311 cp += sizeof(u_long);
a73d974c 312 fprintf(file,"\tinternet address = %s, protocol = %d\n\t",
0d22afd1
RC
313 inet_ntoa(inaddr), *cp++);
314 n = 0;
315 while (cp < cp1 + dlen) {
316 c = *cp++;
317 do {
a943feed 318 if (c & 0200)
a73d974c 319 fprintf(file," %d", n);
a943feed 320 c <<= 1;
0d22afd1
RC
321 } while (++n & 07);
322 }
a73d974c 323 putc('\n',file);
0d22afd1
RC
324 break;
325
3bf25746 326#ifdef ALLOW_T_UNSPEC
1e12917d
KB
327 case T_UNSPEC:
328 {
329 int NumBytes = 8;
330 char *DataPtr;
331 int i;
3bf25746 332
1e12917d
KB
333 if (dlen < NumBytes) NumBytes = dlen;
334 fprintf(file, "\tFirst %d bytes of hex data:",
335 NumBytes);
336 for (i = 0, DataPtr = cp; i < NumBytes; i++, DataPtr++)
337 fprintf(file, " %x", *DataPtr);
338 fputs("\n", file);
339 cp += dlen;
340 }
341 break;
342#endif /* ALLOW_T_UNSPEC */
3bf25746 343
0d22afd1 344 default:
a73d974c 345 fprintf(file,"\t???\n");
0d22afd1
RC
346 cp += dlen;
347 }
90e07ed6 348 if (cp != cp1 + dlen) {
a73d974c 349 fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen);
90e07ed6
JB
350 cp = NULL;
351 }
a73d974c 352 fprintf(file,"\n");
0d22afd1
RC
353 return (cp);
354}
355
7134abf2 356static char nbuf[40];
0d22afd1
RC
357
358/*
359 * Return a string for the type
360 */
361char *
362p_type(type)
363 int type;
364{
0d22afd1
RC
365 switch (type) {
366 case T_A:
367 return("A");
368 case T_NS: /* authoritative server */
369 return("NS");
0af159f3 370 case T_CNAME: /* canonical name */
0d22afd1
RC
371 return("CNAME");
372 case T_SOA: /* start of authority zone */
373 return("SOA");
374 case T_MB: /* mailbox domain name */
375 return("MB");
376 case T_MG: /* mail group member */
377 return("MG");
378 case T_MR: /* mail rename name */
379 return("MR");
380 case T_NULL: /* null resource record */
381 return("NULL");
382 case T_WKS: /* well known service */
383 return("WKS");
384 case T_PTR: /* domain name pointer */
385 return("PTR");
386 case T_HINFO: /* host information */
387 return("HINFO");
388 case T_MINFO: /* mailbox information */
389 return("MINFO");
606dc84e
JB
390 case T_MX: /* mail routing info */
391 return("MX");
392 case T_TXT: /* text */
393 return("TXT");
0d22afd1
RC
394 case T_AXFR: /* zone transfer */
395 return("AXFR");
396 case T_MAILB: /* mail box */
397 return("MAILB");
398 case T_MAILA: /* mail address */
399 return("MAILA");
400 case T_ANY: /* matches any type */
401 return("ANY");
402 case T_UINFO:
403 return("UINFO");
404 case T_UID:
405 return("UID");
406 case T_GID:
407 return("GID");
3bf25746 408#ifdef ALLOW_T_UNSPEC
1e12917d
KB
409 case T_UNSPEC:
410 return("UNSPEC");
411#endif /* ALLOW_T_UNSPEC */
0d22afd1 412 default:
06eef7c4
KB
413 (void)sprintf(nbuf, "%d", type);
414 return(nbuf);
0d22afd1
RC
415 }
416}
417
418/*
419 * Return a mnemonic for class
420 */
421char *
422p_class(class)
423 int class;
424{
425
426 switch (class) {
427 case C_IN: /* internet class */
428 return("IN");
0af159f3
JB
429 case C_HS: /* hesiod class */
430 return("HS");
0d22afd1
RC
431 case C_ANY: /* matches any class */
432 return("ANY");
433 default:
06eef7c4
KB
434 (void)sprintf(nbuf, "%d", class);
435 return(nbuf);
0d22afd1
RC
436 }
437}
7134abf2
MK
438
439/*
440 * Return a mnemonic for a time to live
441 */
0af159f3
JB
442char *
443p_time(value)
7134abf2
MK
444 u_long value;
445{
446 int secs, mins, hours;
447 register char *p;
448
00976ca1
JB
449 if (value == 0) {
450 strcpy(nbuf, "0 secs");
451 return(nbuf);
452 }
453
7134abf2
MK
454 secs = value % 60;
455 value /= 60;
456 mins = value % 60;
457 value /= 60;
458 hours = value % 24;
459 value /= 24;
460
461#define PLURALIZE(x) x, (x == 1) ? "" : "s"
462 p = nbuf;
463 if (value) {
464 (void)sprintf(p, "%d day%s", PLURALIZE(value));
465 while (*++p);
466 }
467 if (hours) {
0af159f3 468 if (value)
7134abf2
MK
469 *p++ = ' ';
470 (void)sprintf(p, "%d hour%s", PLURALIZE(hours));
471 while (*++p);
472 }
473 if (mins) {
0af159f3 474 if (value || hours)
7134abf2
MK
475 *p++ = ' ';
476 (void)sprintf(p, "%d min%s", PLURALIZE(mins));
477 while (*++p);
478 }
0af159f3
JB
479 if (secs || ! (value || hours || mins)) {
480 if (value || hours || mins)
7134abf2
MK
481 *p++ = ' ';
482 (void)sprintf(p, "%d sec%s", PLURALIZE(secs));
7134abf2
MK
483 }
484 return(nbuf);
485}