]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: vfs_cap. Implement renameat().
authorJeremy Allison <jra@samba.org>
Thu, 8 Aug 2019 23:13:20 +0000 (16:13 -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_cap.c

index 56b7efe1b42ac9c0b71ee635f93c835b94c06fff..bc1f0b02f22c2c6d5637057ad605f4487bf2999f 100644 (file)
@@ -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,