Subversion Repositories planix.SVN

Rev

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

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