]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: vfs_snapper. Implement renameat().
authorJeremy Allison <jra@samba.org>
Fri, 9 Aug 2019 22:28:34 +0000 (15:28 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 16 Aug 2019 19:52:33 +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_snapper.c

index 03bcf658ec6c1cd0ec3a75c4455ae5cc45306a04..6222b2f19a88b93326802ea6558612a1509dad04 100644 (file)
@@ -2036,6 +2036,40 @@ static int snapper_gmt_rename(vfs_handle_struct *handle,
        return SMB_VFS_NEXT_RENAME(handle, smb_fname_src, smb_fname_dst);
 }
 
+static int snapper_gmt_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)
+{
+       time_t timestamp_src, timestamp_dst;
+
+       if (!snapper_gmt_strip_snapshot(talloc_tos(), handle,
+                                       smb_fname_src->base_name,
+                                       &timestamp_src, NULL)) {
+               return -1;
+       }
+       if (!snapper_gmt_strip_snapshot(talloc_tos(), handle,
+                                       smb_fname_dst->base_name,
+                                       &timestamp_dst, NULL)) {
+               return -1;
+       }
+       if (timestamp_src != 0) {
+               errno = EXDEV;
+               return -1;
+       }
+       if (timestamp_dst != 0) {
+               errno = EROFS;
+               return -1;
+       }
+       return SMB_VFS_NEXT_RENAMEAT(handle,
+                       srcfsp,
+                       smb_fname_src,
+                       dstfsp,
+                       smb_fname_dst);
+}
+
+
 static int snapper_gmt_symlink(vfs_handle_struct *handle,
                                const char *link_contents,
                                const struct smb_filename *new_smb_fname)
@@ -2855,6 +2889,7 @@ static struct vfs_fn_pointers snapper_fns = {
        .disk_free_fn = snapper_gmt_disk_free,
        .get_quota_fn = snapper_gmt_get_quota,
        .rename_fn = snapper_gmt_rename,
+       .renameat_fn = snapper_gmt_renameat,
        .link_fn = snapper_gmt_link,
        .symlink_fn = snapper_gmt_symlink,
        .stat_fn = snapper_gmt_stat,