return NT_STATUS_NOT_IMPLEMENTED;
}
+static NTSTATUS skel_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **pattr_data)
+{
+ return NT_STATUS_NOT_IMPLEMENTED;
+}
+
struct skel_get_dos_attributes_state {
struct vfs_aio_state aio_state;
uint32_t dosmode;
.translate_name_fn = skel_translate_name,
.fsctl_fn = skel_fsctl,
.readdir_attr_fn = skel_readdir_attr,
+ .freaddir_attr_fn = skel_freaddir_attr,
.audit_file_fn = skel_audit_file,
/* DOS attributes. */
return SMB_VFS_NEXT_READDIR_ATTR(handle, fname, mem_ctx, pattr_data);
}
+static NTSTATUS skel_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **pattr_data)
+{
+ return SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, pattr_data);
+}
+
struct skel_get_dos_attributes_state {
struct vfs_aio_state aio_state;
uint32_t dosmode;
.translate_name_fn = skel_translate_name,
.fsctl_fn = skel_fsctl,
.readdir_attr_fn = skel_readdir_attr,
+ .freaddir_attr_fn = skel_freaddir_attr,
.audit_file_fn = skel_audit_file,
/* DOS attributes. */
* Version 45 - Add SMB_VFS_FNTIMES
* Version 45 - Remove SMB_VFS_NTIMES
* Version 45 - ADD SMB_VFS_FSTREAMINFO
+ * Version 45 - Add SMB_VFS_FREADDIR_ATTR
*/
#define SMB_VFS_INTERFACE_VERSION 45
const struct smb_filename *fname,
TALLOC_CTX *mem_ctx,
struct readdir_attr_data **attr_data);
+ NTSTATUS (*freaddir_attr_fn)(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **attr_data);
};
/*
const struct smb_filename *fname,
TALLOC_CTX *mem_ctx,
struct readdir_attr_data **attr_data);
+NTSTATUS smb_vfs_call_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **attr_data);
NTSTATUS smb_register_vfs(int version, const char *name,
const struct vfs_fn_pointers *fns);
const struct smb_filename *fname,
TALLOC_CTX *mem_ctx,
struct readdir_attr_data **pattr_data);
+NTSTATUS vfs_not_implemented_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *dirfsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **pattr_data);
struct tevent_req *vfs_not_implemented_get_dos_attributes_send(
TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
#define SMB_VFS_NEXT_READDIR_ATTR(conn, fname, mem_ctx, attr_data) \
smb_vfs_call_readdir_attr((handle)->next, (fname), (mem_ctx), (attr_data))
+#define SMB_VFS_FREADDIR_ATTR(fsp, mem_ctx, attr_data) \
+ smb_vfs_call_freaddir_attr((fsp)->conn->vfs_handles, (fsp), (mem_ctx), (attr_data))
+#define SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, attr_data) \
+ smb_vfs_call_freaddir_attr((handle)->next, (fsp), (mem_ctx), (attr_data))
+
#endif /* _VFS_MACROS_H */
return NT_STATUS_NOT_SUPPORTED;
}
+static NTSTATUS vfswrap_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ 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);
.fdopendir_fn = vfswrap_fdopendir,
.readdir_fn = vfswrap_readdir,
.readdir_attr_fn = vfswrap_readdir_attr,
+ .freaddir_attr_fn = vfswrap_freaddir_attr,
.seekdir_fn = vfswrap_seekdir,
.telldir_fn = vfswrap_telldir,
.rewind_dir_fn = vfswrap_rewinddir,
SMB_VFS_OP_DURABLE_RECONNECT,
SMB_VFS_OP_READDIR_ATTR,
+ SMB_VFS_OP_FREADDIR_ATTR,
/* This should always be last enum value */
{ SMB_VFS_OP_DURABLE_DISCONNECT, "durable_disconnect" },
{ SMB_VFS_OP_DURABLE_RECONNECT, "durable_reconnect" },
{ SMB_VFS_OP_READDIR_ATTR, "readdir_attr" },
+ { SMB_VFS_OP_FREADDIR_ATTR, "freaddir_attr" },
{ SMB_VFS_OP_LAST, NULL }
};
return status;
}
+static NTSTATUS smb_full_audit_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **pattr_data)
+{
+ NTSTATUS status;
+
+ status = SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, pattr_data);
+
+ do_log(SMB_VFS_OP_FREADDIR_ATTR,
+ NT_STATUS_IS_OK(status),
+ handle,
+ "%s",
+ fsp_str_do_log(fsp));
+
+ return status;
+}
+
struct smb_full_audit_get_dos_attributes_state {
struct vfs_aio_state aio_state;
vfs_handle_struct *handle;
.durable_cookie_fn = smb_full_audit_durable_cookie,
.durable_disconnect_fn = smb_full_audit_durable_disconnect,
.durable_reconnect_fn = smb_full_audit_durable_reconnect,
- .readdir_attr_fn = smb_full_audit_readdir_attr
-
+ .readdir_attr_fn = smb_full_audit_readdir_attr,
+ .freaddir_attr_fn = smb_full_audit_freaddir_attr,
};
static_decl_vfs;
return NT_STATUS_NOT_IMPLEMENTED;
}
+NTSTATUS vfs_not_implemented_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **pattr_data)
+{
+ return NT_STATUS_NOT_IMPLEMENTED;
+}
+
struct vfs_not_implemented_get_dos_attributes_state {
struct vfs_aio_state aio_state;
uint32_t dosmode;
.translate_name_fn = vfs_not_implemented_translate_name,
.fsctl_fn = vfs_not_implemented_fsctl,
.readdir_attr_fn = vfs_not_implemented_readdir_attr,
+ .freaddir_attr_fn = vfs_not_implemented_freaddir_attr,
.audit_file_fn = vfs_not_implemented_audit_file,
/* DOS attributes. */
return status;
}
+static NTSTATUS smb_time_audit_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ 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_FREADDIR_ATTR(handle, fsp, 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_fsp("freaddir_attr", timediff, fsp);
+ }
+
+ return status;
+}
+
static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle,
files_struct *fsp,
uint32_t security_info,
.durable_disconnect_fn = smb_time_audit_durable_disconnect,
.durable_reconnect_fn = smb_time_audit_durable_reconnect,
.readdir_attr_fn = smb_time_audit_readdir_attr,
+ .freaddir_attr_fn = smb_time_audit_freaddir_attr,
};
VFS_FIND(readdir_attr);
return handle->fns->readdir_attr_fn(handle, fname, mem_ctx, attr_data);
}
+
+NTSTATUS smb_vfs_call_freaddir_attr(struct vfs_handle_struct *handle,
+ struct files_struct *fsp,
+ TALLOC_CTX *mem_ctx,
+ struct readdir_attr_data **attr_data)
+{
+ VFS_FIND(freaddir_attr);
+ return handle->fns->freaddir_attr_fn(handle,
+ fsp,
+ mem_ctx,
+ attr_data);
+}