#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); } }