From: Jeremy Allison Date: Thu, 8 Aug 2019 23:35:54 +0000 (-0700) Subject: s3: VFS: vfs_catia. Implement renameat(). X-Git-Tag: tdb-1.4.2~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5528bcd44750cd989e051f6db6908e061e714f91;p=thirdparty%2Fsamba.git s3: VFS: vfs_catia. Implement renameat(). Currently identical to rename(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c index 2c31c873fad..4abb037e851 100644 --- a/source3/modules/vfs_catia.c +++ b/source3/modules/vfs_catia.c @@ -617,6 +617,71 @@ out: return ret; } +static int catia_renameat(vfs_handle_struct *handle, + files_struct *srcfsp, + const struct smb_filename *smb_fname_src, + files_struct *dstfsp, + const struct smb_filename *smb_fname_dst) +{ + TALLOC_CTX *ctx = talloc_tos(); + struct smb_filename *smb_fname_src_tmp = NULL; + struct smb_filename *smb_fname_dst_tmp = NULL; + char *src_name_mapped = NULL; + char *dst_name_mapped = NULL; + NTSTATUS status; + int ret = -1; + + status = catia_string_replace_allocate(handle->conn, + smb_fname_src->base_name, + &src_name_mapped, vfs_translate_to_unix); + if (!NT_STATUS_IS_OK(status)) { + errno = map_errno_from_nt_status(status); + return -1; + } + + status = catia_string_replace_allocate(handle->conn, + smb_fname_dst->base_name, + &dst_name_mapped, vfs_translate_to_unix); + if (!NT_STATUS_IS_OK(status)) { + errno = map_errno_from_nt_status(status); + return -1; + } + + /* Setup temporary smb_filename structs. */ + smb_fname_src_tmp = cp_smb_filename(ctx, smb_fname_src); + if (smb_fname_src_tmp == NULL) { + errno = ENOMEM; + goto out; + } + + smb_fname_dst_tmp = cp_smb_filename(ctx, smb_fname_dst); + if (smb_fname_dst_tmp == NULL) { + errno = ENOMEM; + goto out; + } + + smb_fname_src_tmp->base_name = src_name_mapped; + smb_fname_dst_tmp->base_name = dst_name_mapped; + DEBUG(10, ("converted old name: %s\n", + smb_fname_str_dbg(smb_fname_src_tmp))); + DEBUG(10, ("converted new name: %s\n", + smb_fname_str_dbg(smb_fname_dst_tmp))); + + ret = SMB_VFS_NEXT_RENAMEAT(handle, + srcfsp, + smb_fname_src_tmp, + dstfsp, + smb_fname_dst_tmp); + +out: + TALLOC_FREE(src_name_mapped); + TALLOC_FREE(dst_name_mapped); + TALLOC_FREE(smb_fname_src_tmp); + TALLOC_FREE(smb_fname_dst_tmp); + return ret; +} + + static int catia_stat(vfs_handle_struct *handle, struct smb_filename *smb_fname) { @@ -2436,6 +2501,7 @@ static struct vfs_fn_pointers vfs_catia_fns = { .pwrite_recv_fn = catia_pwrite_recv, .lseek_fn = catia_lseek, .rename_fn = catia_rename, + .renameat_fn = catia_renameat, .fsync_send_fn = catia_fsync_send, .fsync_recv_fn = catia_fsync_recv, .stat_fn = catia_stat,