From: Jeremy Allison Date: Mon, 13 Apr 2020 21:15:44 +0000 (-0700) Subject: s3: VFS: zfsacl. Add zfsacl_get_nt_acl_at(). X-Git-Tag: ldb-2.2.0~600 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5bdd4d4f755401399deeb6153409688fe281dbbf;p=thirdparty%2Fsamba.git s3: VFS: zfsacl. Add zfsacl_get_nt_acl_at(). Not yet used. Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/source3/modules/vfs_zfsacl.c b/source3/modules/vfs_zfsacl.c index 524881ab4af..07bed12b31e 100644 --- a/source3/modules/vfs_zfsacl.c +++ b/source3/modules/vfs_zfsacl.c @@ -352,6 +352,67 @@ static NTSTATUS zfsacl_get_nt_acl(struct vfs_handle_struct *handle, return status; } +static NTSTATUS zfsacl_get_nt_acl_at(struct vfs_handle_struct *handle, + struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + uint32_t security_info, + TALLOC_CTX *mem_ctx, + struct security_descriptor **ppdesc) +{ + struct SMB4ACL_T *pacl = NULL; + NTSTATUS status; + struct zfsacl_config_data *config = NULL; + TALLOC_CTX *frame = NULL; + + SMB_ASSERT(dirfsp == handle->conn->cwd_fsp); + + SMB_VFS_HANDLE_GET_DATA(handle, + config, + struct zfsacl_config_data, + return NT_STATUS_INTERNAL_ERROR); + + frame = talloc_stackframe(); + + status = zfs_get_nt_acl_common(handle->conn, + frame, + smb_fname, + &pacl, + config); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(frame); + if (!NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) { + return status; + } + + if (!VALID_STAT(smb_fname->st)) { + DBG_ERR("No stat info for [%s]\n", + smb_fname_str_dbg(smb_fname)); + return NT_STATUS_INTERNAL_ERROR; + } + + status = make_default_filesystem_acl(mem_ctx, + DEFAULT_ACL_POSIX, + smb_fname->base_name, + &smb_fname->st, + ppdesc); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + (*ppdesc)->type |= SEC_DESC_DACL_PROTECTED; + return NT_STATUS_OK; + } + + status = smb_get_nt_acl_nfs4(handle->conn, + smb_fname, + NULL, + security_info, + mem_ctx, + ppdesc, + pacl); + TALLOC_FREE(frame); + return status; +} + static NTSTATUS zfsacl_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint32_t security_info_sent, @@ -491,6 +552,7 @@ static struct vfs_fn_pointers zfsacl_fns = { .sys_acl_delete_def_file_fn = zfsacl_fail__sys_acl_delete_def_file, .fget_nt_acl_fn = zfsacl_fget_nt_acl, .get_nt_acl_fn = zfsacl_get_nt_acl, + .get_nt_acl_at_fn = zfsacl_get_nt_acl_at, .fset_nt_acl_fn = zfsacl_fset_nt_acl, };