diff options
author | Jeremy Allison <jra@samba.org> | 2019-08-09 14:16:12 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2019-08-16 19:52:32 +0000 |
commit | c36ba3aff88bbb93ea5048906775bcedfaeac221 (patch) | |
tree | d607b2bd6cc5cbe743cd8f6cf66eb6123a4d333d | |
parent | 4a415f63e6383ef4a293240ab77ec4ba92f25b4e (diff) | |
download | samba-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.c | 31 |
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; |