|
|
1.1 root 1: /*
2: * Copyright (c) 1985 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #if defined(LIBC_SCCS) && !defined(lint)
8: static char sccsid[] = "@(#)res_debug.c 5.13 (Berkeley) 3/9/86";
9: #endif LIBC_SCCS and not lint
10:
11: #if defined(lint) && !defined(DEBUG)
12: #define DEBUG
13: #endif
14:
15: #include <sys/types.h>
16: #include <netinet/in.h>
17: #include <stdio.h>
18: #include <arpa/nameser.h>
19:
20: extern char *p_cdname(), *p_rr(), *p_type(), *p_class();
21: extern char *inet_ntoa();
22:
23: char *opcodes[] = {
24: "QUERY",
25: "IQUERY",
26: "CQUERYM",
27: "CQUERYU",
28: "4",
29: "5",
30: "6",
31: "7",
32: "8",
33: "9",
34: "10",
35: "UPDATEA",
36: "UPDATED",
37: "UPDATEM",
38: "ZONEINIT",
39: "ZONEREF",
40: };
41:
42: char *rcodes[] = {
43: "NOERROR",
44: "FORMERR",
45: "SERVFAIL",
46: "NXDOMAIN",
47: "NOTIMP",
48: "REFUSED",
49: "6",
50: "7",
51: "8",
52: "9",
53: "10",
54: "11",
55: "12",
56: "13",
57: "14",
58: "NOCHANGE",
59: };
60:
61: p_query(msg)
62: char *msg;
63: {
64: #ifdef DEBUG
65: fp_query(msg,stdout);
66: #endif
67: }
68:
69: /*
70: * Print the contents of a query.
71: * This is intended to be primarily a debugging routine.
72: */
73: fp_query(msg,file)
74: char *msg;
75: FILE *file;
76: {
77: #ifdef DEBUG
78: register char *cp;
79: register HEADER *hp;
80: register int n;
81:
82: /*
83: * Print header fields.
84: */
85: hp = (HEADER *)msg;
86: cp = msg + sizeof(HEADER);
87: fprintf(file,"HEADER:\n");
88: fprintf(file,"\topcode = %s", opcodes[hp->opcode]);
89: fprintf(file,", id = %d", ntohs(hp->id));
90: fprintf(file,", rcode = %s\n", rcodes[hp->rcode]);
91: fprintf(file,"\theader flags: ");
92: if (hp->qr)
93: fprintf(file," qr");
94: if (hp->aa)
95: fprintf(file," aa");
96: if (hp->tc)
97: fprintf(file," tc");
98: if (hp->rd)
99: fprintf(file," rd");
100: if (hp->ra)
101: fprintf(file," ra");
102: if (hp->pr)
103: fprintf(file," pr");
104: fprintf(file,"\n\tqdcount = %d", ntohs(hp->qdcount));
105: fprintf(file,", ancount = %d", ntohs(hp->ancount));
106: fprintf(file,", nscount = %d", ntohs(hp->nscount));
107: fprintf(file,", arcount = %d\n\n", ntohs(hp->arcount));
108: /*
109: * Print question records.
110: */
111: if (n = ntohs(hp->qdcount)) {
112: fprintf(file,"QUESTIONS:\n");
113: while (--n >= 0) {
114: fprintf(file,"\t");
115: cp = p_cdname(cp, msg, file);
116: if (cp == NULL)
117: return;
118: fprintf(file,", type = %s", p_type(getshort(cp)));
119: cp += sizeof(u_short);
120: fprintf(file,", class = %s\n\n", p_class(getshort(cp)));
121: cp += sizeof(u_short);
122: }
123: }
124: /*
125: * Print authoritative answer records
126: */
127: if (n = ntohs(hp->ancount)) {
128: fprintf(file,"ANSWERS:\n");
129: while (--n >= 0) {
130: fprintf(file,"\t");
131: cp = p_rr(cp, msg, file);
132: if (cp == NULL)
133: return;
134: }
135: }
136: /*
137: * print name server records
138: */
139: if (n = ntohs(hp->nscount)) {
140: fprintf(file,"NAME SERVERS:\n");
141: while (--n >= 0) {
142: fprintf(file,"\t");
143: cp = p_rr(cp, msg, file);
144: if (cp == NULL)
145: return;
146: }
147: }
148: /*
149: * print additional records
150: */
151: if (n = ntohs(hp->arcount)) {
152: fprintf(file,"ADDITIONAL RECORDS:\n");
153: while (--n >= 0) {
154: fprintf(file,"\t");
155: cp = p_rr(cp, msg, file);
156: if (cp == NULL)
157: return;
158: }
159: }
160: #endif
161: }
162:
163: char *
164: p_cdname(cp, msg, file)
165: char *cp, *msg;
166: FILE *file;
167: {
168: #ifdef DEBUG
169: char name[MAXDNAME];
170: int n;
171:
172: if ((n = dn_expand(msg, msg + 512, cp, name, sizeof(name))) < 0)
173: return (NULL);
174: if (name[0] == '\0') {
175: name[0] = '.';
176: name[1] = '\0';
177: }
178: fputs(name, file);
179: return (cp + n);
180: #endif
181: }
182:
183: /*
184: * Print resource record fields in human readable form.
185: */
186: char *
187: p_rr(cp, msg, file)
188: char *cp, *msg;
189: FILE *file;
190: {
191: #ifdef DEBUG
192: int type, class, dlen, n, c;
193: struct in_addr inaddr;
194: char *cp1;
195:
196: if ((cp = p_cdname(cp, msg, file)) == NULL)
197: return (NULL); /* compression error */
198: fprintf(file,"\n\ttype = %s", p_type(type = getshort(cp)));
199: cp += sizeof(u_short);
200: fprintf(file,", class = %s", p_class(class = getshort(cp)));
201: cp += sizeof(u_short);
202: fprintf(file,", ttl = %u", getlong(cp));
203: cp += sizeof(u_long);
204: fprintf(file,", dlen = %d\n", dlen = getshort(cp));
205: cp += sizeof(u_short);
206: cp1 = cp;
207: /*
208: * Print type specific data, if appropriate
209: */
210: switch (type) {
211: case T_A:
212: switch (class) {
213: case C_IN:
214: bcopy(cp, (char *)&inaddr, sizeof(inaddr));
215: if (dlen == 4) {
216: fprintf(file,"\tinternet address = %s\n",
217: inet_ntoa(inaddr));
218: cp += dlen;
219: } else if (dlen == 7) {
220: fprintf(file,"\tinternet address = %s",
221: inet_ntoa(inaddr));
222: fprintf(file,", protocol = %d", cp[4]);
223: fprintf(file,", port = %d\n",
224: (cp[5] << 8) + cp[6]);
225: cp += dlen;
226: }
227: break;
228: }
229: break;
230: case T_CNAME:
231: case T_MB:
232: #ifdef OLDRR
233: case T_MD:
234: case T_MF:
235: #endif /* OLDRR */
236: case T_MG:
237: case T_MR:
238: case T_NS:
239: case T_PTR:
240: fprintf(file,"\tdomain name = ");
241: cp = p_cdname(cp, msg, file);
242: fprintf(file,"\n");
243: break;
244:
245: case T_HINFO:
246: if (n = *cp++) {
247: fprintf(file,"\tCPU=%.*s\n", n, cp);
248: cp += n;
249: }
250: if (n = *cp++) {
251: fprintf(file,"\tOS=%.*s\n", n, cp);
252: cp += n;
253: }
254: break;
255:
256: case T_SOA:
257: fprintf(file,"\torigin = ");
258: cp = p_cdname(cp, msg, file);
259: fprintf(file,"\n\tmail addr = ");
260: cp = p_cdname(cp, msg, file);
261: fprintf(file,"\n\tserial=%ld", getlong(cp));
262: cp += sizeof(u_long);
263: fprintf(file,", refresh=%ld", getlong(cp));
264: cp += sizeof(u_long);
265: fprintf(file,", retry=%ld", getlong(cp));
266: cp += sizeof(u_long);
267: fprintf(file,", expire=%ld", getlong(cp));
268: cp += sizeof(u_long);
269: fprintf(file,", min=%ld\n", getlong(cp));
270: cp += sizeof(u_long);
271: break;
272:
273: case T_MX:
274: fprintf(file,"\tpreference = %ld,",getshort(cp));
275: cp += sizeof(u_short);
276: fprintf(file," name = ");
277: cp = p_cdname(cp, msg, file);
278: break;
279:
280: case T_MINFO:
281: fprintf(file,"\trequests = ");
282: cp = p_cdname(cp, msg, file);
283: fprintf(file,"\n\terrors = ");
284: cp = p_cdname(cp, msg, file);
285: break;
286:
287: case T_UINFO:
288: fprintf(file,"\t%s\n", cp);
289: cp += dlen;
290: break;
291:
292: case T_UID:
293: case T_GID:
294: if (dlen == 4) {
295: fprintf(file,"\t%ld\n", getlong(cp));
296: cp += sizeof(int);
297: }
298: break;
299:
300: case T_WKS:
301: if (dlen < sizeof(u_long) + 1)
302: break;
303: bcopy(cp, (char *)&inaddr, sizeof(inaddr));
304: cp += sizeof(u_long);
305: fprintf(file,"\tinternet address = %s, protocol = %d\n\t",
306: inet_ntoa(inaddr), *cp++);
307: n = 0;
308: while (cp < cp1 + dlen) {
309: c = *cp++;
310: do {
311: if (c & 0200)
312: fprintf(file," %d", n);
313: c <<= 1;
314: } while (++n & 07);
315: }
316: putc('\n',file);
317: break;
318:
319: default:
320: fprintf(file,"\t???\n");
321: cp += dlen;
322: }
323: if (cp != cp1 + dlen)
324: fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen);
325: fprintf(file,"\n");
326: return (cp);
327: #endif
328: }
329:
330: static char nbuf[20];
331: extern char *sprintf();
332:
333: /*
334: * Return a string for the type
335: */
336: char *
337: p_type(type)
338: int type;
339: {
340: switch (type) {
341: case T_A:
342: return("A");
343: case T_NS: /* authoritative server */
344: return("NS");
345: #ifdef OLDRR
346: case T_MD: /* mail destination */
347: return("MD");
348: case T_MF: /* mail forwarder */
349: return("MF");
350: #endif /* OLDRR */
351: case T_CNAME: /* connonical name */
352: return("CNAME");
353: case T_SOA: /* start of authority zone */
354: return("SOA");
355: case T_MB: /* mailbox domain name */
356: return("MB");
357: case T_MG: /* mail group member */
358: return("MG");
359: case T_MX: /* mail routing info */
360: return("MX");
361: case T_MR: /* mail rename name */
362: return("MR");
363: case T_NULL: /* null resource record */
364: return("NULL");
365: case T_WKS: /* well known service */
366: return("WKS");
367: case T_PTR: /* domain name pointer */
368: return("PTR");
369: case T_HINFO: /* host information */
370: return("HINFO");
371: case T_MINFO: /* mailbox information */
372: return("MINFO");
373: case T_AXFR: /* zone transfer */
374: return("AXFR");
375: case T_MAILB: /* mail box */
376: return("MAILB");
377: case T_MAILA: /* mail address */
378: return("MAILA");
379: case T_ANY: /* matches any type */
380: return("ANY");
381: case T_UINFO:
382: return("UINFO");
383: case T_UID:
384: return("UID");
385: case T_GID:
386: return("GID");
387: default:
388: return (sprintf(nbuf, "%d", type));
389: }
390: }
391:
392: /*
393: * Return a mnemonic for class
394: */
395: char *
396: p_class(class)
397: int class;
398: {
399:
400: switch (class) {
401: case C_IN: /* internet class */
402: return("IN");
403: case C_ANY: /* matches any class */
404: return("ANY");
405: default:
406: return (sprintf(nbuf, "%d", class));
407: }
408: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.