xref: /plan9/sys/src/cmd/aquarela/smbresponse.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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