From: Jeremy Allison Date: Thu, 22 Aug 2019 21:26:47 +0000 (-0700) Subject: s3: VFS: vfs_shadow_copy2. Implement readlinkat(). X-Git-Tag: tevent-0.10.1~177 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06609f3ada9a4c8fe830e8b01d4ada2dcc640523;p=thirdparty%2Fsamba.git s3: VFS: vfs_shadow_copy2. Implement readlinkat(). Currently identical to readlink(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Böhme --- diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index 2891a5c0959..7425628d70a 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -1710,6 +1710,57 @@ static int shadow_copy2_readlink(vfs_handle_struct *handle, return ret; } +static int shadow_copy2_readlinkat(vfs_handle_struct *handle, + files_struct *dirfsp, + const struct smb_filename *smb_fname, + char *buf, + size_t bufsiz) +{ + time_t timestamp = 0; + char *stripped = NULL; + int saved_errno = 0; + int ret; + struct smb_filename *conv = NULL; + + if (!shadow_copy2_strip_snapshot(talloc_tos(), handle, + smb_fname->base_name, + ×tamp, &stripped)) { + return -1; + } + if (timestamp == 0) { + return SMB_VFS_NEXT_READLINKAT(handle, + dirfsp, + smb_fname, + buf, + bufsiz); + } + conv = cp_smb_filename(talloc_tos(), smb_fname); + if (conv == NULL) { + TALLOC_FREE(stripped); + errno = ENOMEM; + return -1; + } + conv->base_name = shadow_copy2_convert( + conv, handle, stripped, timestamp); + TALLOC_FREE(stripped); + if (conv->base_name == NULL) { + return -1; + } + ret = SMB_VFS_NEXT_READLINKAT(handle, + dirfsp, + conv, + buf, + bufsiz); + if (ret == -1) { + saved_errno = errno; + } + TALLOC_FREE(conv); + if (saved_errno != 0) { + errno = saved_errno; + } + return ret; +} + static int shadow_copy2_mknodat(vfs_handle_struct *handle, files_struct *dirfsp, const struct smb_filename *smb_fname, @@ -3155,6 +3206,7 @@ static struct vfs_fn_pointers vfs_shadow_copy2_fns = { .chdir_fn = shadow_copy2_chdir, .ntimes_fn = shadow_copy2_ntimes, .readlink_fn = shadow_copy2_readlink, + .readlinkat_fn = shadow_copy2_readlinkat, .mknodat_fn = shadow_copy2_mknodat, .realpath_fn = shadow_copy2_realpath, .get_nt_acl_fn = shadow_copy2_get_nt_acl,