123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #include "headers.h"
- static int
- deliver(void *, NbDgram *s)
- {
- SmbHeader h;
- uchar *pdata;
- ushort bytecount;
- SmbBuffer *b;
- char *errmsg;
- SmbTransaction transaction;
- int rv;
- // int x;
- char *comment, *servername;
- unsigned char opcode, updatecount, versionminor, versionmajor;
- ulong periodicity, signature, type;
- errmsg = nil;
- comment = nil;
- servername = nil;
- // nbdumpdata(s->datagram.data, s->datagram.length);
- b = smbbufferinit(s->datagram.data, s->datagram.data, s->datagram.length);
- if (!smbbuffergetandcheckheader(b, &h, SMB_COM_TRANSACTION, 0, &pdata, &bytecount, &errmsg)) {
- print("ignored: %s\n", errmsg);
- goto done;
- }
- memset(&transaction, 0, sizeof(transaction));
- rv = smbtransactiondecodeprimary(&transaction, &h, pdata, b, &errmsg);
- if (rv < 0) {
- print("transaction decode fail: %s\n", errmsg);
- goto done;
- }
- if (rv == 0) {
- print("transaction too big\n");
- goto done;
- }
- /*
- print("name: %s\n", transaction.in.name);
- print("setup:");
- for (x = 0; x < transaction.in.scount; x++)
- print(" 0x%.4ux", transaction.in.setup[x]);
- print("\n");
- print("parameters:\n");
- nbdumpdata(transaction.in.parameters, transaction.in.tpcount);
- print("data:\n");
- nbdumpdata(transaction.in.data, transaction.in.tdcount);
- */
- if (strcmp(transaction.in.name, "\\MAILSLOT\\BROWSE") != 0) {
- print("not a supported mailslot\n");
- goto done;
- }
-
- if (!smbbuffergetb(b, &opcode)) {
- print("not enough data for opcode\n");
- goto done;
- }
- if (opcode != 1) {
- print("not a supported mailslot opcode %d\n", opcode);
- goto done;
- }
-
- if (!smbbuffergetb(b, &updatecount)
- || !smbbuffergetl(b, &periodicity)
- || !smbbuffergetstrn(b, 16, &servername)
- || !smbbuffergetb(b, &versionmajor)
- || !smbbuffergetb(b, &versionminor)
- || !smbbuffergetl(b, &type)
- || !smbbuffergetl(b, &signature)
- || !smbbuffergetstr(b, &comment)) {
- print("mailslot parse failed\n");
- goto done;
- }
- /*
- * not advisable to check this! Netgear printservers send 0x55aa
- if ((signature & 0xffff0000) != 0xaa550000) {
- print("wrong signature\n");
- goto done;
- }
- */
- print("%s: period %ludms version %d.%d type 0x%.8lux browserversion %d.%d comment %s\n",
- servername, periodicity, versionmajor, versionminor, type, (signature >> 8) & 0xff, signature & 0xff, comment);
- done:
- free(errmsg);
- free(comment);
- free(servername);
- smbtransactionfree(&transaction);
- smbbufferfree(&b);
- return 1;
- }
- void
- threadmain(int, char **)
- {
- char *e;
- NbDgramSendParameters p;
- nbinit();
- smbglobalsguess(1);
- nbmknamefromstringandtype(p.to, smbglobals.primarydomain, 0x1d);
- e = nbdgramlisten(p.to, deliver, nil);
- if (e) {
- print("listen failed: %s\n", e);
- threadexitsall("net");
- }
- p.type = NbDgramDirectUnique;
- for (;;) {
- if (!smbbrowsesendhostannouncement(smbglobals.serverinfo.name, 3 * 60 * 1000,
- SV_TYPE_SERVER,
- "Testing testing", &e)) {
- print("hostannounce failed: %s\n", e);
- }
- sleep(60 * 1000);
- }
- }
|