s3: VFS: vfs_crossrename. Implement renameat().
authorJeremy Allison <jra@samba.org>
Fri, 9 Aug 2019 21:16:12 +0000 (14:16 -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_crossrename.c

index f1cae9aee7deaaec4801208901a38ef290b4bbf7..95f41e00c9ace047bd818923eb00b398f93fa5f6 100644 (file)
@@ -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;