#include "includes.h"
#include "smbd/smbd.h"
#include "ntioctl.h"
+#include "lib/util/tevent_unix.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_VFS
return result;
}
-static SMB_STRUCT_DIR *smb_time_audit_opendir(vfs_handle_struct *handle,
+static DIR *smb_time_audit_opendir(vfs_handle_struct *handle,
const char *fname,
const char *mask, uint32 attr)
{
- SMB_STRUCT_DIR *result;
+ DIR *result;
struct timespec ts1,ts2;
double timediff;
return result;
}
-static SMB_STRUCT_DIR *smb_time_audit_fdopendir(vfs_handle_struct *handle,
+static DIR *smb_time_audit_fdopendir(vfs_handle_struct *handle,
files_struct *fsp,
const char *mask, uint32 attr)
{
- SMB_STRUCT_DIR *result;
+ DIR *result;
struct timespec ts1,ts2;
double timediff;
return result;
}
-static SMB_STRUCT_DIRENT *smb_time_audit_readdir(vfs_handle_struct *handle,
- SMB_STRUCT_DIR *dirp,
+static struct dirent *smb_time_audit_readdir(vfs_handle_struct *handle,
+ DIR *dirp,
SMB_STRUCT_STAT *sbuf)
{
- SMB_STRUCT_DIRENT *result;
+ struct dirent *result;
struct timespec ts1,ts2;
double timediff;
}
static void smb_time_audit_seekdir(vfs_handle_struct *handle,
- SMB_STRUCT_DIR *dirp, long offset)
+ DIR *dirp, long offset)
{
struct timespec ts1,ts2;
double timediff;
}
static long smb_time_audit_telldir(vfs_handle_struct *handle,
- SMB_STRUCT_DIR *dirp)
+ DIR *dirp)
{
long result;
struct timespec ts1,ts2;
}
static void smb_time_audit_rewinddir(vfs_handle_struct *handle,
- SMB_STRUCT_DIR *dirp)
+ DIR *dirp)
{
struct timespec ts1,ts2;
double timediff;
}
static int smb_time_audit_closedir(vfs_handle_struct *handle,
- SMB_STRUCT_DIR *dirp)
+ DIR *dirp)
{
int result;
struct timespec ts1,ts2;
}
static void smb_time_audit_init_search_op(vfs_handle_struct *handle,
- SMB_STRUCT_DIR *dirp)
+ DIR *dirp)
{
struct timespec ts1,ts2;
double timediff;
static ssize_t smb_time_audit_pread(vfs_handle_struct *handle,
files_struct *fsp,
- void *data, size_t n, SMB_OFF_T offset)
+ void *data, size_t n, off_t offset)
{
ssize_t result;
struct timespec ts1,ts2;
return result;
}
+struct smb_time_audit_pread_state {
+ struct timespec ts1;
+ ssize_t ret;
+ int err;
+};
+
+static void smb_time_audit_pread_done(struct tevent_req *subreq);
+
+static struct tevent_req *smb_time_audit_pread_send(
+ struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev, struct files_struct *fsp,
+ void *data, size_t n, off_t offset)
+{
+ struct tevent_req *req, *subreq;
+ struct smb_time_audit_pread_state *state;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct smb_time_audit_pread_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ clock_gettime_mono(&state->ts1);
+
+ subreq = SMB_VFS_NEXT_PREAD_SEND(state, ev, handle, fsp, data,
+ n, offset);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, smb_time_audit_pread_done, req);
+ return req;
+}
+
+static void smb_time_audit_pread_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct smb_time_audit_pread_state *state = tevent_req_data(
+ req, struct smb_time_audit_pread_state);
+
+ state->ret = SMB_VFS_PREAD_RECV(subreq, &state->err);
+ TALLOC_FREE(subreq);
+ tevent_req_done(req);
+}
+
+static ssize_t smb_time_audit_pread_recv(struct tevent_req *req, int *err)
+{
+ struct smb_time_audit_pread_state *state = tevent_req_data(
+ req, struct smb_time_audit_pread_state);
+ struct timespec ts2;
+ double timediff;
+
+ clock_gettime_mono(&ts2);
+ timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
+
+ if (timediff > audit_timeout) {
+ smb_time_audit_log("pread", timediff);
+ }
+
+ if (tevent_req_is_unix_error(req, err)) {
+ return -1;
+ }
+ *err = state->err;
+ return state->ret;
+}
+
static ssize_t smb_time_audit_write(vfs_handle_struct *handle,
files_struct *fsp,
const void *data, size_t n)
static ssize_t smb_time_audit_pwrite(vfs_handle_struct *handle,
files_struct *fsp,
const void *data, size_t n,
- SMB_OFF_T offset)
+ off_t offset)
{
ssize_t result;
struct timespec ts1,ts2;
return result;
}
-static SMB_OFF_T smb_time_audit_lseek(vfs_handle_struct *handle,
+struct smb_time_audit_pwrite_state {
+ struct timespec ts1;
+ ssize_t ret;
+ int err;
+};
+
+static void smb_time_audit_pwrite_done(struct tevent_req *subreq);
+
+static struct tevent_req *smb_time_audit_pwrite_send(
+ struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev, struct files_struct *fsp,
+ const void *data, size_t n, off_t offset)
+{
+ struct tevent_req *req, *subreq;
+ struct smb_time_audit_pwrite_state *state;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct smb_time_audit_pwrite_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ clock_gettime_mono(&state->ts1);
+
+ subreq = SMB_VFS_NEXT_PWRITE_SEND(state, ev, handle, fsp, data,
+ n, offset);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, smb_time_audit_pwrite_done, req);
+ return req;
+}
+
+static void smb_time_audit_pwrite_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct smb_time_audit_pwrite_state *state = tevent_req_data(
+ req, struct smb_time_audit_pwrite_state);
+
+ state->ret = SMB_VFS_PWRITE_RECV(subreq, &state->err);
+ TALLOC_FREE(subreq);
+ tevent_req_done(req);
+}
+
+static ssize_t smb_time_audit_pwrite_recv(struct tevent_req *req, int *err)
+{
+ struct smb_time_audit_pwrite_state *state = tevent_req_data(
+ req, struct smb_time_audit_pwrite_state);
+ struct timespec ts2;
+ double timediff;
+
+ clock_gettime_mono(&ts2);
+ timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
+
+ if (timediff > audit_timeout) {
+ smb_time_audit_log("pwrite", timediff);
+ }
+
+ if (tevent_req_is_unix_error(req, err)) {
+ return -1;
+ }
+ *err = state->err;
+ return state->ret;
+}
+
+static off_t smb_time_audit_lseek(vfs_handle_struct *handle,
files_struct *fsp,
- SMB_OFF_T offset, int whence)
+ off_t offset, int whence)
{
- SMB_OFF_T result;
+ off_t result;
struct timespec ts1,ts2;
double timediff;
static ssize_t smb_time_audit_sendfile(vfs_handle_struct *handle, int tofd,
files_struct *fromfsp,
- const DATA_BLOB *hdr, SMB_OFF_T offset,
+ const DATA_BLOB *hdr, off_t offset,
size_t n)
{
ssize_t result;
static ssize_t smb_time_audit_recvfile(vfs_handle_struct *handle, int fromfd,
files_struct *tofsp,
- SMB_OFF_T offset,
+ off_t offset,
size_t n)
{
ssize_t result;
static int smb_time_audit_ftruncate(vfs_handle_struct *handle,
files_struct *fsp,
- SMB_OFF_T len)
+ off_t len)
{
int result;
struct timespec ts1,ts2;
static int smb_time_audit_fallocate(vfs_handle_struct *handle,
files_struct *fsp,
enum vfs_fallocate_mode mode,
- SMB_OFF_T offset,
- SMB_OFF_T len)
+ off_t offset,
+ off_t len)
{
int result;
struct timespec ts1,ts2;
}
static bool smb_time_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
- int op, SMB_OFF_T offset, SMB_OFF_T count,
+ int op, off_t offset, off_t count,
int type)
{
bool result;
static bool smb_time_audit_getlock(vfs_handle_struct *handle,
files_struct *fsp,
- SMB_OFF_T *poffset, SMB_OFF_T *pcount,
+ off_t *poffset, off_t *pcount,
int *ptype, pid_t *ppid)
{
bool result;
static NTSTATUS smb_time_audit_notify_watch(struct vfs_handle_struct *handle,
struct sys_notify_context *ctx,
- struct notify_entry *e,
const char *path,
+ uint32_t *filter,
+ uint32_t *subdir_filter,
void (*callback)(struct sys_notify_context *ctx,
void *private_data,
struct notify_event *ev),
double timediff;
clock_gettime_mono(&ts1);
- result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, e, path, callback,
+ result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, path,
+ filter, subdir_filter, callback,
private_data, handle_p);
clock_gettime_mono(&ts2);
timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
return result;
}
-static ssize_t smb_time_audit_lgetxattr(struct vfs_handle_struct *handle,
- const char *path, const char *name,
- void *value, size_t size)
-{
- ssize_t result;
- struct timespec ts1,ts2;
- double timediff;
-
- clock_gettime_mono(&ts1);
- result = SMB_VFS_NEXT_LGETXATTR(handle, path, name, value, size);
- clock_gettime_mono(&ts2);
- timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
- if (timediff > audit_timeout) {
- smb_time_audit_log("lgetxattr", timediff);
- }
-
- return result;
-}
-
static ssize_t smb_time_audit_fgetxattr(struct vfs_handle_struct *handle,
struct files_struct *fsp,
const char *name, void *value,
return result;
}
-static ssize_t smb_time_audit_llistxattr(struct vfs_handle_struct *handle,
- const char *path, char *list,
- size_t size)
-{
- ssize_t result;
- struct timespec ts1,ts2;
- double timediff;
-
- clock_gettime_mono(&ts1);
- result = SMB_VFS_NEXT_LLISTXATTR(handle, path, list, size);
- clock_gettime_mono(&ts2);
- timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
- if (timediff > audit_timeout) {
- smb_time_audit_log("llistxattr", timediff);
- }
-
- return result;
-}
-
static ssize_t smb_time_audit_flistxattr(struct vfs_handle_struct *handle,
struct files_struct *fsp, char *list,
size_t size)
return result;
}
-static int smb_time_audit_lremovexattr(struct vfs_handle_struct *handle,
- const char *path, const char *name)
-{
- int result;
- struct timespec ts1,ts2;
- double timediff;
-
- clock_gettime_mono(&ts1);
- result = SMB_VFS_NEXT_LREMOVEXATTR(handle, path, name);
- clock_gettime_mono(&ts2);
- timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
- if (timediff > audit_timeout) {
- smb_time_audit_log("lremovexattr", timediff);
- }
-
- return result;
-}
-
static int smb_time_audit_fremovexattr(struct vfs_handle_struct *handle,
struct files_struct *fsp,
const char *name)
return result;
}
-static int smb_time_audit_lsetxattr(struct vfs_handle_struct *handle,
- const char *path, const char *name,
- const void *value, size_t size,
- int flags)
-{
- int result;
- struct timespec ts1,ts2;
- double timediff;
-
- clock_gettime_mono(&ts1);
- result = SMB_VFS_NEXT_LSETXATTR(handle, path, name, value, size,
- flags);
- clock_gettime_mono(&ts2);
- timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
-
- if (timediff > audit_timeout) {
- smb_time_audit_log("lsetxattr", timediff);
- }
-
- return result;
-}
-
static int smb_time_audit_fsetxattr(struct vfs_handle_struct *handle,
struct files_struct *fsp, const char *name,
const void *value, size_t size, int flags)
.close_fn = smb_time_audit_close,
.read_fn = smb_time_audit_read,
.pread_fn = smb_time_audit_pread,
+ .pread_send_fn = smb_time_audit_pread_send,
+ .pread_recv_fn = smb_time_audit_pread_recv,
.write_fn = smb_time_audit_write,
.pwrite_fn = smb_time_audit_pwrite,
+ .pwrite_send_fn = smb_time_audit_pwrite_send,
+ .pwrite_recv_fn = smb_time_audit_pwrite_recv,
.lseek_fn = smb_time_audit_lseek,
.sendfile_fn = smb_time_audit_sendfile,
.recvfile_fn = smb_time_audit_recvfile,
.sys_acl_free_acl_fn = smb_time_audit_sys_acl_free_acl,
.sys_acl_free_qualifier_fn = smb_time_audit_sys_acl_free_qualifier,
.getxattr_fn = smb_time_audit_getxattr,
- .lgetxattr_fn = smb_time_audit_lgetxattr,
.fgetxattr_fn = smb_time_audit_fgetxattr,
.listxattr_fn = smb_time_audit_listxattr,
- .llistxattr_fn = smb_time_audit_llistxattr,
.flistxattr_fn = smb_time_audit_flistxattr,
.removexattr_fn = smb_time_audit_removexattr,
- .lremovexattr_fn = smb_time_audit_lremovexattr,
.fremovexattr_fn = smb_time_audit_fremovexattr,
.setxattr_fn = smb_time_audit_setxattr,
- .lsetxattr_fn = smb_time_audit_lsetxattr,
.fsetxattr_fn = smb_time_audit_fsetxattr,
.aio_read_fn = smb_time_audit_aio_read,
.aio_write_fn = smb_time_audit_aio_write,