return ret;
}
-static NTSTATUS shadow_copy2_get_nt_acl_at(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)
-{
- time_t timestamp = 0;
- char *stripped = NULL;
- NTSTATUS status;
- char *conv;
- struct smb_filename *conv_smb_fname = NULL;
-
- if (!shadow_copy2_strip_snapshot(talloc_tos(),
- handle,
- smb_fname,
- ×tamp,
- &stripped)) {
- return map_nt_error_from_unix(errno);
- }
- if (timestamp == 0) {
- return SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
- dirfsp,
- smb_fname,
- security_info,
- mem_ctx,
- ppdesc);
- }
- conv = shadow_copy2_convert(talloc_tos(), handle, stripped, timestamp);
- TALLOC_FREE(stripped);
- if (conv == NULL) {
- return map_nt_error_from_unix(errno);
- }
- conv_smb_fname = synthetic_smb_fname(talloc_tos(),
- conv,
- NULL,
- NULL,
- 0,
- smb_fname->flags);
- if (conv_smb_fname == NULL) {
- TALLOC_FREE(conv);
- return NT_STATUS_NO_MEMORY;
- }
- status = SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
- dirfsp,
- conv_smb_fname,
- security_info,
- mem_ctx,
- ppdesc);
- TALLOC_FREE(conv);
- TALLOC_FREE(conv_smb_fname);
- return status;
-}
-
static int shadow_copy2_mkdirat(vfs_handle_struct *handle,
struct files_struct *dirfsp,
const struct smb_filename *smb_fname,
.readlinkat_fn = shadow_copy2_readlinkat,
.mknodat_fn = shadow_copy2_mknodat,
.realpath_fn = shadow_copy2_realpath,
- .get_nt_acl_at_fn = shadow_copy2_get_nt_acl_at,
.get_shadow_copy_data_fn = shadow_copy2_get_shadow_copy_data,
.mkdirat_fn = shadow_copy2_mkdirat,
.getxattr_fn = shadow_copy2_getxattr,
return status;
}
-/*
- * Ignoring get_real_filename function because the default doesn't do
- * anything.
- */
-
-static NTSTATUS um_get_nt_acl_at(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)
-{
- NTSTATUS status;
- char *client_path = NULL;
- struct smb_filename *client_smb_fname = NULL;
- bool ok;
- int ret;
-
- DBG_DEBUG("Entering um_get_nt_acl_at\n");
-
- ok = is_in_media_files(smb_fname->base_name);
- if (!ok) {
- return SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
- dirfsp,
- smb_fname,
- security_info,
- mem_ctx,
- ppdesc);
- }
-
- ret = alloc_get_client_path(handle,
- talloc_tos(),
- smb_fname->base_name,
- &client_path);
- if (ret != 0) {
- status = map_nt_error_from_unix(errno);
- goto err;
- }
-
- client_smb_fname = synthetic_smb_fname(talloc_tos(),
- client_path,
- NULL,
- NULL,
- smb_fname->twrp,
- smb_fname->flags);
- if (client_smb_fname == NULL) {
- TALLOC_FREE(client_path);
- return NT_STATUS_NO_MEMORY;
- }
-
- status = SMB_VFS_NEXT_GET_NT_ACL_AT(handle,
- dirfsp,
- client_smb_fname,
- security_info,
- mem_ctx,
- ppdesc);
-err:
- TALLOC_FREE(client_smb_fname);
- TALLOC_FREE(client_path);
- return status;
-}
-
static SMB_ACL_T um_sys_acl_get_file(vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
SMB_ACL_TYPE_T type,
.realpath_fn = um_realpath,
.chflags_fn = um_chflags,
- /* NT ACL operations. */
-
- .get_nt_acl_at_fn = um_get_nt_acl_at,
-
/* POSIX ACL operations. */
.sys_acl_get_file_fn = um_sys_acl_get_file,