]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: vfs_media_harmony. Implement symlinkat().
authorJeremy Allison <jra@samba.org>
Fri, 30 Aug 2019 20:51:50 +0000 (13:51 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 3 Sep 2019 21:15:42 +0000 (21:15 +0000)
Currently identical to symlink().

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Böhme <slow@samba.org>
source3/modules/vfs_media_harmony.c

index 56e2e4d83809f11b62e9e87967a94e1d9cf19a28..8e64d80f43a465bffd026c9b79a581a178377f36 100644 (file)
@@ -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,