From: Jeremy Allison Date: Thu, 9 Jan 2020 18:13:14 +0000 (-0800) Subject: s3: VFS: Add SMB_VFS_CREATE_DFS_PATHAT(). X-Git-Tag: ldb-2.1.0~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0b9dd2f8693edc87840f04259e8f31fb55f601c;p=thirdparty%2Fsamba.git s3: VFS: Add SMB_VFS_CREATE_DFS_PATHAT(). Not yet used. Signed-off-by: Jeremy Allison Reviewed-by: Volker Lendecke --- diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index 4f0622bccc6..71c34de8013 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -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, diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index f7f7be98bb4..4b91f64f15e 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -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, diff --git a/source3/include/vfs.h b/source3/include/vfs.h index e4881d4940b..a836903a832 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -288,6 +288,7 @@ /* 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, diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index cec8f6f204d..d4ccb8f5c73 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -78,6 +78,19 @@ #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)) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 5bf76716164..f0c92f873e4 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -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, diff --git a/source3/modules/vfs_not_implemented.c b/source3/modules/vfs_not_implemented.c index dc4ac25b035..2bdab503d2c 100644 --- a/source3/modules/vfs_not_implemented.c +++ b/source3/modules/vfs_not_implemented.c @@ -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, diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index fdae4922fe8..e007a57fa01 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -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,