]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: zfsacl. Add zfsacl_get_nt_acl_at().
authorJeremy Allison <jra@samba.org>
Mon, 13 Apr 2020 21:15:44 +0000 (14:15 -0700)
committerJeremy Allison <jra@samba.org>
Thu, 7 May 2020 19:27:36 +0000 (19:27 +0000)
Not yet used.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/modules/vfs_zfsacl.c

index 524881ab4af0d7d21ab74609ac90d4788050654d..07bed12b31efb9a1f9341bf0ad36f33af60ca911 100644 (file)
@@ -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,
 };