From: Jeremy Allison Date: Fri, 9 Aug 2019 21:16:12 +0000 (-0700) Subject: s3: VFS: vfs_crossrename. Implement renameat(). X-Git-Tag: tdb-1.4.2~94 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c36ba3aff88bbb93ea5048906775bcedfaeac221;p=thirdparty%2Fsamba.git s3: VFS: vfs_crossrename. Implement renameat(). Currently identical to rename(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- 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;