]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: vfs_shadow_copy2. Implement linkat().
authorJeremy Allison <jra@samba.org>
Fri, 16 Aug 2019 22:59:27 +0000 (15:59 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 20 Aug 2019 21:09:28 +0000 (21:09 +0000)
Currently identical to link().

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

index 5d57b9c0229d485d59f6a968095fdc7999017a58..84fe49bdcb990a4f9f5228169cd137fbb375408c 100644 (file)
@@ -1267,6 +1267,55 @@ static int shadow_copy2_link(vfs_handle_struct *handle,
        return SMB_VFS_NEXT_LINK(handle, old_smb_fname, new_smb_fname);
 }
 
+static int shadow_copy2_linkat(vfs_handle_struct *handle,
+                       files_struct *srcfsp,
+                       const struct smb_filename *old_smb_fname,
+                       files_struct *dstfsp,
+                       const struct smb_filename *new_smb_fname,
+                       int flags)
+{
+       time_t timestamp_old = 0;
+       time_t timestamp_new = 0;
+       char *snappath_old = NULL;
+       char *snappath_new = NULL;
+
+       if (!shadow_copy2_strip_snapshot_internal(talloc_tos(),
+                               handle,
+                               old_smb_fname->base_name,
+                               &timestamp_old,
+                               NULL,
+                               &snappath_old,
+                               NULL)) {
+               return -1;
+       }
+       if (!shadow_copy2_strip_snapshot_internal(talloc_tos(),
+                               handle,
+                               new_smb_fname->base_name,
+                               &timestamp_new,
+                               NULL,
+                               &snappath_new,
+                               NULL)) {
+               return -1;
+       }
+       if ((timestamp_old != 0) || (timestamp_new != 0)) {
+               errno = EROFS;
+               return -1;
+       }
+       /*
+        * Don't allow links on already converted paths.
+        */
+       if ((snappath_old != NULL) || (snappath_new != NULL)) {
+               errno = EROFS;
+               return -1;
+       }
+       return SMB_VFS_NEXT_LINKAT(handle,
+                       srcfsp,
+                       old_smb_fname,
+                       dstfsp,
+                       new_smb_fname,
+                       flags);
+}
+
 static int shadow_copy2_stat(vfs_handle_struct *handle,
                             struct smb_filename *smb_fname)
 {
@@ -3131,6 +3180,7 @@ static struct vfs_fn_pointers vfs_shadow_copy2_fns = {
        .get_quota_fn = shadow_copy2_get_quota,
        .renameat_fn = shadow_copy2_renameat,
        .link_fn = shadow_copy2_link,
+       .linkat_fn = shadow_copy2_linkat,
        .symlink_fn = shadow_copy2_symlink,
        .stat_fn = shadow_copy2_stat,
        .lstat_fn = shadow_copy2_lstat,