machine/param.h is gone
[unix-history] / usr / src / lib / libc / net / res_debug.c
CommitLineData
b423e985 1/*
8ea4199d
DF
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.
b423e985
RC
5 */
6
8ea4199d 7#ifndef lint
127b68cb 8static char sccsid[] = "@(#)res_debug.c 5.12 (Berkeley) %G%";
8ea4199d
DF
9#endif not lint
10
d1c1ab68
JB
11#if defined(lint) && !defined(DEBUG)
12#define DEBUG
13#endif
14
0d22afd1
RC
15#include <sys/types.h>
16#include <netinet/in.h>
17#include <stdio.h>
02a51825 18#include <arpa/nameser.h>
0d22afd1
RC
19
20extern char *p_cdname(), *p_rr(), *p_type(), *p_class();
21extern char *inet_ntoa();
22
23char *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
42char *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
a73d974c
KD
61p_query(msg)
62 char *msg;
63{
d1c1ab68 64#ifdef DEBUG
a73d974c 65 fp_query(msg,stdout);
d1c1ab68 66#endif
a73d974c
KD
67}
68
0d22afd1
RC
69/*
70 * Print the contents of a query.
71 * This is intended to be primarily a debugging routine.
72 */
a73d974c 73fp_query(msg,file)
e515a559 74 char *msg;
a73d974c 75 FILE *file;
0d22afd1 76{
d1c1ab68 77#ifdef DEBUG
0d22afd1
RC
78 register char *cp;
79 register HEADER *hp;
80 register int n;
81
82 /*
83 * Print header fields.
84 */
e515a559
RC
85 hp = (HEADER *)msg;
86 cp = msg + sizeof(HEADER);
a73d974c
KD
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: ");
0d22afd1 92 if (hp->qr)
a73d974c 93 fprintf(file," qr");
0d22afd1 94 if (hp->aa)
a73d974c 95 fprintf(file," aa");
0d22afd1 96 if (hp->tc)
a73d974c 97 fprintf(file," tc");
0d22afd1 98 if (hp->rd)
a73d974c 99 fprintf(file," rd");
0d22afd1 100 if (hp->ra)
a73d974c 101 fprintf(file," ra");
0d22afd1 102 if (hp->pr)
a73d974c
KD
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));
0d22afd1
RC
108 /*
109 * Print question records.
110 */
111 if (n = ntohs(hp->qdcount)) {
a73d974c 112 fprintf(file,"QUESTIONS:\n");
0d22afd1 113 while (--n >= 0) {
a73d974c
KD
114 fprintf(file,"\t");
115 cp = p_cdname(cp, msg, file);
0d22afd1
RC
116 if (cp == NULL)
117 return;
a73d974c 118 fprintf(file,", type = %s", p_type(getshort(cp)));
0d22afd1 119 cp += sizeof(u_short);
a73d974c 120 fprintf(file,", class = %s\n\n", p_class(getshort(cp)));
0d22afd1
RC
121 cp += sizeof(u_short);
122 }
123 }
124 /*
125 * Print authoritative answer records
126 */
127 if (n = ntohs(hp->ancount)) {
a73d974c 128 fprintf(file,"ANSWERS:\n");
0d22afd1 129 while (--n >= 0) {
a73d974c
KD
130 fprintf(file,"\t");
131 cp = p_rr(cp, msg, file);
0d22afd1
RC
132 if (cp == NULL)
133 return;
134 }
135 }
136 /*
137 * print name server records
138 */
139 if (n = ntohs(hp->nscount)) {
a73d974c 140 fprintf(file,"NAME SERVERS:\n");
0d22afd1 141 while (--n >= 0) {
a73d974c
KD
142 fprintf(file,"\t");
143 cp = p_rr(cp, msg, file);
0d22afd1
RC
144 if (cp == NULL)
145 return;
146 }
147 }
148 /*
149 * print additional records
150 */
151 if (n = ntohs(hp->arcount)) {
a73d974c 152 fprintf(file,"ADDITIONAL RECORDS:\n");
0d22afd1 153 while (--n >= 0) {
a73d974c
KD
154 fprintf(file,"\t");
155 cp = p_rr(cp, msg, file);
0d22afd1
RC
156 if (cp == NULL)
157 return;
158 }
159 }
d1c1ab68 160#endif
0d22afd1
RC
161}
162
163char *
a73d974c 164p_cdname(cp, msg, file)
e515a559 165 char *cp, *msg;
a73d974c 166 FILE *file;
0d22afd1 167{
d1c1ab68 168#ifdef DEBUG
0d22afd1
RC
169 char name[MAXDNAME];
170 int n;
171
127b68cb 172 if ((n = dn_expand(msg, msg + 512, cp, name, sizeof(name))) < 0)
0d22afd1
RC
173 return (NULL);
174 if (name[0] == '\0') {
175 name[0] = '.';
176 name[1] = '\0';
177 }
a73d974c 178 fputs(name, file);
0d22afd1 179 return (cp + n);
d1c1ab68 180#endif
0d22afd1
RC
181}
182
183/*
184 * Print resource record fields in human readable form.
185 */
186char *
a73d974c 187p_rr(cp, msg, file)
e515a559 188 char *cp, *msg;
a73d974c 189 FILE *file;
0d22afd1 190{
d1c1ab68 191#ifdef DEBUG
0d22afd1
RC
192 int type, class, dlen, n, c;
193 struct in_addr inaddr;
194 char *cp1;
195
a73d974c 196 if ((cp = p_cdname(cp, msg, file)) == NULL)
0d22afd1 197 return (NULL); /* compression error */
a73d974c 198 fprintf(file,"\n\ttype = %s", p_type(type = getshort(cp)));
0d22afd1 199 cp += sizeof(u_short);
a73d974c 200 fprintf(file,", class = %s", p_class(class = getshort(cp)));
0d22afd1 201 cp += sizeof(u_short);
dd4e122b 202 fprintf(file,", ttl = %u", getlong(cp));
0d22afd1 203 cp += sizeof(u_long);
a73d974c 204 fprintf(file,", dlen = %d\n", dlen = getshort(cp));
0d22afd1
RC
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:
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;
228 }
229 break;
230 case T_CNAME:
231 case T_MB:
018df4a9 232#ifdef OLDRR
0d22afd1
RC
233 case T_MD:
234 case T_MF:
018df4a9 235#endif /* OLDRR */
0d22afd1
RC
236 case T_MG:
237 case T_MR:
238 case T_NS:
239 case T_PTR:
a73d974c
KD
240 fprintf(file,"\tdomain name = ");
241 cp = p_cdname(cp, msg, file);
242 fprintf(file,"\n");
0d22afd1
RC
243 break;
244
245 case T_HINFO:
246 if (n = *cp++) {
a73d974c 247 fprintf(file,"\tCPU=%.*s\n", n, cp);
0d22afd1
RC
248 cp += n;
249 }
250 if (n = *cp++) {
a73d974c 251 fprintf(file,"\tOS=%.*s\n", n, cp);
0d22afd1
RC
252 cp += n;
253 }
254 break;
255
256 case T_SOA:
a73d974c
KD
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));
0d22afd1 262 cp += sizeof(u_long);
a73d974c 263 fprintf(file,", refresh=%ld", getlong(cp));
0d22afd1 264 cp += sizeof(u_long);
a73d974c 265 fprintf(file,", retry=%ld", getlong(cp));
0d22afd1 266 cp += sizeof(u_long);
a73d974c 267 fprintf(file,", expire=%ld", getlong(cp));
0d22afd1 268 cp += sizeof(u_long);
a73d974c 269 fprintf(file,", min=%ld\n", getlong(cp));
0d22afd1
RC
270 cp += sizeof(u_long);
271 break;
272
73546a32 273 case T_MX:
018df4a9
KD
274 fprintf(file,"\tpreference = %ld,",getshort(cp));
275 cp += sizeof(u_short);
276 fprintf(file," name = ");
73546a32 277 cp = p_cdname(cp, msg, file);
73546a32
KD
278 break;
279
e515a559 280 case T_MINFO:
a73d974c
KD
281 fprintf(file,"\trequests = ");
282 cp = p_cdname(cp, msg, file);
283 fprintf(file,"\n\terrors = ");
284 cp = p_cdname(cp, msg, file);
e515a559
RC
285 break;
286
0d22afd1 287 case T_UINFO:
a73d974c 288 fprintf(file,"\t%s\n", cp);
0d22afd1
RC
289 cp += dlen;
290 break;
291
292 case T_UID:
293 case T_GID:
294 if (dlen == 4) {
a73d974c 295 fprintf(file,"\t%ld\n", getlong(cp));
0d22afd1
RC
296 cp += sizeof(int);
297 }
298 break;
299
300 case T_WKS:
301 if (dlen < sizeof(u_long) + 1)
302 break;
11e57e73 303 bcopy(cp, (char *)&inaddr, sizeof(inaddr));
0d22afd1 304 cp += sizeof(u_long);
a73d974c 305 fprintf(file,"\tinternet address = %s, protocol = %d\n\t",
0d22afd1
RC
306 inet_ntoa(inaddr), *cp++);
307 n = 0;
308 while (cp < cp1 + dlen) {
309 c = *cp++;
310 do {
a943feed 311 if (c & 0200)
a73d974c 312 fprintf(file," %d", n);
a943feed 313 c <<= 1;
0d22afd1
RC
314 } while (++n & 07);
315 }
a73d974c 316 putc('\n',file);
0d22afd1
RC
317 break;
318
319 default:
a73d974c 320 fprintf(file,"\t???\n");
0d22afd1
RC
321 cp += dlen;
322 }
323 if (cp != cp1 + dlen)
a73d974c
KD
324 fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen);
325 fprintf(file,"\n");
0d22afd1 326 return (cp);
d1c1ab68 327#endif
0d22afd1
RC
328}
329
330static char nbuf[20];
331extern char *sprintf();
332
333/*
334 * Return a string for the type
335 */
336char *
337p_type(type)
338 int type;
339{
0d22afd1
RC
340 switch (type) {
341 case T_A:
342 return("A");
343 case T_NS: /* authoritative server */
344 return("NS");
018df4a9 345#ifdef OLDRR
0d22afd1
RC
346 case T_MD: /* mail destination */
347 return("MD");
348 case T_MF: /* mail forwarder */
349 return("MF");
018df4a9 350#endif /* OLDRR */
0d22afd1
RC
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");
73546a32
KD
359 case T_MX: /* mail routing info */
360 return("MX");
0d22afd1
RC
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 */
395char *
396p_class(class)
397 int class;
398{
399
400 switch (class) {
401 case C_IN: /* internet class */
402 return("IN");
0d22afd1
RC
403 case C_ANY: /* matches any class */
404 return("ANY");
405 default:
406 return (sprintf(nbuf, "%d", class));
407 }
408}