diff options
| author | Ralph Boehme <slow@samba.org> | 2014-11-26 14:30:37 +0100 |
|---|---|---|
| committer | Jeremy Allison <jra@samba.org> | 2014-12-04 22:11:07 +0100 |
| commit | b65e37dc01d7afa007768f7cadfcf3b7c1007664 (patch) | |
| tree | ec45710c1b260aedc21a4f5767f4465ab0817edd /source3/modules | |
| parent | 46431e390f8184c4207f48704e0a0bb5dcb38366 (diff) | |
| download | samba-b65e37dc01d7afa007768f7cadfcf3b7c1007664.tar.gz samba-b65e37dc01d7afa007768f7cadfcf3b7c1007664.tar.xz samba-b65e37dc01d7afa007768f7cadfcf3b7c1007664.zip | |
s3:vfs: add SMB_VFS_READDIR_ATTR()
SMB_VFS_READDIR_ATTR is a last minute hook to fetch additional metadata
for a directory entry when we're already marshalling the SMB reply
buffer.
This would be used, when there's a need to repurpose some fields in the
the reply, like it's done with Apple's SMB2 extension "AAPL".
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/modules')
| -rw-r--r-- | source3/modules/vfs_default.c | 9 | ||||
| -rw-r--r-- | source3/modules/vfs_full_audit.c | 18 | ||||
| -rw-r--r-- | source3/modules/vfs_time_audit.c | 22 |
3 files changed, 49 insertions, 0 deletions
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 2ac7100cd7..7610e65906 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -403,6 +403,14 @@ static struct dirent *vfswrap_readdir(vfs_handle_struct *handle, return result; } +static NTSTATUS vfswrap_readdir_attr(struct vfs_handle_struct *handle, + const struct smb_filename *fname, + TALLOC_CTX *mem_ctx, + struct readdir_attr_data **attr_data) +{ + return NT_STATUS_NOT_SUPPORTED; +} + static void vfswrap_seekdir(vfs_handle_struct *handle, DIR *dirp, long offset) { START_PROFILE(syscall_seekdir); @@ -2521,6 +2529,7 @@ static struct vfs_fn_pointers vfs_default_fns = { .opendir_fn = vfswrap_opendir, .fdopendir_fn = vfswrap_fdopendir, .readdir_fn = vfswrap_readdir, + .readdir_attr_fn = vfswrap_readdir_attr, .seekdir_fn = vfswrap_seekdir, .telldir_fn = vfswrap_telldir, .rewind_dir_fn = vfswrap_rewinddir, diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index a51ab75815..489a28c58b 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -171,6 +171,7 @@ typedef enum _vfs_op_type { SMB_VFS_OP_COPY_CHUNK_RECV, SMB_VFS_OP_GET_COMPRESSION, SMB_VFS_OP_SET_COMPRESSION, + SMB_VFS_OP_READDIR_ATTR, /* NT ACL operations. */ @@ -295,6 +296,7 @@ static struct { { SMB_VFS_OP_COPY_CHUNK_RECV, "copy_chunk_recv" }, { SMB_VFS_OP_GET_COMPRESSION, "get_compression" }, { SMB_VFS_OP_SET_COMPRESSION, "set_compression" }, + { SMB_VFS_OP_READDIR_ATTR, "readdir_attr" }, { SMB_VFS_OP_FGET_NT_ACL, "fget_nt_acl" }, { SMB_VFS_OP_GET_NT_ACL, "get_nt_acl" }, { SMB_VFS_OP_FSET_NT_ACL, "fset_nt_acl" }, @@ -1834,6 +1836,21 @@ static NTSTATUS smb_full_audit_set_compression(vfs_handle_struct *handle, return result; } +static NTSTATUS smb_full_audit_readdir_attr(struct vfs_handle_struct *handle, + const struct smb_filename *fname, + TALLOC_CTX *mem_ctx, + struct readdir_attr_data **pattr_data) +{ + NTSTATUS status; + + status = SMB_VFS_NEXT_READDIR_ATTR(handle, fname, mem_ctx, pattr_data); + + do_log(SMB_VFS_OP_READDIR_ATTR, NT_STATUS_IS_OK(status), handle, "%s", + smb_fname_str_do_log(fname)); + + return status; +} + static NTSTATUS smb_full_audit_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint32 security_info, TALLOC_CTX *mem_ctx, @@ -2249,6 +2266,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = { .copy_chunk_recv_fn = smb_full_audit_copy_chunk_recv, .get_compression_fn = smb_full_audit_get_compression, .set_compression_fn = smb_full_audit_set_compression, + .readdir_attr_fn = smb_full_audit_readdir_attr, .fget_nt_acl_fn = smb_full_audit_fget_nt_acl, .get_nt_acl_fn = smb_full_audit_get_nt_acl, .fset_nt_acl_fn = smb_full_audit_fset_nt_acl, diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c index 9dbbf8bdea..243238a99e 100644 --- a/source3/modules/vfs_time_audit.c +++ b/source3/modules/vfs_time_audit.c @@ -1802,6 +1802,27 @@ static NTSTATUS smb_time_audit_set_compression(vfs_handle_struct *handle, return result; } +static NTSTATUS smb_time_audit_readdir_attr(struct vfs_handle_struct *handle, + const struct smb_filename *fname, + TALLOC_CTX *mem_ctx, + struct readdir_attr_data **pattr_data) +{ + NTSTATUS status; + struct timespec ts1,ts2; + double timediff; + + clock_gettime_mono(&ts1); + status = SMB_VFS_NEXT_READDIR_ATTR(handle, fname, mem_ctx, pattr_data); + clock_gettime_mono(&ts2); + timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9; + + if (timediff > audit_timeout) { + smb_time_audit_log_smb_fname("readdir_attr", timediff, fname); + } + + return status; +} + static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, uint32 security_info, @@ -2423,6 +2444,7 @@ static struct vfs_fn_pointers vfs_time_audit_fns = { .copy_chunk_recv_fn = smb_time_audit_copy_chunk_recv, .get_compression_fn = smb_time_audit_get_compression, .set_compression_fn = smb_time_audit_set_compression, + .readdir_attr_fn = smb_time_audit_readdir_attr, .fget_nt_acl_fn = smb_time_audit_fget_nt_acl, .get_nt_acl_fn = smb_time_audit_get_nt_acl, .fset_nt_acl_fn = smb_time_audit_fset_nt_acl, |
