s3: VFS: vfs_snapper. Implement unlinkat().
authorJeremy Allison <jra@samba.org>
Thu, 12 Sep 2019 20:21:41 +0000 (13:21 -0700)
committerRalph Boehme <slow@samba.org>
Thu, 26 Sep 2019 17:20:46 +0000 (17:20 +0000)
This is identical to unlink(), as there
are no special cases needed for rmdir().

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/modules/vfs_snapper.c

index 2a4ebb48ec3a85515fb29e12eb88333e488be6df..9f3d876317df8f9a9da0816523a1d0db891b0476 100644 (file)
@@ -2236,6 +2236,28 @@ static int snapper_gmt_unlink(vfs_handle_struct *handle,
        return SMB_VFS_NEXT_UNLINK(handle, smb_fname);
 }
 
+static int snapper_gmt_unlinkat(vfs_handle_struct *handle,
+                       struct files_struct *dirfsp,
+                       const struct smb_filename *smb_fname,
+                       int flags)
+{
+       time_t timestamp = 0;
+
+       if (!snapper_gmt_strip_snapshot(talloc_tos(), handle,
+                                       smb_fname->base_name,
+                                       &timestamp, NULL)) {
+               return -1;
+       }
+       if (timestamp != 0) {
+               errno = EROFS;
+               return -1;
+       }
+       return SMB_VFS_NEXT_UNLINKAT(handle,
+                       dirfsp,
+                       smb_fname,
+                       flags);
+}
+
 static int snapper_gmt_chmod(vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        mode_t mode)
@@ -2897,6 +2919,7 @@ static struct vfs_fn_pointers snapper_fns = {
        .lstat_fn = snapper_gmt_lstat,
        .open_fn = snapper_gmt_open,
        .unlink_fn = snapper_gmt_unlink,
+       .unlinkat_fn = snapper_gmt_unlinkat,
        .chmod_fn = snapper_gmt_chmod,
        .chown_fn = snapper_gmt_chown,
        .chdir_fn = snapper_gmt_chdir,