xref: /plan9-contrib/sys/src/cmd/aquarela/testnbdgram.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier 
3*8ccd4a63SDavid du Colombier static int
deliver(void *,NbDgram * s)4*8ccd4a63SDavid du Colombier deliver(void *, NbDgram *s)
5*8ccd4a63SDavid du Colombier {
6*8ccd4a63SDavid du Colombier 	SmbHeader h;
7*8ccd4a63SDavid du Colombier 	uchar *pdata;
8*8ccd4a63SDavid du Colombier 	ushort bytecount;
9*8ccd4a63SDavid du Colombier 	SmbBuffer *b;
10*8ccd4a63SDavid du Colombier 	char *errmsg;
11*8ccd4a63SDavid du Colombier 	SmbTransaction transaction;
12*8ccd4a63SDavid du Colombier 	int rv;
13*8ccd4a63SDavid du Colombier //	int x;
14*8ccd4a63SDavid du Colombier 	char *comment, *servername;
15*8ccd4a63SDavid du Colombier 	unsigned char opcode, updatecount, versionminor, versionmajor;
16*8ccd4a63SDavid du Colombier 	ulong periodicity, signature, type;
17*8ccd4a63SDavid du Colombier 
18*8ccd4a63SDavid du Colombier 	errmsg = nil;
19*8ccd4a63SDavid du Colombier 	comment = nil;
20*8ccd4a63SDavid du Colombier 	servername = nil;
21*8ccd4a63SDavid du Colombier //	nbdumpdata(s->datagram.data, s->datagram.length);
22*8ccd4a63SDavid du Colombier 	b = smbbufferinit(s->datagram.data, s->datagram.data, s->datagram.length);
23*8ccd4a63SDavid du Colombier 	if (!smbbuffergetandcheckheader(b, &h, SMB_COM_TRANSACTION, 0, &pdata, &bytecount, &errmsg)) {
24*8ccd4a63SDavid du Colombier 		print("ignored: %s\n", errmsg);
25*8ccd4a63SDavid du Colombier 		goto done;
26*8ccd4a63SDavid du Colombier 	}
27*8ccd4a63SDavid du Colombier 	memset(&transaction, 0, sizeof(transaction));
28*8ccd4a63SDavid du Colombier 	rv = smbtransactiondecodeprimary(&transaction, &h, pdata, b, &errmsg);
29*8ccd4a63SDavid du Colombier 	if (rv < 0) {
30*8ccd4a63SDavid du Colombier 		print("transaction decode fail: %s\n", errmsg);
31*8ccd4a63SDavid du Colombier 		goto done;
32*8ccd4a63SDavid du Colombier 	}
33*8ccd4a63SDavid du Colombier 	if (rv == 0) {
34*8ccd4a63SDavid du Colombier 		print("transaction too big\n");
35*8ccd4a63SDavid du Colombier 		goto done;
36*8ccd4a63SDavid du Colombier 	}
37*8ccd4a63SDavid du Colombier /*
38*8ccd4a63SDavid du Colombier 	print("name: %s\n", transaction.in.name);
39*8ccd4a63SDavid du Colombier 	print("setup:");
40*8ccd4a63SDavid du Colombier 	for (x = 0; x < transaction.in.scount; x++)
41*8ccd4a63SDavid du Colombier 		print(" 0x%.4ux", transaction.in.setup[x]);
42*8ccd4a63SDavid du Colombier 	print("\n");
43*8ccd4a63SDavid du Colombier 	print("parameters:\n");
44*8ccd4a63SDavid du Colombier 	nbdumpdata(transaction.in.parameters, transaction.in.tpcount);
45*8ccd4a63SDavid du Colombier 	print("data:\n");
46*8ccd4a63SDavid du Colombier 	nbdumpdata(transaction.in.data, transaction.in.tdcount);
47*8ccd4a63SDavid du Colombier */
48*8ccd4a63SDavid du Colombier 	if (strcmp(transaction.in.name, "\\MAILSLOT\\BROWSE") != 0) {
49*8ccd4a63SDavid du Colombier 		print("not a supported mailslot\n");
50*8ccd4a63SDavid du Colombier 		goto done;
51*8ccd4a63SDavid du Colombier 	}
52*8ccd4a63SDavid du Colombier 
53*8ccd4a63SDavid du Colombier 	if (!smbbuffergetb(b, &opcode)) {
54*8ccd4a63SDavid du Colombier 		print("not enough data for opcode\n");
55*8ccd4a63SDavid du Colombier 		goto done;
56*8ccd4a63SDavid du Colombier 	}
57*8ccd4a63SDavid du Colombier 
58*8ccd4a63SDavid du Colombier 	if (opcode != 1) {
59*8ccd4a63SDavid du Colombier 		print("not a supported mailslot opcode %d\n", opcode);
60*8ccd4a63SDavid du Colombier 		goto done;
61*8ccd4a63SDavid du Colombier 	}
62*8ccd4a63SDavid du Colombier 
63*8ccd4a63SDavid du Colombier 	if (!smbbuffergetb(b, &updatecount)
64*8ccd4a63SDavid du Colombier 		|| !smbbuffergetl(b, &periodicity)
65*8ccd4a63SDavid du Colombier 		|| !smbbuffergetstrn(b, 16, &servername)
66*8ccd4a63SDavid du Colombier 		|| !smbbuffergetb(b, &versionmajor)
67*8ccd4a63SDavid du Colombier 		|| !smbbuffergetb(b, &versionminor)
68*8ccd4a63SDavid du Colombier 		|| !smbbuffergetl(b, &type)
69*8ccd4a63SDavid du Colombier 		|| !smbbuffergetl(b, &signature)
70*8ccd4a63SDavid du Colombier 		|| !smbbuffergetstr(b, &comment)) {
71*8ccd4a63SDavid du Colombier 		print("mailslot parse failed\n");
72*8ccd4a63SDavid du Colombier 		goto done;
73*8ccd4a63SDavid du Colombier 	}
74*8ccd4a63SDavid du Colombier /*
75*8ccd4a63SDavid du Colombier  * not advisable to check this! Netgear printservers send 0x55aa
76*8ccd4a63SDavid du Colombier 	if ((signature & 0xffff0000) != 0xaa550000) {
77*8ccd4a63SDavid du Colombier 		print("wrong signature\n");
78*8ccd4a63SDavid du Colombier 		goto done;
79*8ccd4a63SDavid du Colombier 	}
80*8ccd4a63SDavid du Colombier */
81*8ccd4a63SDavid du Colombier 	print("%s: period %ludms version %d.%d type 0x%.8lux browserversion %d.%d comment %s\n",
82*8ccd4a63SDavid du Colombier 		servername, periodicity, versionmajor, versionminor, type, (signature >> 8) & 0xff, signature & 0xff, comment);
83*8ccd4a63SDavid du Colombier done:
84*8ccd4a63SDavid du Colombier 	free(errmsg);
85*8ccd4a63SDavid du Colombier 	free(comment);
86*8ccd4a63SDavid du Colombier 	free(servername);
87*8ccd4a63SDavid du Colombier 	smbtransactionfree(&transaction);
88*8ccd4a63SDavid du Colombier 	smbbufferfree(&b);
89*8ccd4a63SDavid du Colombier 	return 1;
90*8ccd4a63SDavid du Colombier }
91*8ccd4a63SDavid du Colombier 
92*8ccd4a63SDavid du Colombier void
threadmain(int,char **)93*8ccd4a63SDavid du Colombier threadmain(int, char **)
94*8ccd4a63SDavid du Colombier {
95*8ccd4a63SDavid du Colombier 	char *e;
96*8ccd4a63SDavid du Colombier 	NbDgramSendParameters p;
97*8ccd4a63SDavid du Colombier 	nbinit();
98*8ccd4a63SDavid du Colombier 	smbglobalsguess(1);
99*8ccd4a63SDavid du Colombier 	nbmknamefromstringandtype(p.to, smbglobals.primarydomain, 0x1d);
100*8ccd4a63SDavid du Colombier 	e = nbdgramlisten(p.to, deliver, nil);
101*8ccd4a63SDavid du Colombier 	if (e) {
102*8ccd4a63SDavid du Colombier 		print("listen failed: %s\n", e);
103*8ccd4a63SDavid du Colombier 		threadexitsall("net");
104*8ccd4a63SDavid du Colombier 	}
105*8ccd4a63SDavid du Colombier 	p.type = NbDgramDirectUnique;
106*8ccd4a63SDavid du Colombier 	for (;;) {
107*8ccd4a63SDavid du Colombier 		if (!smbbrowsesendhostannouncement(smbglobals.serverinfo.name, 3 * 60 * 1000,
108*8ccd4a63SDavid du Colombier 			SV_TYPE_SERVER,
109*8ccd4a63SDavid du Colombier 			"Testing testing", &e)) {
110*8ccd4a63SDavid du Colombier 			print("hostannounce failed: %s\n", e);
111*8ccd4a63SDavid du Colombier 		}
112*8ccd4a63SDavid du Colombier 		sleep(60 * 1000);
113*8ccd4a63SDavid du Colombier 	}
114*8ccd4a63SDavid du Colombier }
115