nslookup uses the strings, put them in but make the names harder to hit
[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
2ce81398 7#if defined(LIBC_SCCS) && !defined(lint)
cd43bd6a 8static char sccsid[] = "@(#)res_debug.c 5.19 (Berkeley) %G%";
2ce81398 9#endif LIBC_SCCS and not lint
8ea4199d 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
cd43bd6a 23char *_res_opcodes[] = {
0d22afd1
RC
24 "QUERY",
25 "IQUERY",
26 "CQUERYM",
27 "CQUERYU",
28 "4",
29 "5",
30 "6",
31 "7",
32 "8",
0d22afd1
RC
33 "UPDATEA",
34 "UPDATED",
3e8361d9 35 "UPDATEDA",
0d22afd1 36 "UPDATEM",
3e8361d9 37 "UPDATEMA",
0d22afd1
RC
38 "ZONEINIT",
39 "ZONEREF",
40};
41
cd43bd6a 42char *_res_resultcodes[] = {
0d22afd1
RC
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 87 fprintf(file,"HEADER:\n");
1e12917d 88 fprintf(file,"\topcode = %s", _opcodes[hp->opcode]);
a73d974c 89 fprintf(file,", id = %d", ntohs(hp->id));
1e12917d 90 fprintf(file,", rcode = %s\n", _rcodes[hp->rcode]);
a73d974c 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;
20087cad 118 fprintf(file,", type = %s", p_type(_getshort(cp)));
0d22afd1 119 cp += sizeof(u_short);
20087cad 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 */
20087cad 198 fprintf(file,"\n\ttype = %s", p_type(type = _getshort(cp)));
0d22afd1 199 cp += sizeof(u_short);
20087cad 200 fprintf(file,", class = %s", p_class(class = _getshort(cp)));
0d22afd1 201 cp += sizeof(u_short);
20087cad 202 fprintf(file,", ttl = %u", _getlong(cp));
0d22afd1 203 cp += sizeof(u_long);
20087cad 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;
e0dd8906
KD
228 default:
229 cp += dlen;
0d22afd1
RC
230 }
231 break;
232 case T_CNAME:
233 case T_MB:
018df4a9 234#ifdef OLDRR
0d22afd1
RC
235 case T_MD:
236 case T_MF:
018df4a9 237#endif /* OLDRR */
0d22afd1
RC
238 case T_MG:
239 case T_MR:
240 case T_NS:
241 case T_PTR:
a73d974c
KD
242 fprintf(file,"\tdomain name = ");
243 cp = p_cdname(cp, msg, file);
244 fprintf(file,"\n");
0d22afd1
RC
245 break;
246
247 case T_HINFO:
248 if (n = *cp++) {
a73d974c 249 fprintf(file,"\tCPU=%.*s\n", n, cp);
0d22afd1
RC
250 cp += n;
251 }
252 if (n = *cp++) {
a73d974c 253 fprintf(file,"\tOS=%.*s\n", n, cp);
0d22afd1
RC
254 cp += n;
255 }
256 break;
257
258 case T_SOA:
a73d974c
KD
259 fprintf(file,"\torigin = ");
260 cp = p_cdname(cp, msg, file);
261 fprintf(file,"\n\tmail addr = ");
262 cp = p_cdname(cp, msg, file);
20087cad 263 fprintf(file,"\n\tserial=%ld", _getlong(cp));
0d22afd1 264 cp += sizeof(u_long);
20087cad 265 fprintf(file,", refresh=%ld", _getlong(cp));
0d22afd1 266 cp += sizeof(u_long);
20087cad 267 fprintf(file,", retry=%ld", _getlong(cp));
0d22afd1 268 cp += sizeof(u_long);
20087cad 269 fprintf(file,", expire=%ld", _getlong(cp));
0d22afd1 270 cp += sizeof(u_long);
20087cad 271 fprintf(file,", min=%ld\n", _getlong(cp));
0d22afd1
RC
272 cp += sizeof(u_long);
273 break;
274
73546a32 275 case T_MX:
20087cad 276 fprintf(file,"\tpreference = %ld,",_getshort(cp));
018df4a9
KD
277 cp += sizeof(u_short);
278 fprintf(file," name = ");
73546a32 279 cp = p_cdname(cp, msg, file);
73546a32
KD
280 break;
281
e515a559 282 case T_MINFO:
a73d974c
KD
283 fprintf(file,"\trequests = ");
284 cp = p_cdname(cp, msg, file);
285 fprintf(file,"\n\terrors = ");
286 cp = p_cdname(cp, msg, file);
e515a559
RC
287 break;
288
0d22afd1 289 case T_UINFO:
a73d974c 290 fprintf(file,"\t%s\n", cp);
0d22afd1
RC
291 cp += dlen;
292 break;
293
294 case T_UID:
295 case T_GID:
296 if (dlen == 4) {
20087cad 297 fprintf(file,"\t%ld\n", _getlong(cp));
0d22afd1
RC
298 cp += sizeof(int);
299 }
300 break;
301
302 case T_WKS:
303 if (dlen < sizeof(u_long) + 1)
304 break;
11e57e73 305 bcopy(cp, (char *)&inaddr, sizeof(inaddr));
0d22afd1 306 cp += sizeof(u_long);
a73d974c 307 fprintf(file,"\tinternet address = %s, protocol = %d\n\t",
0d22afd1
RC
308 inet_ntoa(inaddr), *cp++);
309 n = 0;
310 while (cp < cp1 + dlen) {
311 c = *cp++;
312 do {
a943feed 313 if (c & 0200)
a73d974c 314 fprintf(file," %d", n);
a943feed 315 c <<= 1;
0d22afd1
RC
316 } while (++n & 07);
317 }
a73d974c 318 putc('\n',file);
0d22afd1
RC
319 break;
320
3bf25746 321#ifdef ALLOW_T_UNSPEC
1e12917d
KB
322 case T_UNSPEC:
323 {
324 int NumBytes = 8;
325 char *DataPtr;
326 int i;
3bf25746 327
1e12917d
KB
328 if (dlen < NumBytes) NumBytes = dlen;
329 fprintf(file, "\tFirst %d bytes of hex data:",
330 NumBytes);
331 for (i = 0, DataPtr = cp; i < NumBytes; i++, DataPtr++)
332 fprintf(file, " %x", *DataPtr);
333 fputs("\n", file);
334 cp += dlen;
335 }
336 break;
337#endif /* ALLOW_T_UNSPEC */
3bf25746 338
0d22afd1 339 default:
a73d974c 340 fprintf(file,"\t???\n");
0d22afd1
RC
341 cp += dlen;
342 }
343 if (cp != cp1 + dlen)
a73d974c
KD
344 fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen);
345 fprintf(file,"\n");
0d22afd1 346 return (cp);
d1c1ab68 347#endif
0d22afd1
RC
348}
349
350static char nbuf[20];
351extern char *sprintf();
352
353/*
354 * Return a string for the type
355 */
356char *
357p_type(type)
358 int type;
359{
0d22afd1
RC
360 switch (type) {
361 case T_A:
362 return("A");
363 case T_NS: /* authoritative server */
364 return("NS");
018df4a9 365#ifdef OLDRR
0d22afd1
RC
366 case T_MD: /* mail destination */
367 return("MD");
368 case T_MF: /* mail forwarder */
369 return("MF");
018df4a9 370#endif /* OLDRR */
0d22afd1
RC
371 case T_CNAME: /* connonical name */
372 return("CNAME");
373 case T_SOA: /* start of authority zone */
374 return("SOA");
375 case T_MB: /* mailbox domain name */
376 return("MB");
377 case T_MG: /* mail group member */
378 return("MG");
73546a32
KD
379 case T_MX: /* mail routing info */
380 return("MX");
0d22afd1
RC
381 case T_MR: /* mail rename name */
382 return("MR");
383 case T_NULL: /* null resource record */
384 return("NULL");
385 case T_WKS: /* well known service */
386 return("WKS");
387 case T_PTR: /* domain name pointer */
388 return("PTR");
389 case T_HINFO: /* host information */
390 return("HINFO");
391 case T_MINFO: /* mailbox information */
392 return("MINFO");
393 case T_AXFR: /* zone transfer */
394 return("AXFR");
395 case T_MAILB: /* mail box */
396 return("MAILB");
397 case T_MAILA: /* mail address */
398 return("MAILA");
399 case T_ANY: /* matches any type */
400 return("ANY");
401 case T_UINFO:
402 return("UINFO");
403 case T_UID:
404 return("UID");
405 case T_GID:
406 return("GID");
3bf25746 407#ifdef ALLOW_T_UNSPEC
1e12917d
KB
408 case T_UNSPEC:
409 return("UNSPEC");
410#endif /* ALLOW_T_UNSPEC */
0d22afd1
RC
411 default:
412 return (sprintf(nbuf, "%d", type));
413 }
414}
415
416/*
417 * Return a mnemonic for class
418 */
419char *
420p_class(class)
421 int class;
422{
423
424 switch (class) {
425 case C_IN: /* internet class */
426 return("IN");
0d22afd1
RC
427 case C_ANY: /* matches any class */
428 return("ANY");
429 default:
430 return (sprintf(nbuf, "%d", class));
431 }
432}