xref: /plan9/sys/src/cmd/aquarela/dump.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include <u.h>
2 #include <libc.h>
3 #include <ip.h>
4 #include <thread.h>
5 #include "netbios.h"
6 
7 static char *
opname(int opcode)8 opname(int opcode)
9 {
10 	switch (opcode) {
11 	case NbnsOpQuery: return "query";
12 	case NbnsOpRegistration: return "registration";
13 	case NbnsOpRelease: return "release";
14 	case NbnsOpWack: return "wack";
15 	case NbnsOpRefresh: return "refresh";
16 	default:
17 		return "???";
18 	}
19 }
20 
21 void
nbnsdumpname(NbName name)22 nbnsdumpname(NbName name)
23 {
24 	int x;
25 	for (x = 0; x < NbNameLen - 1; x++) {
26 		if (name[x] == ' ')
27 			break;
28 		print("%c", tolower(name[x]));
29 	}
30 	print("\\x%.2ux", name[NbNameLen - 1]);
31 }
32 
33 void
nbnsdumpmessagequestion(NbnsMessageQuestion * q)34 nbnsdumpmessagequestion(NbnsMessageQuestion *q)
35 {
36 	print("question: ");
37 	nbnsdumpname(q->name);
38 	switch (q->type) {
39 	case NbnsQuestionTypeNb: print(" NB");	break;
40 	case NbnsQuestionTypeNbStat: print(" NBSTAT"); break;
41 	default: print(" ???");
42 	}
43 	switch (q->class) {
44 	case NbnsQuestionClassIn: print(" IN"); break;
45 	default: print(" ???");
46 	}
47 	print("\n");
48 }
49 
50 void
nbnsdumpmessageresource(NbnsMessageResource * r,char * name)51 nbnsdumpmessageresource(NbnsMessageResource *r, char *name)
52 {
53 	print("%s: ", name);
54 	nbnsdumpname(r->name);
55 	switch (r->type) {
56 	case NbnsResourceTypeA: print(" A");	break;
57 	case NbnsResourceTypeNs: print(" NS");	break;
58 	case NbnsResourceTypeNull: print(" NULL");	break;
59 	case NbnsResourceTypeNb: print(" NB");	break;
60 	case NbnsResourceTypeNbStat: print(" NBSTAT"); break;
61 	default: print(" ???");
62 	}
63 	switch (r->class) {
64 	case NbnsResourceClassIn: print(" IN"); break;
65 	default: print(" ???");
66 	}
67 	print(" ttl: %lud", r->ttl);
68 	if (r->rdlength) {
69 		int i;
70 		print(" rdata: ");
71 		for (i = 0; i < r->rdlength; i++)
72 			print("%.2ux", r->rdata[i]);
73 	}
74 	print("\n");
75 }
76 
77 void
nbnsdumpmessage(NbnsMessage * s)78 nbnsdumpmessage(NbnsMessage *s)
79 {
80 	NbnsMessageQuestion *q;
81 	NbnsMessageResource *r;
82 	print("0x%.4ux %s %s (%d)",
83 		s->id, opname(s->opcode), s->response ? "response" : "request", s->opcode);
84 	if (s->broadcast)
85 		print(" B");
86 	if (s->recursionavailable)
87 		print(" RA");
88 	if (s->recursiondesired)
89 		print(" RD");
90 	if (s->truncation)
91 		print(" TC");
92 	if (s->authoritativeanswer)
93 		print(" AA");
94 	if (s->response)
95 		print(" rcode %d", s->rcode);
96 	print("\n");
97 	for (q = s->q; q; q = q->next)
98 		nbnsdumpmessagequestion(q);
99 	for (r = s->an; r; r = r->next)
100 		nbnsdumpmessageresource(r, "answer");
101 	for (r = s->ns; r; r = r->next)
102 		nbnsdumpmessageresource(r, "ns");
103 	for (r = s->ar; r; r = r->next)
104 		nbnsdumpmessageresource(r, "additional");
105 }
106 
107 void
nbdumpdata(void * ap,long n)108 nbdumpdata(void *ap, long n)
109 {
110 	uchar *p = ap;
111 	long i;
112 	i = 0;
113 	while (i < n) {
114 		int l = n - i < 16 ? n - i : 16;
115 		int b;
116 		print("0x%.4lux  ", i);
117 		for (b = 0; b < l; b += 2) {
118 			print(" %.2ux", p[i + b]);
119 			if (b < l - 1)
120 				print("%.2ux", p[i + b + 1]);
121 			else
122 				print("  ");
123 		}
124 		while (b < 16) {
125 			print("     ");
126 			b++;
127 		}
128 		print("        ");
129 		for (b = 0; b < l; b++)
130 			if (p[i + b] >= ' ' && p[i + b] <= '~')
131 				print("%c", p[i + b]);
132 			else
133 				print(".");
134 		print("\n");
135 		i += l;
136 	}
137 }
138