Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "headers.h"
2
 
3
static int
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
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
}