]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: Add SMB_VFS_CREATE_DFS_PATHAT().
authorJeremy Allison <jra@samba.org>
Thu, 9 Jan 2020 18:13:14 +0000 (10:13 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 10 Jan 2020 19:38:42 +0000 (19:38 +0000)
Not yet used.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
examples/VFS/skel_opaque.c
examples/VFS/skel_transparent.c
source3/include/vfs.h
source3/include/vfs_macros.h
source3/modules/vfs_default.c
source3/modules/vfs_not_implemented.c
source3/smbd/vfs.c

index 4f0622bccc645f1509fcbc87659820b2aa9ce4d8..71c34de801387a04be17edec49b7ee44383ef0ee 100644 (file)
@@ -103,6 +103,15 @@ static NTSTATUS skel_get_dfs_referrals(struct vfs_handle_struct *handle,
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
+static NTSTATUS skel_create_dfs_pathat(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
+
 static DIR *skel_opendir(vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        const char *mask,
@@ -1032,6 +1041,7 @@ static struct vfs_fn_pointers skel_opaque_fns = {
        .statvfs_fn = skel_statvfs,
        .fs_capabilities_fn = skel_fs_capabilities,
        .get_dfs_referrals_fn = skel_get_dfs_referrals,
+       .create_dfs_pathat_fn = skel_create_dfs_pathat,
        .snap_check_path_fn = skel_snap_check_path,
        .snap_create_fn = skel_snap_create,
        .snap_delete_fn = skel_snap_delete,
index f7f7be98bb4ee14e14f48578a059cfb1c2dc9eaf..4b91f64f15ed92f61b637a6acb468e05fb8eca25 100644 (file)
@@ -100,6 +100,19 @@ static NTSTATUS skel_get_dfs_referrals(struct vfs_handle_struct *handle,
        return SMB_VFS_NEXT_GET_DFS_REFERRALS(handle, r);
 }
 
+static NTSTATUS skel_create_dfs_pathat(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count)
+{
+       return SMB_VFS_NEXT_CREATE_DFS_PATHAT(handle,
+                                       dirfsp,
+                                       smb_fname,
+                                       reflist,
+                                       referral_count);
+}
+
 static DIR *skel_opendir(vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        const char *mask,
@@ -1330,6 +1343,7 @@ static struct vfs_fn_pointers skel_transparent_fns = {
        .statvfs_fn = skel_statvfs,
        .fs_capabilities_fn = skel_fs_capabilities,
        .get_dfs_referrals_fn = skel_get_dfs_referrals,
+       .create_dfs_pathat_fn = skel_create_dfs_pathat,
        .snap_check_path_fn = skel_snap_check_path,
        .snap_create_fn = skel_snap_create,
        .snap_delete_fn = skel_snap_delete,
index e4881d4940b679da24bf6827f063e0739cec0852..a836903a832037cb1dfc4698e3efdb08c8596713 100644 (file)
 /* Version 42 - Remove SMB_VFS_CHOWN */
 /* Version 42 - Remove struct write_cache *wcp from files_struct */
 /* Version 42 - SMB_VFS_NTIMES() receives null times based on UTIMES_OMIT */
+/* Version 42 - Add SMB_VFS_CREATE_DFS_PATHAT() */
 
 #define SMB_VFS_INTERFACE_VERSION 42
 
@@ -547,6 +548,7 @@ typedef struct connection_struct {
 
 struct smbd_smb2_request;
 struct privilege_paths;
+struct referral;
 
 struct smb_request {
        uint8_t cmd;
@@ -702,6 +704,11 @@ struct vfs_fn_pointers {
         */
        NTSTATUS (*get_dfs_referrals_fn)(struct vfs_handle_struct *handle,
                                         struct dfs_GetDFSReferral *r);
+       NTSTATUS (*create_dfs_pathat_fn)(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count);
 
        /* Directory operations */
 
@@ -1205,6 +1212,11 @@ uint32_t smb_vfs_call_fs_capabilities(struct vfs_handle_struct *handle,
  */
 NTSTATUS smb_vfs_call_get_dfs_referrals(struct vfs_handle_struct *handle,
                                        struct dfs_GetDFSReferral *r);
+NTSTATUS smb_vfs_call_create_dfs_pathat(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count);
 DIR *smb_vfs_call_opendir(struct vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        const char *mask,
@@ -1642,6 +1654,11 @@ uint32_t vfs_not_implemented_fs_capabilities(struct vfs_handle_struct *handle,
                                enum timestamp_set_resolution *p_ts_res);
 NTSTATUS vfs_not_implemented_get_dfs_referrals(struct vfs_handle_struct *handle,
                                               struct dfs_GetDFSReferral *r);
+NTSTATUS vfs_not_implemented_create_dfs_pathat(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count);
 DIR *vfs_not_implemented_opendir(vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        const char *mask,
index cec8f6f204d47db6005fd847897257cb22e76c9c..d4ccb8f5c731af98711c3274364569219cd7ecc3 100644 (file)
 #define SMB_VFS_NEXT_GET_DFS_REFERRALS(handle, r) \
        smb_vfs_call_get_dfs_referrals((handle)->next, (r))
 
+#define SMB_VFS_CREATE_DFS_PATHAT(conn, dirfsp, smb_fname, reflist, count) \
+       smb_vfs_call_create_dfs_pathat((conn)->vfs_handles, \
+               (dirfsp), \
+               (smb_fname), \
+               (reflist), \
+               (count))
+#define SMB_VFS_NEXT_CREATE_DFS_PATHAT(handle, dirfsp, smb_fname, reflist, count) \
+       smb_vfs_call_create_dfs_pathat((handle)->next, \
+               (dirfsp), \
+               (smb_fname), \
+               (reflist), \
+               (count))
+
 /* Directory operations */
 #define SMB_VFS_OPENDIR(conn, smb_fname, mask, attr) \
        smb_vfs_call_opendir((conn)->vfs_handles, (smb_fname), (mask), (attr))
index 5bf76716164da234f53581b8763505b2813a5608..f0c92f873e4b2c2104ce0f5608156dc4ca810369 100644 (file)
@@ -368,6 +368,42 @@ static NTSTATUS vfswrap_get_dfs_referrals(struct vfs_handle_struct *handle,
        return NT_STATUS_OK;
 }
 
+static NTSTATUS vfswrap_create_dfs_pathat(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count)
+{
+       TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status = NT_STATUS_NO_MEMORY;
+       int ret;
+       char *msdfs_link = NULL;
+
+       SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+
+       /* Form the msdfs_link contents */
+       msdfs_link = msdfs_link_string(frame,
+                                       reflist,
+                                       referral_count);
+       if (msdfs_link == NULL) {
+               goto out;
+       }
+
+       ret = symlinkat(msdfs_link,
+                       dirfsp->fh->fd,
+                       smb_fname->base_name);
+       if (ret == 0) {
+               status = NT_STATUS_OK;
+       } else {
+               status = map_nt_error_from_unix(errno);
+       }
+
+  out:
+
+       TALLOC_FREE(frame);
+       return status;
+}
+
 static NTSTATUS vfswrap_snap_check_path(struct vfs_handle_struct *handle,
                                        TALLOC_CTX *mem_ctx,
                                        const char *service_path,
@@ -3480,6 +3516,7 @@ static struct vfs_fn_pointers vfs_default_fns = {
        .statvfs_fn = vfswrap_statvfs,
        .fs_capabilities_fn = vfswrap_fs_capabilities,
        .get_dfs_referrals_fn = vfswrap_get_dfs_referrals,
+       .create_dfs_pathat_fn = vfswrap_create_dfs_pathat,
        .snap_check_path_fn = vfswrap_snap_check_path,
        .snap_create_fn = vfswrap_snap_create,
        .snap_delete_fn = vfswrap_snap_delete,
index dc4ac25b03575eb960a8317238f864f8dc002c0a..2bdab503d2c0b01a0f7af87307622eb41db9c391 100644 (file)
@@ -97,6 +97,15 @@ NTSTATUS vfs_not_implemented_get_dfs_referrals(struct vfs_handle_struct *handle,
        return NT_STATUS_NOT_IMPLEMENTED;
 }
 
+NTSTATUS vfs_not_implemented_create_dfs_pathat(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
+
 DIR *vfs_not_implemented_opendir(vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname,
                        const char *mask,
@@ -1037,6 +1046,7 @@ static struct vfs_fn_pointers vfs_not_implemented_fns = {
        .statvfs_fn = vfs_not_implemented_statvfs,
        .fs_capabilities_fn = vfs_not_implemented_fs_capabilities,
        .get_dfs_referrals_fn = vfs_not_implemented_get_dfs_referrals,
+       .create_dfs_pathat_fn = vfs_not_implemented_create_dfs_pathat,
        .snap_check_path_fn = vfs_not_implemented_snap_check_path,
        .snap_create_fn = vfs_not_implemented_snap_create,
        .snap_delete_fn = vfs_not_implemented_snap_delete,
index fdae4922fe88eba635b326d587206a42f41fe8f0..e007a57fa011cf6a8441df0406f3d5f19f91f56e 100644 (file)
@@ -1563,6 +1563,20 @@ NTSTATUS smb_vfs_call_get_dfs_referrals(struct vfs_handle_struct *handle,
        return handle->fns->get_dfs_referrals_fn(handle, r);
 }
 
+NTSTATUS smb_vfs_call_create_dfs_pathat(struct vfs_handle_struct *handle,
+                               struct files_struct *dirfsp,
+                               const struct smb_filename *smb_fname,
+                               const struct referral *reflist,
+                               size_t referral_count)
+{
+       VFS_FIND(create_dfs_pathat);
+       return handle->fns->create_dfs_pathat_fn(handle,
+                                               dirfsp,
+                                               smb_fname,
+                                               reflist,
+                                               referral_count);
+}
+
 DIR *smb_vfs_call_opendir(struct vfs_handle_struct *handle,
                                        const struct smb_filename *smb_fname,
                                        const char *mask,