Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include "headers.h"

void
smbresponsereset(SmbSession *s)
{
        smbbufferreset(s->response);
}

void
smbresponseinit(SmbSession *s, ushort maxlen)
{
        smbbufferfree(&s->response);
        s->response = smbbuffernew(maxlen);
}

int
smbresponsealignl2(SmbSession *s, int l2a)
{
        return smbbufferalignl2(s->response, l2a);
}

int
smbresponseputheader(SmbSession *s, SmbHeader *h, uchar errclass, ushort error)
{
        h->errclass = errclass;
        h->error = error;
        return smbbufferputheader(s->response, h, &s->peerinfo);
}

int
smbresponseputb(SmbSession *s, uchar b)
{
        return smbbufferputb(s->response, b);
}

ushort
smbresponsespace(SmbSession *sess)
{
        return smbbufferwritespace(sess->response);
}

int
smbresponseskip(SmbSession *sess, ushort amount)
{
        return smbbufferputbytes(sess->response, nil, amount);
}

int
smbresponseoffsetputs(SmbSession *sess, ushort offset, ushort s)
{
        return smbbufferoffsetputs(sess->response, offset, s);
}

int
smbresponseputs(SmbSession *sess, ushort s)
{
        return smbbufferputs(sess->response, s);
}

int
smbresponseputl(SmbSession *s, ulong l)
{
        return smbbufferputl(s->response, l);
}

int
smbresponsecpy(SmbSession *s, uchar *data, ushort datalen)
{
        return smbbufferputbytes(s->response, data, datalen);
}

int
smbresponseputstring(SmbSession *s, int mustalign, char *string)
{
        return smbbufferputstring(s->response, &s->peerinfo, mustalign ? 0 : SMB_STRING_UNALIGNED, string);
}

int
smbresponseputstr(SmbSession *s, char *string)
{
        return smbbufferputstring(s->response, nil, SMB_STRING_ASCII, string);
}

ushort
smbresponseoffset(SmbSession *s)
{
        return smbbufferwriteoffset(s->response);
}

SmbProcessResult
smbresponsesend(SmbSession *s)
{
        uchar cmd;
        SmbProcessResult pr;

        assert(smbbufferoffsetgetb(s->response, 4, &cmd));
smbloglock();
smblogprint(cmd, "sending:\n");
smblogdata(cmd, smblogprint, smbbufferreadpointer(s->response), smbbufferreadspace(s->response), 256);
smblogunlock();
        if (s->nbss) {
                NbScatterGather a[2];
                a[0].p = smbbufferreadpointer(s->response);
                a[0].l = smbbufferreadspace(s->response);
                a[1].p = nil;
                nbssgatherwrite(s->nbss, a);
                pr = SmbProcessResultOk;
        }
        else if (s->cifss) {
                ulong l = smbbufferreadspace(s->response);
                uchar nl[4];
                hnputl(nl, l);
                write(s->cifss->fd, nl, 4);
                write(s->cifss->fd, smbbufferreadpointer(s->response), l);
                pr = SmbProcessResultOk;
        }
        else
                pr = SmbProcessResultDie;
        smbbufferreset(s->response);
        return pr;
}

int
smbresponseputandxheader(SmbSession *s, SmbHeader *h, ushort andxcommand, ulong *andxoffsetfixupp)
{
        return smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, andxoffsetfixupp);
}

int
smbresponseputerror(SmbSession *s, SmbHeader *h, uchar errclass, ushort error)
{
        h->wordcount = 0;
        return smbresponseputheader(s, h, errclass, error)
                && smbresponseputs(s, 0);
}