From: Jeremy Allison Date: Fri, 9 Aug 2019 22:13:24 +0000 (-0700) Subject: s3: VFS: vfs_shadow_copy2. Implement renameat(). X-Git-Tag: tdb-1.4.2~87 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a2d27f9113cef750a2e9fe2aac3c70dc7191dada;p=thirdparty%2Fsamba.git s3: VFS: vfs_shadow_copy2. Implement renameat(). Currently identical to rename(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index f84a76b5357..8ab4a6c743a 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -1178,6 +1178,56 @@ static int shadow_copy2_rename(vfs_handle_struct *handle, return SMB_VFS_NEXT_RENAME(handle, smb_fname_src, smb_fname_dst); } +static int shadow_copy2_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 = 0; + time_t timestamp_dst = 0; + char *snappath_src = NULL; + char *snappath_dst = NULL; + + if (!shadow_copy2_strip_snapshot_internal(talloc_tos(), handle, + smb_fname_src->base_name, + ×tamp_src, NULL, &snappath_src, + NULL)) { + return -1; + } + if (!shadow_copy2_strip_snapshot_internal(talloc_tos(), handle, + smb_fname_dst->base_name, + ×tamp_dst, NULL, &snappath_dst, + NULL)) { + return -1; + } + if (timestamp_src != 0) { + errno = EXDEV; + return -1; + } + if (timestamp_dst != 0) { + errno = EROFS; + return -1; + } + /* + * Don't allow rename on already converted paths. + */ + if (snappath_src != NULL) { + errno = EXDEV; + return -1; + } + if (snappath_dst != NULL) { + errno = EROFS; + return -1; + } + return SMB_VFS_NEXT_RENAMEAT(handle, + srcfsp, + smb_fname_src, + dstfsp, + smb_fname_dst); +} + + static int shadow_copy2_symlink(vfs_handle_struct *handle, const char *link_contents, const struct smb_filename *new_smb_fname) @@ -3123,6 +3173,7 @@ static struct vfs_fn_pointers vfs_shadow_copy2_fns = { .disk_free_fn = shadow_copy2_disk_free, .get_quota_fn = shadow_copy2_get_quota, .rename_fn = shadow_copy2_rename, + .renameat_fn = shadow_copy2_renameat, .link_fn = shadow_copy2_link, .symlink_fn = shadow_copy2_symlink, .stat_fn = shadow_copy2_stat,