]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: vfs_fruit. Implement unlinkat().
authorJeremy Allison <jra@samba.org>
Thu, 12 Sep 2019 17:46:02 +0000 (10:46 -0700)
committerRalph Boehme <slow@samba.org>
Thu, 26 Sep 2019 17:20:45 +0000 (17:20 +0000)
Note this isn't identical to unlink() as
this must cope with (flags & AT_REMOVEDIR),
which is identical to rmdir(). It calls
either unlink or rmdir depending on the
flags parameter.

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

index 70344d41547b6b848e77d3521d0c592fd723e414..ea00bbbd1ccb406ffbdcad4c51c6d480a46461e0 100644 (file)
@@ -2165,6 +2165,22 @@ exit_rmdir:
        return SMB_VFS_NEXT_RMDIR(handle, smb_fname);
 }
 
+static int fruit_unlinkat(vfs_handle_struct *handle,
+                       struct files_struct *dirfsp,
+                       const struct smb_filename *smb_fname,
+                       int flags)
+{
+       int ret;
+
+       SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+       if (flags & AT_REMOVEDIR) {
+               ret = fruit_rmdir(handle, smb_fname);
+       } else {
+               ret = fruit_unlink(handle, smb_fname);
+       }
+       return ret;
+}
+
 static ssize_t fruit_pread_meta_stream(vfs_handle_struct *handle,
                                       files_struct *fsp, void *data,
                                       size_t n, off_t offset)
@@ -5078,6 +5094,7 @@ static struct vfs_fn_pointers vfs_fruit_fns = {
        .chmod_fn = fruit_chmod,
        .chown_fn = fruit_chown,
        .unlink_fn = fruit_unlink,
+       .unlinkat_fn = fruit_unlinkat,
        .renameat_fn = fruit_renameat,
        .rmdir_fn = fruit_rmdir,
        .open_fn = fruit_open,