From c36ba3aff88bbb93ea5048906775bcedfaeac221 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 9 Aug 2019 14:16:12 -0700 Subject: [PATCH] s3: VFS: vfs_crossrename. Implement renameat(). Currently identical to rename(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- source3/modules/vfs_crossrename.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/source3/modules/vfs_crossrename.c b/source3/modules/vfs_crossrename.c index f1cae9aee7d..95f41e00c9a 100644 --- a/source3/modules/vfs_crossrename.c +++ b/source3/modules/vfs_crossrename.c @@ -193,9 +193,38 @@ static int crossrename_rename(vfs_handle_struct *handle, return result; } +static int crossrename_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) +{ + int result = -1; + + START_PROFILE(syscall_renameat); + + if (smb_fname_src->stream_name || smb_fname_dst->stream_name) { + errno = ENOENT; + goto out; + } + + result = rename(smb_fname_src->base_name, smb_fname_dst->base_name); + if ((result == -1) && (errno == EXDEV)) { + /* Rename across filesystems needed. */ + result = copy_reg(smb_fname_src->base_name, + smb_fname_dst->base_name); + } + + out: + END_PROFILE(syscall_renameat); + return result; +} + + static struct vfs_fn_pointers vfs_crossrename_fns = { .connect_fn = crossrename_connect, - .rename_fn = crossrename_rename + .rename_fn = crossrename_rename, + .renameat_fn = crossrename_renameat }; static_decl_vfs; -- 2.47.2