summaryrefslogtreecommitdiff
path: root/source4/libcli/smb2/create.c
diff options
context:
space:
mode:
authorZach Loafman <zachary.loafman@isilon.com>2009-03-27 19:12:43 -0700
committerSteven Danneman <steven.danneman@isilon.com>2009-03-28 01:01:47 -0700
commit92f3686c962d67a5feab00b9e8abdb87ddb832a6 (patch)
tree2a5d7f2b2cc61195a6704157766d58fbc1164581 /source4/libcli/smb2/create.c
parent0b890ae19a6e9dad9bdff248ada3fdee9416ab96 (diff)
downloadsamba-92f3686c962d67a5feab00b9e8abdb87ddb832a6.tar.gz
samba-92f3686c962d67a5feab00b9e8abdb87ddb832a6.tar.bz2
samba-92f3686c962d67a5feab00b9e8abdb87ddb832a6.zip
s4:smb2: Add rudimentary SMB2.1 lease support to libcli
Add the structures, constants, and marshalling for SMB2.1 leases.
Diffstat (limited to 'source4/libcli/smb2/create.c')
-rw-r--r--source4/libcli/smb2/create.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/source4/libcli/smb2/create.c b/source4/libcli/smb2/create.c
index 8a40e56a00..344be60f6e 100644
--- a/source4/libcli/smb2/create.c
+++ b/source4/libcli/smb2/create.c
@@ -312,6 +312,23 @@ struct smb2_request *smb2_create_send(struct smb2_tree *tree, struct smb2_create
}
}
+ if (io->in.lease_request) {
+ uint8_t data[32];
+
+ memcpy(&data[0], io->in.lease_request->lease_key, 16);
+ SIVAL(data, 16, io->in.lease_request->lease_state);
+ SIVAL(data, 20, io->in.lease_request->lease_flags);
+ SBVAL(data, 24, io->in.lease_request->lease_duration);
+
+ status = smb2_create_blob_add(req, &blobs,
+ SMB2_CREATE_TAG_RQLS,
+ data_blob_const(data, 32));
+ if (!NT_STATUS_IS_OK(status)) {
+ talloc_free(req);
+ return NULL;
+ }
+ }
+
/* and any custom blobs */
for (i=0;i<io->in.blobs.num_blobs;i++) {
status = smb2_create_blob_add(req, &blobs,
@@ -402,6 +419,19 @@ NTSTATUS smb2_create_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, struct
}
memcpy(io->out.on_disk_id, io->out.blobs.blobs[i].data.data, 32);
}
+ if (strcmp(io->out.blobs.blobs[i].tag, SMB2_CREATE_TAG_RQLS) == 0) {
+ uint8_t *data;
+ if (io->out.blobs.blobs[i].data.length != 32) {
+ smb2_request_destroy(req);
+ return NT_STATUS_INVALID_NETWORK_RESPONSE;
+ }
+
+ data = io->out.blobs.blobs[i].data.data;
+ memcpy(io->out.lease_response.lease_key, data, 16);
+ io->out.lease_response.lease_state = IVAL(data, 16);
+ io->out.lease_response.lease_flags = IVAL(data, 20);
+ io->out.lease_response.lease_duration = BVAL(data, 24);
+ }
}
data_blob_free(&blob);