s3: VFS: vfs_ceph_snapshots. Implement symlinkat().
authorJeremy Allison <jra@samba.org>
Fri, 30 Aug 2019 20:16:01 +0000 (13:16 -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_ceph_snapshots.c

index 93cd66c6253598c8e45d68c42d3bcb9656372a0d..615bbe20be0397070a84730886dd40c75b0237b9 100644 (file)
@@ -826,6 +826,41 @@ static int ceph_snap_gmt_symlink(vfs_handle_struct *handle,
        return SMB_VFS_NEXT_SYMLINK(handle, link_contents, new_smb_fname);
 }
 
+static int ceph_snap_gmt_symlinkat(vfs_handle_struct *handle,
+                               const char *link_contents,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *new_smb_fname)
+{
+       int ret;
+       time_t timestamp_old = 0;
+       time_t timestamp_new = 0;
+
+       ret = ceph_snap_gmt_strip_snapshot(handle,
+                               link_contents,
+                               &timestamp_old,
+                               NULL, 0);
+       if (ret < 0) {
+               errno = -ret;
+               return -1;
+       }
+       ret = ceph_snap_gmt_strip_snapshot(handle,
+                               new_smb_fname->base_name,
+                               &timestamp_new,
+                               NULL, 0);
+       if (ret < 0) {
+               errno = -ret;
+               return -1;
+       }
+       if ((timestamp_old != 0) || (timestamp_new != 0)) {
+               errno = EROFS;
+               return -1;
+       }
+       return SMB_VFS_NEXT_SYMLINKAT(handle,
+                               link_contents,
+                               dirfsp,
+                               new_smb_fname);
+}
+
 static int ceph_snap_gmt_linkat(vfs_handle_struct *handle,
                                files_struct *srcfsp,
                                const struct smb_filename *old_smb_fname,
@@ -1625,6 +1660,7 @@ static struct vfs_fn_pointers ceph_snap_fns = {
        .renameat_fn = ceph_snap_gmt_renameat,
        .linkat_fn = ceph_snap_gmt_linkat,
        .symlink_fn = ceph_snap_gmt_symlink,
+       .symlinkat_fn = ceph_snap_gmt_symlinkat,
        .stat_fn = ceph_snap_gmt_stat,
        .lstat_fn = ceph_snap_gmt_lstat,
        .open_fn = ceph_snap_gmt_open,