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