Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "headers.h"
2
 
3
void
4
smbresponsereset(SmbSession *s)
5
{
6
	smbbufferreset(s->response);
7
}
8
 
9
void
10
smbresponseinit(SmbSession *s, ushort maxlen)
11
{
12
	smbbufferfree(&s->response);
13
	s->response = smbbuffernew(maxlen);
14
}
15
 
16
int
17
smbresponsealignl2(SmbSession *s, int l2a)
18
{
19
	return smbbufferalignl2(s->response, l2a);
20
}
21
 
22
int
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
31
smbresponseputb(SmbSession *s, uchar b)
32
{
33
	return smbbufferputb(s->response, b);
34
}
35
 
36
ushort
37
smbresponsespace(SmbSession *sess)
38
{
39
	return smbbufferwritespace(sess->response);
40
}
41
 
42
int
43
smbresponseskip(SmbSession *sess, ushort amount)
44
{
45
	return smbbufferputbytes(sess->response, nil, amount);
46
}
47
 
48
int
49
smbresponseoffsetputs(SmbSession *sess, ushort offset, ushort s)
50
{
51
	return smbbufferoffsetputs(sess->response, offset, s);
52
}
53
 
54
int
55
smbresponseputs(SmbSession *sess, ushort s)
56
{
57
	return smbbufferputs(sess->response, s);
58
}
59
 
60
int
61
smbresponseputl(SmbSession *s, ulong l)
62
{
63
	return smbbufferputl(s->response, l);
64
}
65
 
66
int
67
smbresponsecpy(SmbSession *s, uchar *data, ushort datalen)
68
{
69
	return smbbufferputbytes(s->response, data, datalen);
70
}
71
 
72
int
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
79
smbresponseputstr(SmbSession *s, char *string)
80
{
81
	return smbbufferputstring(s->response, nil, SMB_STRING_ASCII, string);
82
}
83
 
84
ushort
85
smbresponseoffset(SmbSession *s)
86
{
87
	return smbbufferwriteoffset(s->response);
88
}
89
 
90
SmbProcessResult
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
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
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
}