s3:libsmb: add SMB2/3 support to cli_dfs_get_referral()
[Samba.git] / libcli / smb / smb2_lease.c
blob10beacac25ac69a09dbf5550acb761ad934619c5
1 /*
2 Unix SMB/CIFS implementation.
4 SMB2 Lease context handling
6 Copyright (C) Stefan Metzmacher 2012
7 Copyright (C) Volker Lendecke 2013
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "includes.h"
24 #include "../libcli/smb/smb_common.h"
26 ssize_t smb2_lease_pull(uint8_t *buf, size_t len, struct smb2_lease *lease)
28 int version;
30 switch (len) {
31 case 32:
32 version = 1;
33 break;
34 case 52:
35 version = 2;
36 break;
37 default:
38 return -1;
41 memcpy(&lease->lease_key, buf, 16);
42 lease->lease_state = IVAL(buf, 16);
43 lease->lease_flags = IVAL(buf, 20);
44 lease->lease_duration = BVAL(buf, 24);
46 switch (version) {
47 case 1:
48 memcpy(&lease->parent_lease_key, buf+32, 16);
49 lease->lease_epoch = SVAL(buf, 48);
50 break;
51 case 2:
52 ZERO_STRUCT(lease->parent_lease_key);
53 lease->lease_epoch = 0;
54 break;
57 return len;
60 bool smb2_lease_push(const struct smb2_lease *lease, uint8_t *buf, size_t len)
62 int version;
64 switch (len) {
65 case 32:
66 version = 1;
67 break;
68 case 52:
69 version = 2;
70 break;
71 default:
72 return false;
75 memcpy(&buf[0], &lease->lease_key, 16);
76 SIVAL(buf, 16, lease->lease_state);
77 SIVAL(buf, 20, lease->lease_flags);
78 SBVAL(buf, 24, lease->lease_duration);
80 if (version == 2) {
81 memcpy(&buf[32], &lease->parent_lease_key, 16);
82 SIVAL(buf, 48, lease->lease_epoch);
85 return true;