Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : SMB2 client write call
5 :
6 : Copyright (C) Andrew Tridgell 2005
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "libcli/smb2/smb2.h"
24 : #include "libcli/smb2/smb2_calls.h"
25 :
26 : /*
27 : send a write request
28 : */
29 237 : struct smb2_request *smb2_write_send(struct smb2_tree *tree, struct smb2_write *io)
30 : {
31 : NTSTATUS status;
32 : struct smb2_request *req;
33 :
34 237 : req = smb2_request_init_tree(tree, SMB2_OP_WRITE, 0x30, true, io->in.data.length);
35 237 : if (req == NULL) return NULL;
36 :
37 237 : status = smb2_push_o16s32_blob(&req->out, 0x02, io->in.data);
38 237 : if (!NT_STATUS_IS_OK(status)) {
39 0 : talloc_free(req);
40 0 : return NULL;
41 : }
42 :
43 237 : SBVAL(req->out.body, 0x08, io->in.offset);
44 237 : smb2_push_handle(req->out.body+0x10, &io->in.file.handle);
45 :
46 237 : SBVAL(req->out.body, 0x20, io->in.unknown1);
47 237 : SBVAL(req->out.body, 0x28, io->in.unknown2);
48 :
49 237 : smb2_transport_send(req);
50 :
51 237 : return req;
52 : }
53 :
54 :
55 : /*
56 : recv a write reply
57 : */
58 237 : NTSTATUS smb2_write_recv(struct smb2_request *req, struct smb2_write *io)
59 : {
60 472 : if (!smb2_request_receive(req) ||
61 237 : !smb2_request_is_ok(req)) {
62 48 : return smb2_request_destroy(req);
63 : }
64 :
65 189 : SMB2_CHECK_PACKET_RECV(req, 0x10, true);
66 :
67 189 : io->out._pad = SVAL(req->in.body, 0x02);
68 189 : io->out.nwritten = IVAL(req->in.body, 0x04);
69 189 : io->out.unknown1 = BVAL(req->in.body, 0x08);
70 :
71 189 : return smb2_request_destroy(req);
72 : }
73 :
74 : /*
75 : sync write request
76 : */
77 237 : NTSTATUS smb2_write(struct smb2_tree *tree, struct smb2_write *io)
78 : {
79 237 : struct smb2_request *req = smb2_write_send(tree, io);
80 237 : return smb2_write_recv(req, io);
81 : }
|