From: Jeremy Allison Date: Fri, 30 Aug 2019 20:51:50 +0000 (-0700) Subject: s3: VFS: vfs_media_harmony. Implement symlinkat(). X-Git-Tag: tevent-0.10.1~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d50dfa52c8bac7f97eb95fef0a266e1fe9b1460;p=thirdparty%2Fsamba.git s3: VFS: vfs_media_harmony. Implement symlinkat(). Currently identical to symlink(). Signed-off-by: Jeremy Allison Reviewed-by: Ralph Böhme --- diff --git a/source3/modules/vfs_media_harmony.c b/source3/modules/vfs_media_harmony.c index 56e2e4d8380..8e64d80f43a 100644 --- a/source3/modules/vfs_media_harmony.c +++ b/source3/modules/vfs_media_harmony.c @@ -1750,6 +1750,52 @@ out: return status; } +/* + * Success: return 0 + * Failure: set errno, return -1 + */ + +static int mh_symlinkat(vfs_handle_struct *handle, + const char *link_contents, + struct files_struct *dirfsp, + const struct smb_filename *new_smb_fname) +{ + int status = -1; + char *client_link_contents = NULL; + struct smb_filename *newclientFname = NULL; + + DEBUG(MH_INFO_DEBUG, ("Entering mh_symlinkat\n")); + if (!is_in_media_files(link_contents) && + !is_in_media_files(new_smb_fname->base_name)) { + status = SMB_VFS_NEXT_SYMLINKAT(handle, + link_contents, + dirfsp, + new_smb_fname); + goto out; + } + + if ((status = alloc_get_client_path(handle, talloc_tos(), + link_contents, + &client_link_contents))) { + goto err; + } + if ((status = alloc_get_client_smb_fname(handle, talloc_tos(), + new_smb_fname, + &newclientFname))) { + goto err; + } + + status = SMB_VFS_NEXT_SYMLINKAT(handle, + client_link_contents, + dirfsp, + newclientFname); +err: + TALLOC_FREE(client_link_contents); + TALLOC_FREE(newclientFname); +out: + return status; +} + /* * Success: return byte count * Failure: set errno, return -1 @@ -2332,6 +2378,7 @@ static struct vfs_fn_pointers vfs_mh_fns = { .chdir_fn = mh_chdir, .ntimes_fn = mh_ntimes, .symlink_fn = mh_symlink, + .symlinkat_fn = mh_symlinkat, .readlinkat_fn = mh_readlinkat, .linkat_fn = mh_linkat, .mknodat_fn = mh_mknodat,