Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : 4 : SMB2 client lock handling 5 : 6 : Copyright (C) Stefan Metzmacher 2006 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 lock request 28 : */ 29 2355 : struct smb2_request *smb2_lock_send(struct smb2_tree *tree, struct smb2_lock *io) 30 : { 31 8 : struct smb2_request *req; 32 8 : int i; 33 : 34 2363 : req = smb2_request_init_tree(tree, SMB2_OP_LOCK, 35 2355 : 24 + io->in.lock_count*24, false, 0); 36 2355 : if (req == NULL) return NULL; 37 : 38 : /* this is quite bizarre - the spec says we must lie about the length! */ 39 2355 : SSVAL(req->out.body, 0, 0x30); 40 : 41 2355 : SSVAL(req->out.body, 0x02, io->in.lock_count); 42 2355 : SIVAL(req->out.body, 0x04, io->in.lock_sequence); 43 2355 : smb2_push_handle(req->out.body+0x08, &io->in.file.handle); 44 : 45 4784 : for (i=0;i<io->in.lock_count;i++) { 46 2421 : SBVAL(req->out.body, 0x18 + i*24, io->in.locks[i].offset); 47 2421 : SBVAL(req->out.body, 0x20 + i*24, io->in.locks[i].length); 48 2421 : SIVAL(req->out.body, 0x28 + i*24, io->in.locks[i].flags); 49 2421 : SIVAL(req->out.body, 0x2C + i*24, io->in.locks[i].reserved); 50 : } 51 : 52 2355 : smb2_transport_send(req); 53 : 54 2355 : return req; 55 : } 56 : 57 : 58 : /* 59 : recv a lock reply 60 : */ 61 2355 : NTSTATUS smb2_lock_recv(struct smb2_request *req, struct smb2_lock *io) 62 : { 63 4710 : if (!smb2_request_receive(req) || 64 2355 : smb2_request_is_error(req)) { 65 793 : return smb2_request_destroy(req); 66 : } 67 : 68 1562 : SMB2_CHECK_PACKET_RECV(req, 0x04, false); 69 : 70 1562 : io->out.reserved = SVAL(req->in.body, 0x02); 71 : 72 1562 : return smb2_request_destroy(req); 73 : } 74 : 75 : /* 76 : sync lock request 77 : */ 78 2317 : NTSTATUS smb2_lock(struct smb2_tree *tree, struct smb2_lock *io) 79 : { 80 2317 : struct smb2_request *req = smb2_lock_send(tree, io); 81 2317 : return smb2_lock_recv(req, io); 82 : }