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