From: Jeremy Allison Date: Thu, 8 Aug 2019 23:13:20 +0000 (-0700) Subject: s3: VFS: vfs_cap. Implement renameat(). X-Git-Tag: tdb-1.4.2~98 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9859102b204b5ba9a348e4df30aff9d3afc6aae3;p=thirdparty%2Fsamba.git s3: VFS: vfs_cap. Implement renameat(). Currently identical to rename(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c index 56b7efe1b42..bc1f0b02f22 100644 --- a/source3/modules/vfs_cap.c +++ b/source3/modules/vfs_cap.c @@ -259,6 +259,55 @@ static int cap_rename(vfs_handle_struct *handle, return ret; } +static int cap_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) +{ + char *capold = NULL; + char *capnew = NULL; + struct smb_filename *smb_fname_src_tmp = NULL; + struct smb_filename *smb_fname_dst_tmp = NULL; + int ret = -1; + + capold = capencode(talloc_tos(), smb_fname_src->base_name); + capnew = capencode(talloc_tos(), smb_fname_dst->base_name); + if (!capold || !capnew) { + errno = ENOMEM; + goto out; + } + + /* Setup temporary smb_filename structs. */ + smb_fname_src_tmp = cp_smb_filename(talloc_tos(), smb_fname_src); + if (smb_fname_src_tmp == NULL) { + errno = ENOMEM; + goto out; + } + smb_fname_dst_tmp = cp_smb_filename(talloc_tos(), smb_fname_dst); + if (smb_fname_dst_tmp == NULL) { + errno = ENOMEM; + goto out; + } + + smb_fname_src_tmp->base_name = capold; + smb_fname_dst_tmp->base_name = capnew; + + ret = SMB_VFS_NEXT_RENAMEAT(handle, + srcfsp, + smb_fname_src_tmp, + dstfsp, + smb_fname_dst_tmp); + + out: + TALLOC_FREE(capold); + TALLOC_FREE(capnew); + TALLOC_FREE(smb_fname_src_tmp); + TALLOC_FREE(smb_fname_dst_tmp); + + return ret; +} + static int cap_stat(vfs_handle_struct *handle, struct smb_filename *smb_fname) { char *cappath; @@ -1010,6 +1059,7 @@ static struct vfs_fn_pointers vfs_cap_fns = { .rmdir_fn = cap_rmdir, .open_fn = cap_open, .rename_fn = cap_rename, + .renameat_fn = cap_renameat, .stat_fn = cap_stat, .lstat_fn = cap_lstat, .unlink_fn = cap_unlink,