s3: VFS: vfs_catia. Implement renameat().
authorJeremy Allison <jra@samba.org>
Thu, 8 Aug 2019 23:35:54 +0000 (16:35 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 16 Aug 2019 19:52:32 +0000 (19:52 +0000)
Currently identical to rename().

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

index 2c31c873fadcb933babf4f901c2f070c66c20b81..4abb037e851870bbe3e5e9bdbefe1c81806052b7 100644 (file)
@@ -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,