From: Ralph Boehme Date: Wed, 20 May 2020 20:58:56 +0000 (+0200) Subject: vfs_cap: implement SMB_VFS_OPENAT() X-Git-Tag: samba-4.13.0rc1~492 X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=01d949bc95fcb5d89d2318adf0d0d05b9d0ede9c;p=samba.git vfs_cap: implement SMB_VFS_OPENAT() Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison --- diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c index ab84c3143cc..7bf11a7bb9d 100644 --- a/source3/modules/vfs_cap.c +++ b/source3/modules/vfs_cap.c @@ -173,6 +173,51 @@ static int cap_open(vfs_handle_struct *handle, struct smb_filename *smb_fname, return ret; } +static int cap_openat(vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname_in, + files_struct *fsp, + int flags, + mode_t mode) +{ + char *cappath = NULL; + struct smb_filename *smb_fname = NULL; + int ret; + int saved_errno = 0; + + cappath = capencode(talloc_tos(), smb_fname->base_name); + if (cappath == NULL) { + errno = ENOMEM; + return -1; + } + + smb_fname = cp_smb_filename(talloc_tos(), smb_fname_in); + if (smb_fname == NULL) { + TALLOC_FREE(cappath); + errno = ENOMEM; + return -1; + } + smb_fname->base_name = cappath; + + DBG_DEBUG("cap_open for %s\n", smb_fname_str_dbg(smb_fname)); + ret = SMB_VFS_NEXT_OPENAT(handle, + dirfsp, + smb_fname, + fsp, + flags, + mode); + + if (ret == -1) { + saved_errno = errno; + } + TALLOC_FREE(cappath); + TALLOC_FREE(smb_fname); + if (saved_errno != 0) { + errno = saved_errno; + } + return ret; +} + static int cap_renameat(vfs_handle_struct *handle, files_struct *srcfsp, const struct smb_filename *smb_fname_src, @@ -1062,6 +1107,7 @@ static struct vfs_fn_pointers vfs_cap_fns = { .readdir_fn = cap_readdir, .mkdirat_fn = cap_mkdirat, .open_fn = cap_open, + .openat_fn = cap_openat, .renameat_fn = cap_renameat, .stat_fn = cap_stat, .lstat_fn = cap_lstat,