[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Fri Jan 10 21:06:04 UTC 2020
The branch, master has been updated
via 748379c66bc s3: smbd: msdfs: Change create_msdfs_link() to call SMB_VFS_CREATE_DFS_PATHAT().
via 54f9da44356 s3: VFS: Implement create_dfs_pathat() in time_audit.
via 23df92810b3 s3: VFS: Implement create_dfs_pathat() in full_audit.
via 51fd8756616 s3: VFS: Implement create_dfs_pathat() in snapper.
via 6a46c5f207d s3: VFS: Implement create_dfs_pathat() in shadow_copy2.
via 235e59481d9 s3: VFS: Implement create_dfs_pathat() in gluster.
via 421d26a890f s3: VFS: Implement create_dfs_pathat() in ceph.
via b0b9dd2f869 s3: VFS: Add SMB_VFS_CREATE_DFS_PATHAT().
from 86a31defbf2 ndr basic: Check ndr_token_store return code
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 748379c66bc3d5131a9346c4c7a973d514b35563
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 14:21:46 2020 -0800
s3: smbd: msdfs: Change create_msdfs_link() to call SMB_VFS_CREATE_DFS_PATHAT().
No change in the (rather strange) logic.
First step in abstracting MSDFS storage from direct symlink calls.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Fri Jan 10 21:05:25 UTC 2020 on sn-devel-184
commit 54f9da44356b16efca56cc85f2552624bbe81876
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 13:36:08 2020 -0800
s3: VFS: Implement create_dfs_pathat() in time_audit.
Not yet used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 23df92810b3367b58e8a629d7ee42cf7d167373d
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 13:33:23 2020 -0800
s3: VFS: Implement create_dfs_pathat() in full_audit.
Not yet used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 51fd875661640a7d305b87961b3a0201be350414
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 13:13:29 2020 -0800
s3: VFS: Implement create_dfs_pathat() in snapper.
Not yet used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 6a46c5f207d1792be048e0233f173286cde0560e
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 13:06:36 2020 -0800
s3: VFS: Implement create_dfs_pathat() in shadow_copy2.
Not yet used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 235e59481d9ca8e1a522e966399266fde1feb708
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 14:48:33 2020 -0800
s3: VFS: Implement create_dfs_pathat() in gluster.
Not yet used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit 421d26a890f0e09feb94d9b445a51fc14ca24615
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 14:39:43 2020 -0800
s3: VFS: Implement create_dfs_pathat() in ceph.
Not yet used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
commit b0b9dd2f8693edc87840f04259e8f31fb55f601c
Author: Jeremy Allison <jra at samba.org>
Date: Thu Jan 9 10:13:14 2020 -0800
s3: VFS: Add SMB_VFS_CREATE_DFS_PATHAT().
Not yet used.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Volker Lendecke <vl at samba.org>
-----------------------------------------------------------------------
Summary of changes:
examples/VFS/skel_opaque.c | 10 +++++++
examples/VFS/skel_transparent.c | 14 ++++++++++
source3/include/vfs.h | 17 ++++++++++++
source3/include/vfs_macros.h | 13 +++++++++
source3/modules/vfs_ceph.c | 41 +++++++++++++++++++++++++++
source3/modules/vfs_default.c | 37 +++++++++++++++++++++++++
source3/modules/vfs_full_audit.c | 26 ++++++++++++++++++
source3/modules/vfs_glusterfs.c | 37 +++++++++++++++++++++++++
source3/modules/vfs_not_implemented.c | 10 +++++++
source3/modules/vfs_shadow_copy2.c | 26 ++++++++++++++++++
source3/modules/vfs_snapper.c | 25 +++++++++++++++++
source3/modules/vfs_time_audit.c | 27 ++++++++++++++++++
source3/smbd/msdfs.c | 52 ++++++++++++++---------------------
source3/smbd/vfs.c | 14 ++++++++++
14 files changed, 317 insertions(+), 32 deletions(-)
Changeset truncated at 500 lines:
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_ceph.c b/source3/modules/vfs_ceph.c
index 2c72b6aee23..848e369e5c2 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -1404,6 +1404,46 @@ static bool cephwrap_aio_force(struct vfs_handle_struct *handle, struct files_st
return false;
}
+static NTSTATUS cephwrap_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 = ceph_symlink(handle->data,
+ msdfs_link,
+ smb_fname->base_name);
+ if (ret == 0) {
+ status = NT_STATUS_OK;
+ } else {
+ status = map_nt_error_from_unix(-ret);
+ }
+
+ out:
+
+ DBG_DEBUG("[CEPH] create_dfs_pathat(%s) = %s\n",
+ smb_fname->base_name,
+ nt_errstr(status));
+
+ TALLOC_FREE(frame);
+ return status;
+}
+
static struct vfs_fn_pointers ceph_fns = {
/* Disk operations */
@@ -1428,6 +1468,7 @@ static struct vfs_fn_pointers ceph_fns = {
/* File operations */
+ .create_dfs_pathat_fn = cephwrap_create_dfs_pathat,
.open_fn = cephwrap_open,
.close_fn = cephwrap_close,
.pread_fn = cephwrap_pread,
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_full_audit.c b/source3/modules/vfs_full_audit.c
index 415be388fca..1e4a641d0a4 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -101,6 +101,7 @@ typedef enum _vfs_op_type {
SMB_VFS_OP_STATVFS,
SMB_VFS_OP_FS_CAPABILITIES,
SMB_VFS_OP_GET_DFS_REFERRALS,
+ SMB_VFS_OP_CREATE_DFS_PATHAT,
/* Directory operations */
@@ -249,6 +250,7 @@ static struct {
{ SMB_VFS_OP_STATVFS, "statvfs" },
{ SMB_VFS_OP_FS_CAPABILITIES, "fs_capabilities" },
{ SMB_VFS_OP_GET_DFS_REFERRALS, "get_dfs_referrals" },
+ { SMB_VFS_OP_CREATE_DFS_PATHAT, "create_dfs_pathat" },
{ SMB_VFS_OP_OPENDIR, "opendir" },
{ SMB_VFS_OP_FDOPENDIR, "fdopendir" },
{ SMB_VFS_OP_READDIR, "readdir" },
@@ -890,6 +892,29 @@ static NTSTATUS smb_full_audit_get_dfs_referrals(
return status;
}
+static NTSTATUS smb_full_audit_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)
+{
+ NTSTATUS status;
+
+ status = SMB_VFS_NEXT_CREATE_DFS_PATHAT(handle,
+ dirfsp,
+ smb_fname,
+ reflist,
+ referral_count);
+
+ do_log(SMB_VFS_OP_CREATE_DFS_PATHAT,
+ NT_STATUS_IS_OK(status),
+ handle,
+ "%s",
+ smb_fname_str_do_log(handle->conn, smb_fname));
+
+ return status;
+}
+
static NTSTATUS smb_full_audit_snap_check_path(struct vfs_handle_struct *handle,
TALLOC_CTX *mem_ctx,
const char *service_path,
@@ -2935,6 +2960,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
.statvfs_fn = smb_full_audit_statvfs,
.fs_capabilities_fn = smb_full_audit_fs_capabilities,
.get_dfs_referrals_fn = smb_full_audit_get_dfs_referrals,
+ .create_dfs_pathat_fn = smb_full_audit_create_dfs_pathat,
.opendir_fn = smb_full_audit_opendir,
.fdopendir_fn = smb_full_audit_fdopendir,
.readdir_fn = smb_full_audit_readdir,
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index e8bd64be9e6..bce7ae5e84a 100644
--- a/source3/modules/vfs_glusterfs.c
+++ b/source3/modules/vfs_glusterfs.c
@@ -1869,6 +1869,42 @@ static bool vfs_gluster_aio_force(struct vfs_handle_struct *handle,
return false;
}
+static NTSTATUS vfs_gluster_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 = glfs_symlink(handle->data,
+ msdfs_link,
+ 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 struct vfs_fn_pointers glusterfs_fns = {
/* Disk Operations */
@@ -1941,6 +1977,7 @@ static struct vfs_fn_pointers glusterfs_fns = {
.streaminfo_fn = NULL,
.get_real_filename_fn = vfs_gluster_get_real_filename,
.connectpath_fn = vfs_gluster_connectpath,
+ .create_dfs_pathat_fn = vfs_gluster_create_dfs_pathat,
.brl_lock_windows_fn = NULL,
.brl_unlock_windows_fn = NULL,
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/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c
index 94aba328835..143f92959ff 100644
--- a/source3/modules/vfs_shadow_copy2.c
+++ b/source3/modules/vfs_shadow_copy2.c
@@ -2442,6 +2442,31 @@ static int shadow_copy2_setxattr(struct vfs_handle_struct *handle,
aname, value, size, flags);
}
+static NTSTATUS shadow_copy2_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)
+{
+ time_t timestamp = 0;
+
+ if (!shadow_copy2_strip_snapshot(talloc_tos(),
+ handle,
+ smb_fname->base_name,
+ ×tamp,
+ NULL)) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ if (timestamp != 0) {
+ return NT_STATUS_MEDIA_WRITE_PROTECTED;
+ }
+ return SMB_VFS_NEXT_CREATE_DFS_PATHAT(handle,
+ dirfsp,
+ smb_fname,
+ reflist,
+ referral_count);
+}
+
static int shadow_copy2_get_real_filename(struct vfs_handle_struct *handle,
const char *path,
const char *name,
@@ -3123,6 +3148,7 @@ static struct vfs_fn_pointers vfs_shadow_copy2_fns = {
.opendir_fn = shadow_copy2_opendir,
.disk_free_fn = shadow_copy2_disk_free,
.get_quota_fn = shadow_copy2_get_quota,
+ .create_dfs_pathat_fn = shadow_copy2_create_dfs_pathat,
.renameat_fn = shadow_copy2_renameat,
.linkat_fn = shadow_copy2_linkat,
.symlinkat_fn = shadow_copy2_symlinkat,
diff --git a/source3/modules/vfs_snapper.c b/source3/modules/vfs_snapper.c
index 9ef04d91e76..91729f2abd6 100644
--- a/source3/modules/vfs_snapper.c
+++ b/source3/modules/vfs_snapper.c
@@ -2849,12 +2849,37 @@ static int snapper_gmt_get_quota(vfs_handle_struct *handle,
return ret;
}
+static NTSTATUS snapper_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)
+{
+ time_t timestamp = 0;
+
+ if (!snapper_gmt_strip_snapshot(talloc_tos(),
+ handle,
+ smb_fname->base_name,
+ ×tamp,
+ NULL)) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ if (timestamp != 0) {
+ return NT_STATUS_MEDIA_WRITE_PROTECTED;
+ }
+ return SMB_VFS_NEXT_CREATE_DFS_PATHAT(handle,
+ dirfsp,
+ smb_fname,
+ reflist,
+ referral_count);
+}
static struct vfs_fn_pointers snapper_fns = {
.snap_check_path_fn = snapper_snap_check_path,
.snap_create_fn = snapper_snap_create,
.snap_delete_fn = snapper_snap_delete,
.get_shadow_copy_data_fn = snapper_get_shadow_copy_data,
+ .create_dfs_pathat_fn = snapper_create_dfs_pathat,
.opendir_fn = snapper_gmt_opendir,
.disk_free_fn = snapper_gmt_disk_free,
.get_quota_fn = snapper_gmt_get_quota,
diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c
index da99a06ce3a..9f20fc5234a 100644
--- a/source3/modules/vfs_time_audit.c
+++ b/source3/modules/vfs_time_audit.c
@@ -323,6 +323,32 @@ static NTSTATUS smb_time_audit_get_dfs_referrals(
return result;
}
+static NTSTATUS smb_time_audit_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)
+{
+ NTSTATUS result;
+ struct timespec ts1,ts2;
+ double timediff;
+
+ clock_gettime_mono(&ts1);
--
Samba Shared Repository
More information about the samba-cvs
mailing list