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