summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2019-08-09 14:16:12 -0700
committerJeremy Allison <jra@samba.org>2019-08-16 19:52:32 +0000
commitc36ba3aff88bbb93ea5048906775bcedfaeac221 (patch)
treed607b2bd6cc5cbe743cd8f6cf66eb6123a4d333d
parent4a415f63e6383ef4a293240ab77ec4ba92f25b4e (diff)
downloadsamba-c36ba3aff88bbb93ea5048906775bcedfaeac221.tar.gz
s3: VFS: vfs_crossrename. Implement renameat().
Currently identical to rename(). Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
-rw-r--r--source3/modules/vfs_crossrename.c31
1 files changed, 30 insertions, 1 deletions
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;