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