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