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