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