1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier
3*8ccd4a63SDavid du Colombier void
smbresponsereset(SmbSession * s)4*8ccd4a63SDavid du Colombier smbresponsereset(SmbSession *s)
5*8ccd4a63SDavid du Colombier {
6*8ccd4a63SDavid du Colombier smbbufferreset(s->response);
7*8ccd4a63SDavid du Colombier }
8*8ccd4a63SDavid du Colombier
9*8ccd4a63SDavid du Colombier void
smbresponseinit(SmbSession * s,ushort maxlen)10*8ccd4a63SDavid du Colombier smbresponseinit(SmbSession *s, ushort maxlen)
11*8ccd4a63SDavid du Colombier {
12*8ccd4a63SDavid du Colombier smbbufferfree(&s->response);
13*8ccd4a63SDavid du Colombier s->response = smbbuffernew(maxlen);
14*8ccd4a63SDavid du Colombier }
15*8ccd4a63SDavid du Colombier
16*8ccd4a63SDavid du Colombier int
smbresponsealignl2(SmbSession * s,int l2a)17*8ccd4a63SDavid du Colombier smbresponsealignl2(SmbSession *s, int l2a)
18*8ccd4a63SDavid du Colombier {
19*8ccd4a63SDavid du Colombier return smbbufferalignl2(s->response, l2a);
20*8ccd4a63SDavid du Colombier }
21*8ccd4a63SDavid du Colombier
22*8ccd4a63SDavid du Colombier int
smbresponseputheader(SmbSession * s,SmbHeader * h,uchar errclass,ushort error)23*8ccd4a63SDavid du Colombier smbresponseputheader(SmbSession *s, SmbHeader *h, uchar errclass, ushort error)
24*8ccd4a63SDavid du Colombier {
25*8ccd4a63SDavid du Colombier h->errclass = errclass;
26*8ccd4a63SDavid du Colombier h->error = error;
27*8ccd4a63SDavid du Colombier return smbbufferputheader(s->response, h, &s->peerinfo);
28*8ccd4a63SDavid du Colombier }
29*8ccd4a63SDavid du Colombier
30*8ccd4a63SDavid du Colombier int
smbresponseputb(SmbSession * s,uchar b)31*8ccd4a63SDavid du Colombier smbresponseputb(SmbSession *s, uchar b)
32*8ccd4a63SDavid du Colombier {
33*8ccd4a63SDavid du Colombier return smbbufferputb(s->response, b);
34*8ccd4a63SDavid du Colombier }
35*8ccd4a63SDavid du Colombier
36*8ccd4a63SDavid du Colombier ushort
smbresponsespace(SmbSession * sess)37*8ccd4a63SDavid du Colombier smbresponsespace(SmbSession *sess)
38*8ccd4a63SDavid du Colombier {
39*8ccd4a63SDavid du Colombier return smbbufferwritespace(sess->response);
40*8ccd4a63SDavid du Colombier }
41*8ccd4a63SDavid du Colombier
42*8ccd4a63SDavid du Colombier int
smbresponseskip(SmbSession * sess,ushort amount)43*8ccd4a63SDavid du Colombier smbresponseskip(SmbSession *sess, ushort amount)
44*8ccd4a63SDavid du Colombier {
45*8ccd4a63SDavid du Colombier return smbbufferputbytes(sess->response, nil, amount);
46*8ccd4a63SDavid du Colombier }
47*8ccd4a63SDavid du Colombier
48*8ccd4a63SDavid du Colombier int
smbresponseoffsetputs(SmbSession * sess,ushort offset,ushort s)49*8ccd4a63SDavid du Colombier smbresponseoffsetputs(SmbSession *sess, ushort offset, ushort s)
50*8ccd4a63SDavid du Colombier {
51*8ccd4a63SDavid du Colombier return smbbufferoffsetputs(sess->response, offset, s);
52*8ccd4a63SDavid du Colombier }
53*8ccd4a63SDavid du Colombier
54*8ccd4a63SDavid du Colombier int
smbresponseputs(SmbSession * sess,ushort s)55*8ccd4a63SDavid du Colombier smbresponseputs(SmbSession *sess, ushort s)
56*8ccd4a63SDavid du Colombier {
57*8ccd4a63SDavid du Colombier return smbbufferputs(sess->response, s);
58*8ccd4a63SDavid du Colombier }
59*8ccd4a63SDavid du Colombier
60*8ccd4a63SDavid du Colombier int
smbresponseputl(SmbSession * s,ulong l)61*8ccd4a63SDavid du Colombier smbresponseputl(SmbSession *s, ulong l)
62*8ccd4a63SDavid du Colombier {
63*8ccd4a63SDavid du Colombier return smbbufferputl(s->response, l);
64*8ccd4a63SDavid du Colombier }
65*8ccd4a63SDavid du Colombier
66*8ccd4a63SDavid du Colombier int
smbresponsecpy(SmbSession * s,uchar * data,ushort datalen)67*8ccd4a63SDavid du Colombier smbresponsecpy(SmbSession *s, uchar *data, ushort datalen)
68*8ccd4a63SDavid du Colombier {
69*8ccd4a63SDavid du Colombier return smbbufferputbytes(s->response, data, datalen);
70*8ccd4a63SDavid du Colombier }
71*8ccd4a63SDavid du Colombier
72*8ccd4a63SDavid du Colombier int
smbresponseputstring(SmbSession * s,int mustalign,char * string)73*8ccd4a63SDavid du Colombier smbresponseputstring(SmbSession *s, int mustalign, char *string)
74*8ccd4a63SDavid du Colombier {
75*8ccd4a63SDavid du Colombier return smbbufferputstring(s->response, &s->peerinfo, mustalign ? 0 : SMB_STRING_UNALIGNED, string);
76*8ccd4a63SDavid du Colombier }
77*8ccd4a63SDavid du Colombier
78*8ccd4a63SDavid du Colombier int
smbresponseputstr(SmbSession * s,char * string)79*8ccd4a63SDavid du Colombier smbresponseputstr(SmbSession *s, char *string)
80*8ccd4a63SDavid du Colombier {
81*8ccd4a63SDavid du Colombier return smbbufferputstring(s->response, nil, SMB_STRING_ASCII, string);
82*8ccd4a63SDavid du Colombier }
83*8ccd4a63SDavid du Colombier
84*8ccd4a63SDavid du Colombier ushort
smbresponseoffset(SmbSession * s)85*8ccd4a63SDavid du Colombier smbresponseoffset(SmbSession *s)
86*8ccd4a63SDavid du Colombier {
87*8ccd4a63SDavid du Colombier return smbbufferwriteoffset(s->response);
88*8ccd4a63SDavid du Colombier }
89*8ccd4a63SDavid du Colombier
90*8ccd4a63SDavid du Colombier SmbProcessResult
smbresponsesend(SmbSession * s)91*8ccd4a63SDavid du Colombier smbresponsesend(SmbSession *s)
92*8ccd4a63SDavid du Colombier {
93*8ccd4a63SDavid du Colombier uchar cmd;
94*8ccd4a63SDavid du Colombier SmbProcessResult pr;
95*8ccd4a63SDavid du Colombier
96*8ccd4a63SDavid du Colombier assert(smbbufferoffsetgetb(s->response, 4, &cmd));
97*8ccd4a63SDavid du Colombier smbloglock();
98*8ccd4a63SDavid du Colombier smblogprint(cmd, "sending:\n");
99*8ccd4a63SDavid du Colombier smblogdata(cmd, smblogprint, smbbufferreadpointer(s->response), smbbufferreadspace(s->response), 256);
100*8ccd4a63SDavid du Colombier smblogunlock();
101*8ccd4a63SDavid du Colombier if (s->nbss) {
102*8ccd4a63SDavid du Colombier NbScatterGather a[2];
103*8ccd4a63SDavid du Colombier a[0].p = smbbufferreadpointer(s->response);
104*8ccd4a63SDavid du Colombier a[0].l = smbbufferreadspace(s->response);
105*8ccd4a63SDavid du Colombier a[1].p = nil;
106*8ccd4a63SDavid du Colombier nbssgatherwrite(s->nbss, a);
107*8ccd4a63SDavid du Colombier pr = SmbProcessResultOk;
108*8ccd4a63SDavid du Colombier }
109*8ccd4a63SDavid du Colombier else if (s->cifss) {
110*8ccd4a63SDavid du Colombier ulong l = smbbufferreadspace(s->response);
111*8ccd4a63SDavid du Colombier uchar nl[4];
112*8ccd4a63SDavid du Colombier hnputl(nl, l);
113*8ccd4a63SDavid du Colombier write(s->cifss->fd, nl, 4);
114*8ccd4a63SDavid du Colombier write(s->cifss->fd, smbbufferreadpointer(s->response), l);
115*8ccd4a63SDavid du Colombier pr = SmbProcessResultOk;
116*8ccd4a63SDavid du Colombier }
117*8ccd4a63SDavid du Colombier else
118*8ccd4a63SDavid du Colombier pr = SmbProcessResultDie;
119*8ccd4a63SDavid du Colombier smbbufferreset(s->response);
120*8ccd4a63SDavid du Colombier return pr;
121*8ccd4a63SDavid du Colombier }
122*8ccd4a63SDavid du Colombier
123*8ccd4a63SDavid du Colombier int
smbresponseputandxheader(SmbSession * s,SmbHeader * h,ushort andxcommand,ulong * andxoffsetfixupp)124*8ccd4a63SDavid du Colombier smbresponseputandxheader(SmbSession *s, SmbHeader *h, ushort andxcommand, ulong *andxoffsetfixupp)
125*8ccd4a63SDavid du Colombier {
126*8ccd4a63SDavid du Colombier return smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, andxoffsetfixupp);
127*8ccd4a63SDavid du Colombier }
128*8ccd4a63SDavid du Colombier
129*8ccd4a63SDavid du Colombier int
smbresponseputerror(SmbSession * s,SmbHeader * h,uchar errclass,ushort error)130*8ccd4a63SDavid du Colombier smbresponseputerror(SmbSession *s, SmbHeader *h, uchar errclass, ushort error)
131*8ccd4a63SDavid du Colombier {
132*8ccd4a63SDavid du Colombier h->wordcount = 0;
133*8ccd4a63SDavid du Colombier return smbresponseputheader(s, h, errclass, error)
134*8ccd4a63SDavid du Colombier && smbresponseputs(s, 0);
135*8ccd4a63SDavid du Colombier }
136