libcli/smb: add SMB2_HDR_CHANNEL_SEQUENCE
[Samba/gebeck_regimport.git] / source3 / modules / vfs_time_audit.c
blobff9cf051203cb38b77a15c51ef6a1caf373a4e3b
1 /*
2 * Time auditing VFS module for samba. Log time taken for VFS call to syslog
3 * facility.
5 * Copyright (C) Abhidnya Chirmule <achirmul@in.ibm.com> 2009
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22 * This module implements logging for time taken for all Samba VFS operations.
24 * vfs objects = time_audit
28 #include "includes.h"
29 #include "smbd/smbd.h"
30 #include "ntioctl.h"
31 #include "lib/util/tevent_unix.h"
33 #undef DBGC_CLASS
34 #define DBGC_CLASS DBGC_VFS
36 static double audit_timeout;
38 static void smb_time_audit_log(const char *syscallname, double elapsed)
40 DEBUG(0, ("WARNING: System call \"%s\" took unexpectedly long "
41 "(%.2f seconds) -- Validate that file and storage "
42 "subsystems are operating normally\n", syscallname,
43 elapsed));
46 static int smb_time_audit_connect(vfs_handle_struct *handle,
47 const char *svc, const char *user)
49 int result;
50 struct timespec ts1,ts2;
51 double timediff;
53 if (!handle) {
54 return -1;
57 clock_gettime_mono(&ts1);
58 result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
59 clock_gettime_mono(&ts2);
60 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
61 if (timediff > audit_timeout) {
62 smb_time_audit_log("connect", timediff);
64 return result;
67 static void smb_time_audit_disconnect(vfs_handle_struct *handle)
69 struct timespec ts1,ts2;
70 double timediff;
72 clock_gettime_mono(&ts1);
73 SMB_VFS_NEXT_DISCONNECT(handle);
74 clock_gettime_mono(&ts2);
75 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
77 if (timediff > audit_timeout) {
78 smb_time_audit_log("disconnect", timediff);
81 return;
84 static uint64_t smb_time_audit_disk_free(vfs_handle_struct *handle,
85 const char *path,
86 bool small_query, uint64_t *bsize,
87 uint64_t *dfree, uint64_t *dsize)
89 uint64_t result;
90 struct timespec ts1,ts2;
91 double timediff;
93 clock_gettime_mono(&ts1);
94 result = SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize,
95 dfree, dsize);
96 clock_gettime_mono(&ts2);
97 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
99 /* Don't have a reasonable notion of failure here */
100 if (timediff > audit_timeout) {
101 smb_time_audit_log("disk_free", timediff);
104 return result;
107 static int smb_time_audit_get_quota(struct vfs_handle_struct *handle,
108 enum SMB_QUOTA_TYPE qtype, unid_t id,
109 SMB_DISK_QUOTA *qt)
111 int result;
112 struct timespec ts1,ts2;
113 double timediff;
115 clock_gettime_mono(&ts1);
116 result = SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, qt);
117 clock_gettime_mono(&ts2);
118 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
120 if (timediff > audit_timeout) {
121 smb_time_audit_log("get_quota", timediff);
123 return result;
126 static int smb_time_audit_set_quota(struct vfs_handle_struct *handle,
127 enum SMB_QUOTA_TYPE qtype, unid_t id,
128 SMB_DISK_QUOTA *qt)
130 int result;
131 struct timespec ts1,ts2;
132 double timediff;
134 clock_gettime_mono(&ts1);
135 result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
136 clock_gettime_mono(&ts2);
137 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
139 if (timediff > audit_timeout) {
140 smb_time_audit_log("set_quota", timediff);
143 return result;
146 static int smb_time_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
147 struct files_struct *fsp,
148 struct shadow_copy_data *shadow_copy_data,
149 bool labels)
151 int result;
152 struct timespec ts1,ts2;
153 double timediff;
155 clock_gettime_mono(&ts1);
156 result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp,
157 shadow_copy_data, labels);
158 clock_gettime_mono(&ts2);
159 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
161 if (timediff > audit_timeout) {
162 smb_time_audit_log("get_shadow_copy_data", timediff);
165 return result;
168 static int smb_time_audit_statvfs(struct vfs_handle_struct *handle,
169 const char *path,
170 struct vfs_statvfs_struct *statbuf)
172 int result;
173 struct timespec ts1,ts2;
174 double timediff;
176 clock_gettime_mono(&ts1);
177 result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
178 clock_gettime_mono(&ts2);
179 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
181 if (timediff > audit_timeout) {
182 smb_time_audit_log("statvfs", timediff);
185 return result;
188 static uint32_t smb_time_audit_fs_capabilities(struct vfs_handle_struct *handle,
189 enum timestamp_set_resolution *p_ts_res)
191 uint32_t result;
192 struct timespec ts1,ts2;
193 double timediff;
195 clock_gettime_mono(&ts1);
196 result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
197 clock_gettime_mono(&ts2);
198 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
200 if (timediff > audit_timeout) {
201 smb_time_audit_log("fs_capabilities", timediff);
204 return result;
207 static DIR *smb_time_audit_opendir(vfs_handle_struct *handle,
208 const char *fname,
209 const char *mask, uint32 attr)
211 DIR *result;
212 struct timespec ts1,ts2;
213 double timediff;
215 clock_gettime_mono(&ts1);
216 result = SMB_VFS_NEXT_OPENDIR(handle, fname, mask, attr);
217 clock_gettime_mono(&ts2);
218 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
220 if (timediff > audit_timeout) {
221 smb_time_audit_log("opendir", timediff);
224 return result;
227 static DIR *smb_time_audit_fdopendir(vfs_handle_struct *handle,
228 files_struct *fsp,
229 const char *mask, uint32 attr)
231 DIR *result;
232 struct timespec ts1,ts2;
233 double timediff;
235 clock_gettime_mono(&ts1);
236 result = SMB_VFS_NEXT_FDOPENDIR(handle, fsp, mask, attr);
237 clock_gettime_mono(&ts2);
238 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
240 if (timediff > audit_timeout) {
241 smb_time_audit_log("fdopendir", timediff);
244 return result;
247 static struct dirent *smb_time_audit_readdir(vfs_handle_struct *handle,
248 DIR *dirp,
249 SMB_STRUCT_STAT *sbuf)
251 struct dirent *result;
252 struct timespec ts1,ts2;
253 double timediff;
255 clock_gettime_mono(&ts1);
256 result = SMB_VFS_NEXT_READDIR(handle, dirp, sbuf);
257 clock_gettime_mono(&ts2);
258 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
260 if (timediff > audit_timeout) {
261 smb_time_audit_log("readdir", timediff);
264 return result;
267 static void smb_time_audit_seekdir(vfs_handle_struct *handle,
268 DIR *dirp, long offset)
270 struct timespec ts1,ts2;
271 double timediff;
273 clock_gettime_mono(&ts1);
274 SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
275 clock_gettime_mono(&ts2);
276 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
278 if (timediff > audit_timeout) {
279 smb_time_audit_log("seekdir", timediff);
282 return;
285 static long smb_time_audit_telldir(vfs_handle_struct *handle,
286 DIR *dirp)
288 long result;
289 struct timespec ts1,ts2;
290 double timediff;
292 clock_gettime_mono(&ts1);
293 result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
294 clock_gettime_mono(&ts2);
295 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
297 if (timediff > audit_timeout) {
298 smb_time_audit_log("telldir", timediff);
301 return result;
304 static void smb_time_audit_rewinddir(vfs_handle_struct *handle,
305 DIR *dirp)
307 struct timespec ts1,ts2;
308 double timediff;
310 clock_gettime_mono(&ts1);
311 SMB_VFS_NEXT_REWINDDIR(handle, dirp);
312 clock_gettime_mono(&ts2);
313 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
315 if (timediff > audit_timeout) {
316 smb_time_audit_log("rewinddir", timediff);
319 return;
322 static int smb_time_audit_mkdir(vfs_handle_struct *handle,
323 const char *path, mode_t mode)
325 int result;
326 struct timespec ts1,ts2;
327 double timediff;
329 clock_gettime_mono(&ts1);
330 result = SMB_VFS_NEXT_MKDIR(handle, path, mode);
331 clock_gettime_mono(&ts2);
332 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
334 if (timediff > audit_timeout) {
335 smb_time_audit_log("mkdir", timediff);
338 return result;
341 static int smb_time_audit_rmdir(vfs_handle_struct *handle,
342 const char *path)
344 int result;
345 struct timespec ts1,ts2;
346 double timediff;
348 clock_gettime_mono(&ts1);
349 result = SMB_VFS_NEXT_RMDIR(handle, path);
350 clock_gettime_mono(&ts2);
351 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
353 if (timediff > audit_timeout) {
354 smb_time_audit_log("rmdir", timediff);
357 return result;
360 static int smb_time_audit_closedir(vfs_handle_struct *handle,
361 DIR *dirp)
363 int result;
364 struct timespec ts1,ts2;
365 double timediff;
367 clock_gettime_mono(&ts1);
368 result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
369 clock_gettime_mono(&ts2);
370 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
372 if (timediff > audit_timeout) {
373 smb_time_audit_log("closedir", timediff);
376 return result;
379 static void smb_time_audit_init_search_op(vfs_handle_struct *handle,
380 DIR *dirp)
382 struct timespec ts1,ts2;
383 double timediff;
385 clock_gettime_mono(&ts1);
386 SMB_VFS_NEXT_INIT_SEARCH_OP(handle, dirp);
387 clock_gettime_mono(&ts2);
388 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
390 if (timediff > audit_timeout) {
391 smb_time_audit_log("init_search_op", timediff);
393 return;
396 static int smb_time_audit_open(vfs_handle_struct *handle,
397 struct smb_filename *fname,
398 files_struct *fsp,
399 int flags, mode_t mode)
401 int result;
402 struct timespec ts1,ts2;
403 double timediff;
405 clock_gettime_mono(&ts1);
406 result = SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode);
407 clock_gettime_mono(&ts2);
408 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
410 if (timediff > audit_timeout) {
411 smb_time_audit_log("open", timediff);
414 return result;
417 static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
418 struct smb_request *req,
419 uint16_t root_dir_fid,
420 struct smb_filename *fname,
421 uint32_t access_mask,
422 uint32_t share_access,
423 uint32_t create_disposition,
424 uint32_t create_options,
425 uint32_t file_attributes,
426 uint32_t oplock_request,
427 uint64_t allocation_size,
428 uint32_t private_flags,
429 struct security_descriptor *sd,
430 struct ea_list *ea_list,
431 files_struct **result_fsp,
432 int *pinfo)
434 NTSTATUS result;
435 struct timespec ts1,ts2;
436 double timediff;
438 clock_gettime_mono(&ts1);
439 result = SMB_VFS_NEXT_CREATE_FILE(
440 handle, /* handle */
441 req, /* req */
442 root_dir_fid, /* root_dir_fid */
443 fname, /* fname */
444 access_mask, /* access_mask */
445 share_access, /* share_access */
446 create_disposition, /* create_disposition*/
447 create_options, /* create_options */
448 file_attributes, /* file_attributes */
449 oplock_request, /* oplock_request */
450 allocation_size, /* allocation_size */
451 private_flags,
452 sd, /* sd */
453 ea_list, /* ea_list */
454 result_fsp, /* result */
455 pinfo);
456 clock_gettime_mono(&ts2);
457 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
459 if (timediff > audit_timeout) {
460 smb_time_audit_log("create_file", timediff);
463 return result;
466 static int smb_time_audit_close(vfs_handle_struct *handle, files_struct *fsp)
468 int result;
469 struct timespec ts1,ts2;
470 double timediff;
472 clock_gettime_mono(&ts1);
473 result = SMB_VFS_NEXT_CLOSE(handle, fsp);
474 clock_gettime_mono(&ts2);
475 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
477 if (timediff > audit_timeout) {
478 smb_time_audit_log("close", timediff);
481 return result;
484 static ssize_t smb_time_audit_read(vfs_handle_struct *handle,
485 files_struct *fsp, void *data, size_t n)
487 ssize_t result;
488 struct timespec ts1,ts2;
489 double timediff;
491 clock_gettime_mono(&ts1);
492 result = SMB_VFS_NEXT_READ(handle, fsp, data, n);
493 clock_gettime_mono(&ts2);
494 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
496 if (timediff > audit_timeout) {
497 smb_time_audit_log("read", timediff);
500 return result;
503 static ssize_t smb_time_audit_pread(vfs_handle_struct *handle,
504 files_struct *fsp,
505 void *data, size_t n, off_t offset)
507 ssize_t result;
508 struct timespec ts1,ts2;
509 double timediff;
511 clock_gettime_mono(&ts1);
512 result = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
513 clock_gettime_mono(&ts2);
514 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
516 if (timediff > audit_timeout) {
517 smb_time_audit_log("pread", timediff);
520 return result;
523 struct smb_time_audit_pread_state {
524 struct timespec ts1;
525 ssize_t ret;
526 int err;
529 static void smb_time_audit_pread_done(struct tevent_req *subreq);
531 static struct tevent_req *smb_time_audit_pread_send(
532 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
533 struct tevent_context *ev, struct files_struct *fsp,
534 void *data, size_t n, off_t offset)
536 struct tevent_req *req, *subreq;
537 struct smb_time_audit_pread_state *state;
539 req = tevent_req_create(mem_ctx, &state,
540 struct smb_time_audit_pread_state);
541 if (req == NULL) {
542 return NULL;
544 clock_gettime_mono(&state->ts1);
546 subreq = SMB_VFS_NEXT_PREAD_SEND(state, ev, handle, fsp, data,
547 n, offset);
548 if (tevent_req_nomem(subreq, req)) {
549 return tevent_req_post(req, ev);
551 tevent_req_set_callback(subreq, smb_time_audit_pread_done, req);
552 return req;
555 static void smb_time_audit_pread_done(struct tevent_req *subreq)
557 struct tevent_req *req = tevent_req_callback_data(
558 subreq, struct tevent_req);
559 struct smb_time_audit_pread_state *state = tevent_req_data(
560 req, struct smb_time_audit_pread_state);
562 state->ret = SMB_VFS_PREAD_RECV(subreq, &state->err);
563 TALLOC_FREE(subreq);
564 tevent_req_done(req);
567 static ssize_t smb_time_audit_pread_recv(struct tevent_req *req, int *err)
569 struct smb_time_audit_pread_state *state = tevent_req_data(
570 req, struct smb_time_audit_pread_state);
571 struct timespec ts2;
572 double timediff;
574 clock_gettime_mono(&ts2);
575 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
577 if (timediff > audit_timeout) {
578 smb_time_audit_log("pread", timediff);
581 if (tevent_req_is_unix_error(req, err)) {
582 return -1;
584 *err = state->err;
585 return state->ret;
588 static ssize_t smb_time_audit_write(vfs_handle_struct *handle,
589 files_struct *fsp,
590 const void *data, size_t n)
592 ssize_t result;
593 struct timespec ts1,ts2;
594 double timediff;
596 clock_gettime_mono(&ts1);
597 result = SMB_VFS_NEXT_WRITE(handle, fsp, data, n);
598 clock_gettime_mono(&ts2);
599 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
601 if (timediff > audit_timeout) {
602 smb_time_audit_log("write", timediff);
605 return result;
608 static ssize_t smb_time_audit_pwrite(vfs_handle_struct *handle,
609 files_struct *fsp,
610 const void *data, size_t n,
611 off_t offset)
613 ssize_t result;
614 struct timespec ts1,ts2;
615 double timediff;
617 clock_gettime_mono(&ts1);
618 result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
619 clock_gettime_mono(&ts2);
620 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
622 if (timediff > audit_timeout) {
623 smb_time_audit_log("pwrite", timediff);
626 return result;
629 struct smb_time_audit_pwrite_state {
630 struct timespec ts1;
631 ssize_t ret;
632 int err;
635 static void smb_time_audit_pwrite_done(struct tevent_req *subreq);
637 static struct tevent_req *smb_time_audit_pwrite_send(
638 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
639 struct tevent_context *ev, struct files_struct *fsp,
640 const void *data, size_t n, off_t offset)
642 struct tevent_req *req, *subreq;
643 struct smb_time_audit_pwrite_state *state;
645 req = tevent_req_create(mem_ctx, &state,
646 struct smb_time_audit_pwrite_state);
647 if (req == NULL) {
648 return NULL;
650 clock_gettime_mono(&state->ts1);
652 subreq = SMB_VFS_NEXT_PWRITE_SEND(state, ev, handle, fsp, data,
653 n, offset);
654 if (tevent_req_nomem(subreq, req)) {
655 return tevent_req_post(req, ev);
657 tevent_req_set_callback(subreq, smb_time_audit_pwrite_done, req);
658 return req;
661 static void smb_time_audit_pwrite_done(struct tevent_req *subreq)
663 struct tevent_req *req = tevent_req_callback_data(
664 subreq, struct tevent_req);
665 struct smb_time_audit_pwrite_state *state = tevent_req_data(
666 req, struct smb_time_audit_pwrite_state);
668 state->ret = SMB_VFS_PWRITE_RECV(subreq, &state->err);
669 TALLOC_FREE(subreq);
670 tevent_req_done(req);
673 static ssize_t smb_time_audit_pwrite_recv(struct tevent_req *req, int *err)
675 struct smb_time_audit_pwrite_state *state = tevent_req_data(
676 req, struct smb_time_audit_pwrite_state);
677 struct timespec ts2;
678 double timediff;
680 clock_gettime_mono(&ts2);
681 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
683 if (timediff > audit_timeout) {
684 smb_time_audit_log("pwrite", timediff);
687 if (tevent_req_is_unix_error(req, err)) {
688 return -1;
690 *err = state->err;
691 return state->ret;
694 static off_t smb_time_audit_lseek(vfs_handle_struct *handle,
695 files_struct *fsp,
696 off_t offset, int whence)
698 off_t result;
699 struct timespec ts1,ts2;
700 double timediff;
702 clock_gettime_mono(&ts1);
703 result = SMB_VFS_NEXT_LSEEK(handle, fsp, offset, whence);
704 clock_gettime_mono(&ts2);
705 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
707 if (timediff > audit_timeout) {
708 smb_time_audit_log("lseek", timediff);
711 return result;
714 static ssize_t smb_time_audit_sendfile(vfs_handle_struct *handle, int tofd,
715 files_struct *fromfsp,
716 const DATA_BLOB *hdr, off_t offset,
717 size_t n)
719 ssize_t result;
720 struct timespec ts1,ts2;
721 double timediff;
723 clock_gettime_mono(&ts1);
724 result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fromfsp, hdr, offset, n);
725 clock_gettime_mono(&ts2);
726 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
728 if (timediff > audit_timeout) {
729 smb_time_audit_log("sendfile", timediff);
732 return result;
735 static ssize_t smb_time_audit_recvfile(vfs_handle_struct *handle, int fromfd,
736 files_struct *tofsp,
737 off_t offset,
738 size_t n)
740 ssize_t result;
741 struct timespec ts1,ts2;
742 double timediff;
744 clock_gettime_mono(&ts1);
745 result = SMB_VFS_NEXT_RECVFILE(handle, fromfd, tofsp, offset, n);
746 clock_gettime_mono(&ts2);
747 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
749 if (timediff > audit_timeout) {
750 smb_time_audit_log("recvfile", timediff);
753 return result;
756 static int smb_time_audit_rename(vfs_handle_struct *handle,
757 const struct smb_filename *oldname,
758 const struct smb_filename *newname)
760 int result;
761 struct timespec ts1,ts2;
762 double timediff;
764 clock_gettime_mono(&ts1);
765 result = SMB_VFS_NEXT_RENAME(handle, oldname, newname);
766 clock_gettime_mono(&ts2);
767 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
769 if (timediff > audit_timeout) {
770 smb_time_audit_log("rename", timediff);
773 return result;
776 static int smb_time_audit_fsync(vfs_handle_struct *handle, files_struct *fsp)
778 int result;
779 struct timespec ts1,ts2;
780 double timediff;
782 clock_gettime_mono(&ts1);
783 result = SMB_VFS_NEXT_FSYNC(handle, fsp);
784 clock_gettime_mono(&ts2);
785 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
787 if (timediff > audit_timeout) {
788 smb_time_audit_log("fsync", timediff);
791 return result;
794 struct smb_time_audit_fsync_state {
795 struct timespec ts1;
796 int ret;
797 int err;
800 static void smb_time_audit_fsync_done(struct tevent_req *subreq);
802 static struct tevent_req *smb_time_audit_fsync_send(
803 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
804 struct tevent_context *ev, struct files_struct *fsp)
806 struct tevent_req *req, *subreq;
807 struct smb_time_audit_fsync_state *state;
809 req = tevent_req_create(mem_ctx, &state,
810 struct smb_time_audit_fsync_state);
811 if (req == NULL) {
812 return NULL;
814 clock_gettime_mono(&state->ts1);
816 subreq = SMB_VFS_NEXT_FSYNC_SEND(state, ev, handle, fsp);
817 if (tevent_req_nomem(subreq, req)) {
818 return tevent_req_post(req, ev);
820 tevent_req_set_callback(subreq, smb_time_audit_fsync_done, req);
821 return req;
824 static void smb_time_audit_fsync_done(struct tevent_req *subreq)
826 struct tevent_req *req = tevent_req_callback_data(
827 subreq, struct tevent_req);
828 struct smb_time_audit_fsync_state *state = tevent_req_data(
829 req, struct smb_time_audit_fsync_state);
831 state->ret = SMB_VFS_FSYNC_RECV(subreq, &state->err);
832 TALLOC_FREE(subreq);
833 tevent_req_done(req);
836 static int smb_time_audit_fsync_recv(struct tevent_req *req, int *err)
838 struct smb_time_audit_fsync_state *state = tevent_req_data(
839 req, struct smb_time_audit_fsync_state);
840 struct timespec ts2;
841 double timediff;
843 clock_gettime_mono(&ts2);
844 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
846 if (timediff > audit_timeout) {
847 smb_time_audit_log("fsync", timediff);
850 if (tevent_req_is_unix_error(req, err)) {
851 return -1;
853 *err = state->err;
854 return state->ret;
857 static int smb_time_audit_stat(vfs_handle_struct *handle,
858 struct smb_filename *fname)
860 int result;
861 struct timespec ts1,ts2;
862 double timediff;
864 clock_gettime_mono(&ts1);
865 result = SMB_VFS_NEXT_STAT(handle, fname);
866 clock_gettime_mono(&ts2);
867 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
869 if (timediff > audit_timeout) {
870 smb_time_audit_log("stat", timediff);
873 return result;
876 static int smb_time_audit_fstat(vfs_handle_struct *handle, files_struct *fsp,
877 SMB_STRUCT_STAT *sbuf)
879 int result;
880 struct timespec ts1,ts2;
881 double timediff;
883 clock_gettime_mono(&ts1);
884 result = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
885 clock_gettime_mono(&ts2);
886 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
888 if (timediff > audit_timeout) {
889 smb_time_audit_log("fstat", timediff);
892 return result;
895 static int smb_time_audit_lstat(vfs_handle_struct *handle,
896 struct smb_filename *path)
898 int result;
899 struct timespec ts1,ts2;
900 double timediff;
902 clock_gettime_mono(&ts1);
903 result = SMB_VFS_NEXT_LSTAT(handle, path);
904 clock_gettime_mono(&ts2);
905 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
907 if (timediff > audit_timeout) {
908 smb_time_audit_log("lstat", timediff);
911 return result;
914 static uint64_t smb_time_audit_get_alloc_size(vfs_handle_struct *handle,
915 files_struct *fsp,
916 const SMB_STRUCT_STAT *sbuf)
918 uint64_t result;
919 struct timespec ts1,ts2;
920 double timediff;
922 clock_gettime_mono(&ts1);
923 result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
924 clock_gettime_mono(&ts2);
925 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
927 if (timediff > audit_timeout) {
928 smb_time_audit_log("get_alloc_size", timediff);
931 return result;
934 static int smb_time_audit_unlink(vfs_handle_struct *handle,
935 const struct smb_filename *path)
937 int result;
938 struct timespec ts1,ts2;
939 double timediff;
941 clock_gettime_mono(&ts1);
942 result = SMB_VFS_NEXT_UNLINK(handle, path);
943 clock_gettime_mono(&ts2);
944 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
946 if (timediff > audit_timeout) {
947 smb_time_audit_log("unlink", timediff);
950 return result;
953 static int smb_time_audit_chmod(vfs_handle_struct *handle,
954 const char *path, mode_t mode)
956 int result;
957 struct timespec ts1,ts2;
958 double timediff;
960 clock_gettime_mono(&ts1);
961 result = SMB_VFS_NEXT_CHMOD(handle, path, mode);
962 clock_gettime_mono(&ts2);
963 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
965 if (timediff > audit_timeout) {
966 smb_time_audit_log("chmod", timediff);
969 return result;
972 static int smb_time_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp,
973 mode_t mode)
975 int result;
976 struct timespec ts1,ts2;
977 double timediff;
979 clock_gettime_mono(&ts1);
980 result = SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
981 clock_gettime_mono(&ts2);
982 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
984 if (timediff > audit_timeout) {
985 smb_time_audit_log("fchmod", timediff);
988 return result;
991 static int smb_time_audit_chown(vfs_handle_struct *handle,
992 const char *path, uid_t uid, gid_t gid)
994 int result;
995 struct timespec ts1,ts2;
996 double timediff;
998 clock_gettime_mono(&ts1);
999 result = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid);
1000 clock_gettime_mono(&ts2);
1001 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1003 if (timediff > audit_timeout) {
1004 smb_time_audit_log("chown", timediff);
1007 return result;
1010 static int smb_time_audit_fchown(vfs_handle_struct *handle, files_struct *fsp,
1011 uid_t uid, gid_t gid)
1013 int result;
1014 struct timespec ts1,ts2;
1015 double timediff;
1017 clock_gettime_mono(&ts1);
1018 result = SMB_VFS_NEXT_FCHOWN(handle, fsp, uid, gid);
1019 clock_gettime_mono(&ts2);
1020 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1022 if (timediff > audit_timeout) {
1023 smb_time_audit_log("fchown", timediff);
1026 return result;
1029 static int smb_time_audit_lchown(vfs_handle_struct *handle,
1030 const char *path, uid_t uid, gid_t gid)
1032 int result;
1033 struct timespec ts1,ts2;
1034 double timediff;
1036 clock_gettime_mono(&ts1);
1037 result = SMB_VFS_NEXT_LCHOWN(handle, path, uid, gid);
1038 clock_gettime_mono(&ts2);
1039 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1041 if (timediff > audit_timeout) {
1042 smb_time_audit_log("lchown", timediff);
1045 return result;
1048 static int smb_time_audit_chdir(vfs_handle_struct *handle, const char *path)
1050 int result;
1051 struct timespec ts1,ts2;
1052 double timediff;
1054 clock_gettime_mono(&ts1);
1055 result = SMB_VFS_NEXT_CHDIR(handle, path);
1056 clock_gettime_mono(&ts2);
1057 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1059 if (timediff > audit_timeout) {
1060 smb_time_audit_log("chdir", timediff);
1063 return result;
1066 static char *smb_time_audit_getwd(vfs_handle_struct *handle)
1068 char *result;
1069 struct timespec ts1,ts2;
1070 double timediff;
1072 clock_gettime_mono(&ts1);
1073 result = SMB_VFS_NEXT_GETWD(handle);
1074 clock_gettime_mono(&ts2);
1075 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1077 if (timediff > audit_timeout) {
1078 smb_time_audit_log("getwd", timediff);
1081 return result;
1084 static int smb_time_audit_ntimes(vfs_handle_struct *handle,
1085 const struct smb_filename *path,
1086 struct smb_file_time *ft)
1088 int result;
1089 struct timespec ts1,ts2;
1090 double timediff;
1092 clock_gettime_mono(&ts1);
1093 result = SMB_VFS_NEXT_NTIMES(handle, path, ft);
1094 clock_gettime_mono(&ts2);
1095 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1097 if (timediff > audit_timeout) {
1098 smb_time_audit_log("ntimes", timediff);
1101 return result;
1104 static int smb_time_audit_ftruncate(vfs_handle_struct *handle,
1105 files_struct *fsp,
1106 off_t len)
1108 int result;
1109 struct timespec ts1,ts2;
1110 double timediff;
1112 clock_gettime_mono(&ts1);
1113 result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len);
1114 clock_gettime_mono(&ts2);
1115 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1117 if (timediff > audit_timeout) {
1118 smb_time_audit_log("ftruncate", timediff);
1121 return result;
1124 static int smb_time_audit_fallocate(vfs_handle_struct *handle,
1125 files_struct *fsp,
1126 enum vfs_fallocate_mode mode,
1127 off_t offset,
1128 off_t len)
1130 int result;
1131 struct timespec ts1,ts2;
1132 double timediff;
1134 clock_gettime_mono(&ts1);
1135 result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len);
1136 clock_gettime_mono(&ts2);
1137 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1139 if (timediff > audit_timeout) {
1140 smb_time_audit_log("fallocate", timediff);
1143 return result;
1146 static bool smb_time_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
1147 int op, off_t offset, off_t count,
1148 int type)
1150 bool result;
1151 struct timespec ts1,ts2;
1152 double timediff;
1154 clock_gettime_mono(&ts1);
1155 result = SMB_VFS_NEXT_LOCK(handle, fsp, op, offset, count, type);
1156 clock_gettime_mono(&ts2);
1157 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1159 if (timediff > audit_timeout) {
1160 smb_time_audit_log("lock", timediff);
1163 return result;
1166 static int smb_time_audit_kernel_flock(struct vfs_handle_struct *handle,
1167 struct files_struct *fsp,
1168 uint32 share_mode, uint32 access_mask)
1170 int result;
1171 struct timespec ts1,ts2;
1172 double timediff;
1174 clock_gettime_mono(&ts1);
1175 result = SMB_VFS_NEXT_KERNEL_FLOCK(handle, fsp, share_mode,
1176 access_mask);
1177 clock_gettime_mono(&ts2);
1178 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1180 if (timediff > audit_timeout) {
1181 smb_time_audit_log("kernel_flock", timediff);
1184 return result;
1187 static int smb_time_audit_linux_setlease(vfs_handle_struct *handle,
1188 files_struct *fsp,
1189 int leasetype)
1191 int result;
1192 struct timespec ts1,ts2;
1193 double timediff;
1195 clock_gettime_mono(&ts1);
1196 result = SMB_VFS_NEXT_LINUX_SETLEASE(handle, fsp, leasetype);
1197 clock_gettime_mono(&ts2);
1198 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1200 if (timediff > audit_timeout) {
1201 smb_time_audit_log("linux_setlease", timediff);
1204 return result;
1207 static bool smb_time_audit_getlock(vfs_handle_struct *handle,
1208 files_struct *fsp,
1209 off_t *poffset, off_t *pcount,
1210 int *ptype, pid_t *ppid)
1212 bool result;
1213 struct timespec ts1,ts2;
1214 double timediff;
1216 clock_gettime_mono(&ts1);
1217 result = SMB_VFS_NEXT_GETLOCK(handle, fsp, poffset, pcount, ptype,
1218 ppid);
1219 clock_gettime_mono(&ts2);
1220 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1222 if (timediff > audit_timeout) {
1223 smb_time_audit_log("getlock", timediff);
1226 return result;
1229 static int smb_time_audit_symlink(vfs_handle_struct *handle,
1230 const char *oldpath, const char *newpath)
1232 int result;
1233 struct timespec ts1,ts2;
1234 double timediff;
1236 clock_gettime_mono(&ts1);
1237 result = SMB_VFS_NEXT_SYMLINK(handle, oldpath, newpath);
1238 clock_gettime_mono(&ts2);
1239 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1241 if (timediff > audit_timeout) {
1242 smb_time_audit_log("symlink", timediff);
1245 return result;
1248 static int smb_time_audit_readlink(vfs_handle_struct *handle,
1249 const char *path, char *buf, size_t bufsiz)
1251 int result;
1252 struct timespec ts1,ts2;
1253 double timediff;
1255 clock_gettime_mono(&ts1);
1256 result = SMB_VFS_NEXT_READLINK(handle, path, buf, bufsiz);
1257 clock_gettime_mono(&ts2);
1258 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1260 if (timediff > audit_timeout) {
1261 smb_time_audit_log("readlink", timediff);
1264 return result;
1267 static int smb_time_audit_link(vfs_handle_struct *handle,
1268 const char *oldpath, const char *newpath)
1270 int result;
1271 struct timespec ts1,ts2;
1272 double timediff;
1274 clock_gettime_mono(&ts1);
1275 result = SMB_VFS_NEXT_LINK(handle, oldpath, newpath);
1276 clock_gettime_mono(&ts2);
1277 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1279 if (timediff > audit_timeout) {
1280 smb_time_audit_log("link", timediff);
1283 return result;
1286 static int smb_time_audit_mknod(vfs_handle_struct *handle,
1287 const char *pathname, mode_t mode,
1288 SMB_DEV_T dev)
1290 int result;
1291 struct timespec ts1,ts2;
1292 double timediff;
1294 clock_gettime_mono(&ts1);
1295 result = SMB_VFS_NEXT_MKNOD(handle, pathname, mode, dev);
1296 clock_gettime_mono(&ts2);
1297 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1299 if (timediff > audit_timeout) {
1300 smb_time_audit_log("mknod", timediff);
1303 return result;
1306 static char *smb_time_audit_realpath(vfs_handle_struct *handle,
1307 const char *path)
1309 char *result;
1310 struct timespec ts1,ts2;
1311 double timediff;
1313 clock_gettime_mono(&ts1);
1314 result = SMB_VFS_NEXT_REALPATH(handle, path);
1315 clock_gettime_mono(&ts2);
1316 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1318 if (timediff > audit_timeout) {
1319 smb_time_audit_log("realpath", timediff);
1322 return result;
1325 static NTSTATUS smb_time_audit_notify_watch(struct vfs_handle_struct *handle,
1326 struct sys_notify_context *ctx,
1327 const char *path,
1328 uint32_t *filter,
1329 uint32_t *subdir_filter,
1330 void (*callback)(struct sys_notify_context *ctx,
1331 void *private_data,
1332 struct notify_event *ev),
1333 void *private_data, void *handle_p)
1335 NTSTATUS result;
1336 struct timespec ts1,ts2;
1337 double timediff;
1339 clock_gettime_mono(&ts1);
1340 result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, path,
1341 filter, subdir_filter, callback,
1342 private_data, handle_p);
1343 clock_gettime_mono(&ts2);
1344 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1346 if (timediff > audit_timeout) {
1347 smb_time_audit_log("notify_watch", timediff);
1350 return result;
1353 static int smb_time_audit_chflags(vfs_handle_struct *handle,
1354 const char *path, unsigned int flags)
1356 int result;
1357 struct timespec ts1,ts2;
1358 double timediff;
1360 clock_gettime_mono(&ts1);
1361 result = SMB_VFS_NEXT_CHFLAGS(handle, path, flags);
1362 clock_gettime_mono(&ts2);
1363 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1365 if (timediff > audit_timeout) {
1366 smb_time_audit_log("chflags", timediff);
1369 return result;
1372 static struct file_id smb_time_audit_file_id_create(struct vfs_handle_struct *handle,
1373 const SMB_STRUCT_STAT *sbuf)
1375 struct file_id id_zero;
1376 struct file_id result;
1377 struct timespec ts1,ts2;
1378 double timediff;
1380 ZERO_STRUCT(id_zero);
1382 clock_gettime_mono(&ts1);
1383 result = SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
1384 clock_gettime_mono(&ts2);
1385 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1387 if (timediff > audit_timeout) {
1388 smb_time_audit_log("file_id_create", timediff);
1391 return result;
1394 static NTSTATUS smb_time_audit_streaminfo(vfs_handle_struct *handle,
1395 struct files_struct *fsp,
1396 const char *fname,
1397 TALLOC_CTX *mem_ctx,
1398 unsigned int *pnum_streams,
1399 struct stream_struct **pstreams)
1401 NTSTATUS result;
1402 struct timespec ts1,ts2;
1403 double timediff;
1405 clock_gettime_mono(&ts1);
1406 result = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx,
1407 pnum_streams, pstreams);
1408 clock_gettime_mono(&ts2);
1409 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1411 if (timediff > audit_timeout) {
1412 smb_time_audit_log("streaminfo", timediff);
1415 return result;
1418 static int smb_time_audit_get_real_filename(struct vfs_handle_struct *handle,
1419 const char *path,
1420 const char *name,
1421 TALLOC_CTX *mem_ctx,
1422 char **found_name)
1424 int result;
1425 struct timespec ts1,ts2;
1426 double timediff;
1428 clock_gettime_mono(&ts1);
1429 result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx,
1430 found_name);
1431 clock_gettime_mono(&ts2);
1432 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1434 if (timediff > audit_timeout) {
1435 smb_time_audit_log("get_real_filename", timediff);
1438 return result;
1441 static const char *smb_time_audit_connectpath(vfs_handle_struct *handle,
1442 const char *fname)
1444 const char *result;
1445 struct timespec ts1,ts2;
1446 double timediff;
1448 clock_gettime_mono(&ts1);
1449 result = SMB_VFS_NEXT_CONNECTPATH(handle, fname);
1450 clock_gettime_mono(&ts2);
1451 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1453 if (timediff > audit_timeout) {
1454 smb_time_audit_log("connectpath", timediff);
1457 return result;
1460 static NTSTATUS smb_time_audit_brl_lock_windows(struct vfs_handle_struct *handle,
1461 struct byte_range_lock *br_lck,
1462 struct lock_struct *plock,
1463 bool blocking_lock,
1464 struct blocking_lock_record *blr)
1466 NTSTATUS result;
1467 struct timespec ts1,ts2;
1468 double timediff;
1470 clock_gettime_mono(&ts1);
1471 result = SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock,
1472 blocking_lock, blr);
1473 clock_gettime_mono(&ts2);
1474 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1476 if (timediff > audit_timeout) {
1477 smb_time_audit_log("brl_lock_windows", timediff);
1480 return result;
1483 static bool smb_time_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
1484 struct messaging_context *msg_ctx,
1485 struct byte_range_lock *br_lck,
1486 const struct lock_struct *plock)
1488 bool result;
1489 struct timespec ts1,ts2;
1490 double timediff;
1492 clock_gettime_mono(&ts1);
1493 result = SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, msg_ctx, br_lck,
1494 plock);
1495 clock_gettime_mono(&ts2);
1496 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1498 if (timediff > audit_timeout) {
1499 smb_time_audit_log("brl_unlock_windows", timediff);
1502 return result;
1505 static bool smb_time_audit_brl_cancel_windows(struct vfs_handle_struct *handle,
1506 struct byte_range_lock *br_lck,
1507 struct lock_struct *plock,
1508 struct blocking_lock_record *blr)
1510 bool result;
1511 struct timespec ts1,ts2;
1512 double timediff;
1514 clock_gettime_mono(&ts1);
1515 result = SMB_VFS_NEXT_BRL_CANCEL_WINDOWS(handle, br_lck, plock, blr);
1516 clock_gettime_mono(&ts2);
1517 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1519 if (timediff > audit_timeout) {
1520 smb_time_audit_log("brl_cancel_windows", timediff);
1523 return result;
1526 static bool smb_time_audit_strict_lock(struct vfs_handle_struct *handle,
1527 struct files_struct *fsp,
1528 struct lock_struct *plock)
1530 bool result;
1531 struct timespec ts1,ts2;
1532 double timediff;
1534 clock_gettime_mono(&ts1);
1535 result = SMB_VFS_NEXT_STRICT_LOCK(handle, fsp, plock);
1536 clock_gettime_mono(&ts2);
1537 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1539 if (timediff > audit_timeout) {
1540 smb_time_audit_log("strict_lock", timediff);
1543 return result;
1546 static void smb_time_audit_strict_unlock(struct vfs_handle_struct *handle,
1547 struct files_struct *fsp,
1548 struct lock_struct *plock)
1550 struct timespec ts1,ts2;
1551 double timediff;
1553 clock_gettime_mono(&ts1);
1554 SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock);
1555 clock_gettime_mono(&ts2);
1556 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1558 if (timediff > audit_timeout) {
1559 smb_time_audit_log("strict_unlock", timediff);
1562 return;
1565 static NTSTATUS smb_time_audit_translate_name(struct vfs_handle_struct *handle,
1566 const char *name,
1567 enum vfs_translate_direction direction,
1568 TALLOC_CTX *mem_ctx,
1569 char **mapped_name)
1571 NTSTATUS result;
1572 struct timespec ts1,ts2;
1573 double timediff;
1575 clock_gettime_mono(&ts1);
1576 result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx,
1577 mapped_name);
1578 clock_gettime_mono(&ts2);
1579 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1581 if (timediff > audit_timeout) {
1582 smb_time_audit_log("translate_name", timediff);
1585 return result;
1588 static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle,
1589 files_struct *fsp,
1590 uint32 security_info,
1591 struct security_descriptor **ppdesc)
1593 NTSTATUS result;
1594 struct timespec ts1,ts2;
1595 double timediff;
1597 clock_gettime_mono(&ts1);
1598 result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, security_info, ppdesc);
1599 clock_gettime_mono(&ts2);
1600 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1602 if (timediff > audit_timeout) {
1603 smb_time_audit_log("fget_nt_acl", timediff);
1606 return result;
1609 static NTSTATUS smb_time_audit_get_nt_acl(vfs_handle_struct *handle,
1610 const char *name,
1611 uint32 security_info,
1612 struct security_descriptor **ppdesc)
1614 NTSTATUS result;
1615 struct timespec ts1,ts2;
1616 double timediff;
1618 clock_gettime_mono(&ts1);
1619 result = SMB_VFS_NEXT_GET_NT_ACL(handle, name, security_info, ppdesc);
1620 clock_gettime_mono(&ts2);
1621 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1623 if (timediff > audit_timeout) {
1624 smb_time_audit_log("get_nt_acl", timediff);
1627 return result;
1630 static NTSTATUS smb_time_audit_fset_nt_acl(vfs_handle_struct *handle,
1631 files_struct *fsp,
1632 uint32 security_info_sent,
1633 const struct security_descriptor *psd)
1635 NTSTATUS result;
1636 struct timespec ts1,ts2;
1637 double timediff;
1639 clock_gettime_mono(&ts1);
1640 result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, security_info_sent,
1641 psd);
1642 clock_gettime_mono(&ts2);
1643 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1645 if (timediff > audit_timeout) {
1646 smb_time_audit_log("fset_nt_acl", timediff);
1649 return result;
1652 static int smb_time_audit_chmod_acl(vfs_handle_struct *handle,
1653 const char *path, mode_t mode)
1655 int result;
1656 struct timespec ts1,ts2;
1657 double timediff;
1659 clock_gettime_mono(&ts1);
1660 result = SMB_VFS_NEXT_CHMOD_ACL(handle, path, mode);
1661 clock_gettime_mono(&ts2);
1662 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1664 if (timediff > audit_timeout) {
1665 smb_time_audit_log("chmod_acl", timediff);
1668 return result;
1671 static int smb_time_audit_fchmod_acl(vfs_handle_struct *handle,
1672 files_struct *fsp, mode_t mode)
1674 int result;
1675 struct timespec ts1,ts2;
1676 double timediff;
1678 clock_gettime_mono(&ts1);
1679 result = SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
1680 clock_gettime_mono(&ts2);
1681 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1683 if (timediff > audit_timeout) {
1684 smb_time_audit_log("fchmod_acl", timediff);
1687 return result;
1690 static int smb_time_audit_sys_acl_get_entry(vfs_handle_struct *handle,
1691 SMB_ACL_T theacl, int entry_id,
1692 SMB_ACL_ENTRY_T *entry_p)
1694 int result;
1695 struct timespec ts1,ts2;
1696 double timediff;
1698 clock_gettime_mono(&ts1);
1699 result = SMB_VFS_NEXT_SYS_ACL_GET_ENTRY(handle, theacl, entry_id,
1700 entry_p);
1701 clock_gettime_mono(&ts2);
1702 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1704 if (timediff > audit_timeout) {
1705 smb_time_audit_log("sys_acl_get_entry", timediff);
1708 return result;
1711 static int smb_time_audit_sys_acl_get_tag_type(vfs_handle_struct *handle,
1712 SMB_ACL_ENTRY_T entry_d,
1713 SMB_ACL_TAG_T *tag_type_p)
1715 int result;
1716 struct timespec ts1,ts2;
1717 double timediff;
1719 clock_gettime_mono(&ts1);
1720 result = SMB_VFS_NEXT_SYS_ACL_GET_TAG_TYPE(handle, entry_d,
1721 tag_type_p);
1722 clock_gettime_mono(&ts2);
1723 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1725 if (timediff > audit_timeout) {
1726 smb_time_audit_log("sys_acl_get_tag_type", timediff);
1729 return result;
1732 static int smb_time_audit_sys_acl_get_permset(vfs_handle_struct *handle,
1733 SMB_ACL_ENTRY_T entry_d,
1734 SMB_ACL_PERMSET_T *permset_p)
1736 int result;
1737 struct timespec ts1,ts2;
1738 double timediff;
1740 clock_gettime_mono(&ts1);
1741 result = SMB_VFS_NEXT_SYS_ACL_GET_PERMSET(handle, entry_d,
1742 permset_p);
1743 clock_gettime_mono(&ts2);
1744 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1746 if (timediff > audit_timeout) {
1747 smb_time_audit_log("sys_acl_get_permset", timediff);
1750 return result;
1753 static void * smb_time_audit_sys_acl_get_qualifier(vfs_handle_struct *handle,
1754 SMB_ACL_ENTRY_T entry_d)
1756 void *result;
1757 struct timespec ts1,ts2;
1758 double timediff;
1760 clock_gettime_mono(&ts1);
1761 result = SMB_VFS_NEXT_SYS_ACL_GET_QUALIFIER(handle, entry_d);
1762 clock_gettime_mono(&ts2);
1763 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1765 if (timediff > audit_timeout) {
1766 smb_time_audit_log("sys_acl_get_qualifier", timediff);
1769 return result;
1772 static SMB_ACL_T smb_time_audit_sys_acl_get_file(vfs_handle_struct *handle,
1773 const char *path_p,
1774 SMB_ACL_TYPE_T type)
1776 SMB_ACL_T result;
1777 struct timespec ts1,ts2;
1778 double timediff;
1780 clock_gettime_mono(&ts1);
1781 result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, path_p, type);
1782 clock_gettime_mono(&ts2);
1783 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1785 if (timediff > audit_timeout) {
1786 smb_time_audit_log("sys_acl_get_file", timediff);
1789 return result;
1792 static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
1793 files_struct *fsp)
1795 SMB_ACL_T result;
1796 struct timespec ts1,ts2;
1797 double timediff;
1799 clock_gettime_mono(&ts1);
1800 result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp);
1801 clock_gettime_mono(&ts2);
1802 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1804 if (timediff > audit_timeout) {
1805 smb_time_audit_log("sys_acl_get_fd", timediff);
1808 return result;
1811 static int smb_time_audit_sys_acl_clear_perms(vfs_handle_struct *handle,
1812 SMB_ACL_PERMSET_T permset)
1814 int result;
1815 struct timespec ts1,ts2;
1816 double timediff;
1818 clock_gettime_mono(&ts1);
1819 result = SMB_VFS_NEXT_SYS_ACL_CLEAR_PERMS(handle, permset);
1820 clock_gettime_mono(&ts2);
1821 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1823 if (timediff > audit_timeout) {
1824 smb_time_audit_log("sys_acl_clear_perms", timediff);
1827 return result;
1830 static int smb_time_audit_sys_acl_add_perm(vfs_handle_struct *handle,
1831 SMB_ACL_PERMSET_T permset,
1832 SMB_ACL_PERM_T perm)
1834 int result;
1835 struct timespec ts1,ts2;
1836 double timediff;
1838 clock_gettime_mono(&ts1);
1839 result = SMB_VFS_NEXT_SYS_ACL_ADD_PERM(handle, permset, perm);
1840 clock_gettime_mono(&ts2);
1841 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1843 if (timediff > audit_timeout) {
1844 smb_time_audit_log("sys_acl_add_perm", timediff);
1847 return result;
1850 static char * smb_time_audit_sys_acl_to_text(vfs_handle_struct *handle,
1851 SMB_ACL_T theacl,
1852 ssize_t *plen)
1854 char * result;
1855 struct timespec ts1,ts2;
1856 double timediff;
1858 clock_gettime_mono(&ts1);
1859 result = SMB_VFS_NEXT_SYS_ACL_TO_TEXT(handle, theacl, plen);
1860 clock_gettime_mono(&ts2);
1861 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1863 if (timediff > audit_timeout) {
1864 smb_time_audit_log("sys_acl_to_text", timediff);
1867 return result;
1870 static SMB_ACL_T smb_time_audit_sys_acl_init(vfs_handle_struct *handle,
1871 int count)
1873 SMB_ACL_T result;
1874 struct timespec ts1,ts2;
1875 double timediff;
1877 clock_gettime_mono(&ts1);
1878 result = SMB_VFS_NEXT_SYS_ACL_INIT(handle, count);
1879 clock_gettime_mono(&ts2);
1880 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1882 if (timediff > audit_timeout) {
1883 smb_time_audit_log("sys_acl_init", timediff);
1886 return result;
1889 static int smb_time_audit_sys_acl_create_entry(vfs_handle_struct *handle,
1890 SMB_ACL_T *pacl,
1891 SMB_ACL_ENTRY_T *pentry)
1893 int result;
1894 struct timespec ts1,ts2;
1895 double timediff;
1897 clock_gettime_mono(&ts1);
1898 result = SMB_VFS_NEXT_SYS_ACL_CREATE_ENTRY(handle, pacl, pentry);
1899 clock_gettime_mono(&ts2);
1900 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1902 if (timediff > audit_timeout) {
1903 smb_time_audit_log("sys_acl_create_entry", timediff);
1906 return result;
1909 static int smb_time_audit_sys_acl_set_tag_type(vfs_handle_struct *handle,
1910 SMB_ACL_ENTRY_T entry,
1911 SMB_ACL_TAG_T tagtype)
1913 int result;
1914 struct timespec ts1,ts2;
1915 double timediff;
1917 clock_gettime_mono(&ts1);
1918 result = SMB_VFS_NEXT_SYS_ACL_SET_TAG_TYPE(handle, entry,
1919 tagtype);
1920 clock_gettime_mono(&ts2);
1921 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1923 if (timediff > audit_timeout) {
1924 smb_time_audit_log("sys_acl_set_tag_type", timediff);
1927 return result;
1930 static int smb_time_audit_sys_acl_set_qualifier(vfs_handle_struct *handle,
1931 SMB_ACL_ENTRY_T entry,
1932 void *qual)
1934 int result;
1935 struct timespec ts1,ts2;
1936 double timediff;
1938 clock_gettime_mono(&ts1);
1939 result = SMB_VFS_NEXT_SYS_ACL_SET_QUALIFIER(handle, entry, qual);
1940 clock_gettime_mono(&ts2);
1941 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1943 if (timediff > audit_timeout) {
1944 smb_time_audit_log("sys_acl_set_qualifier", timediff);
1947 return result;
1950 static int smb_time_audit_sys_acl_set_permset(vfs_handle_struct *handle,
1951 SMB_ACL_ENTRY_T entry,
1952 SMB_ACL_PERMSET_T permset)
1954 int result;
1955 struct timespec ts1,ts2;
1956 double timediff;
1958 clock_gettime_mono(&ts1);
1959 result = SMB_VFS_NEXT_SYS_ACL_SET_PERMSET(handle, entry, permset);
1960 clock_gettime_mono(&ts2);
1961 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1963 if (timediff > audit_timeout) {
1964 smb_time_audit_log("sys_acl_set_permset", timediff);
1967 return result;
1970 static int smb_time_audit_sys_acl_valid(vfs_handle_struct *handle,
1971 SMB_ACL_T theacl)
1973 int result;
1974 struct timespec ts1,ts2;
1975 double timediff;
1977 clock_gettime_mono(&ts1);
1978 result = SMB_VFS_NEXT_SYS_ACL_VALID(handle, theacl);
1979 clock_gettime_mono(&ts2);
1980 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1982 if (timediff > audit_timeout) {
1983 smb_time_audit_log("sys_acl_valid", timediff);
1986 return result;
1989 static int smb_time_audit_sys_acl_set_file(vfs_handle_struct *handle,
1990 const char *name,
1991 SMB_ACL_TYPE_T acltype,
1992 SMB_ACL_T theacl)
1994 int result;
1995 struct timespec ts1,ts2;
1996 double timediff;
1998 clock_gettime_mono(&ts1);
1999 result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, name, acltype,
2000 theacl);
2001 clock_gettime_mono(&ts2);
2002 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2004 if (timediff > audit_timeout) {
2005 smb_time_audit_log("sys_acl_set_file", timediff);
2008 return result;
2011 static int smb_time_audit_sys_acl_set_fd(vfs_handle_struct *handle,
2012 files_struct *fsp,
2013 SMB_ACL_T theacl)
2015 int result;
2016 struct timespec ts1,ts2;
2017 double timediff;
2019 clock_gettime_mono(&ts1);
2020 result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, theacl);
2021 clock_gettime_mono(&ts2);
2022 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2024 if (timediff > audit_timeout) {
2025 smb_time_audit_log("sys_acl_set_fd", timediff);
2028 return result;
2031 static int smb_time_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
2032 const char *path)
2034 int result;
2035 struct timespec ts1,ts2;
2036 double timediff;
2038 clock_gettime_mono(&ts1);
2039 result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, path);
2040 clock_gettime_mono(&ts2);
2041 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2043 if (timediff > audit_timeout) {
2044 smb_time_audit_log("sys_acl_delete_def_file", timediff);
2047 return result;
2050 static int smb_time_audit_sys_acl_get_perm(vfs_handle_struct *handle,
2051 SMB_ACL_PERMSET_T permset,
2052 SMB_ACL_PERM_T perm)
2054 int result;
2055 struct timespec ts1,ts2;
2056 double timediff;
2058 clock_gettime_mono(&ts1);
2059 result = SMB_VFS_NEXT_SYS_ACL_GET_PERM(handle, permset, perm);
2060 clock_gettime_mono(&ts2);
2061 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2063 if (timediff > audit_timeout) {
2064 smb_time_audit_log("sys_acl_get_perm", timediff);
2067 return result;
2070 static int smb_time_audit_sys_acl_free_text(vfs_handle_struct *handle,
2071 char *text)
2073 int result;
2074 struct timespec ts1,ts2;
2075 double timediff;
2077 clock_gettime_mono(&ts1);
2078 result = SMB_VFS_NEXT_SYS_ACL_FREE_TEXT(handle, text);
2079 clock_gettime_mono(&ts2);
2080 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2082 if (timediff > audit_timeout) {
2083 smb_time_audit_log("sys_acl_free_text", timediff);
2086 return result;
2089 static int smb_time_audit_sys_acl_free_acl(vfs_handle_struct *handle,
2090 SMB_ACL_T posix_acl)
2092 int result;
2093 struct timespec ts1,ts2;
2094 double timediff;
2096 clock_gettime_mono(&ts1);
2097 result = SMB_VFS_NEXT_SYS_ACL_FREE_ACL(handle, posix_acl);
2098 clock_gettime_mono(&ts2);
2099 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2101 if (timediff > audit_timeout) {
2102 smb_time_audit_log("sys_acl_free_acl", timediff);
2105 return result;
2108 static int smb_time_audit_sys_acl_free_qualifier(vfs_handle_struct *handle,
2109 void *qualifier,
2110 SMB_ACL_TAG_T tagtype)
2112 int result;
2113 struct timespec ts1,ts2;
2114 double timediff;
2116 clock_gettime_mono(&ts1);
2117 result = SMB_VFS_NEXT_SYS_ACL_FREE_QUALIFIER(handle, qualifier,
2118 tagtype);
2119 clock_gettime_mono(&ts2);
2120 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2122 if (timediff > audit_timeout) {
2123 smb_time_audit_log("sys_acl_free_qualifier", timediff);
2126 return result;
2129 static ssize_t smb_time_audit_getxattr(struct vfs_handle_struct *handle,
2130 const char *path, const char *name,
2131 void *value, size_t size)
2133 ssize_t result;
2134 struct timespec ts1,ts2;
2135 double timediff;
2137 clock_gettime_mono(&ts1);
2138 result = SMB_VFS_NEXT_GETXATTR(handle, path, name, value, size);
2139 clock_gettime_mono(&ts2);
2140 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2142 if (timediff > audit_timeout) {
2143 smb_time_audit_log("getxattr", timediff);
2146 return result;
2149 static ssize_t smb_time_audit_fgetxattr(struct vfs_handle_struct *handle,
2150 struct files_struct *fsp,
2151 const char *name, void *value,
2152 size_t size)
2154 ssize_t result;
2155 struct timespec ts1,ts2;
2156 double timediff;
2158 clock_gettime_mono(&ts1);
2159 result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
2160 clock_gettime_mono(&ts2);
2161 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2163 if (timediff > audit_timeout) {
2164 smb_time_audit_log("fgetxattr", timediff);
2167 return result;
2170 static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle,
2171 const char *path, char *list,
2172 size_t size)
2174 ssize_t result;
2175 struct timespec ts1,ts2;
2176 double timediff;
2178 clock_gettime_mono(&ts1);
2179 result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
2180 clock_gettime_mono(&ts2);
2181 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2183 if (timediff > audit_timeout) {
2184 smb_time_audit_log("listxattr", timediff);
2187 return result;
2190 static ssize_t smb_time_audit_flistxattr(struct vfs_handle_struct *handle,
2191 struct files_struct *fsp, char *list,
2192 size_t size)
2194 ssize_t result;
2195 struct timespec ts1,ts2;
2196 double timediff;
2198 clock_gettime_mono(&ts1);
2199 result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, list, size);
2200 clock_gettime_mono(&ts2);
2201 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2203 if (timediff > audit_timeout) {
2204 smb_time_audit_log("flistxattr", timediff);
2207 return result;
2210 static int smb_time_audit_removexattr(struct vfs_handle_struct *handle,
2211 const char *path, const char *name)
2213 int result;
2214 struct timespec ts1,ts2;
2215 double timediff;
2217 clock_gettime_mono(&ts1);
2218 result = SMB_VFS_NEXT_REMOVEXATTR(handle, path, name);
2219 clock_gettime_mono(&ts2);
2220 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2222 if (timediff > audit_timeout) {
2223 smb_time_audit_log("removexattr", timediff);
2226 return result;
2229 static int smb_time_audit_fremovexattr(struct vfs_handle_struct *handle,
2230 struct files_struct *fsp,
2231 const char *name)
2233 int result;
2234 struct timespec ts1,ts2;
2235 double timediff;
2237 clock_gettime_mono(&ts1);
2238 result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, name);
2239 clock_gettime_mono(&ts2);
2240 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2242 if (timediff > audit_timeout) {
2243 smb_time_audit_log("fremovexattr", timediff);
2246 return result;
2249 static int smb_time_audit_setxattr(struct vfs_handle_struct *handle,
2250 const char *path, const char *name,
2251 const void *value, size_t size,
2252 int flags)
2254 int result;
2255 struct timespec ts1,ts2;
2256 double timediff;
2258 clock_gettime_mono(&ts1);
2259 result = SMB_VFS_NEXT_SETXATTR(handle, path, name, value, size,
2260 flags);
2261 clock_gettime_mono(&ts2);
2262 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2264 if (timediff > audit_timeout) {
2265 smb_time_audit_log("setxattr", timediff);
2268 return result;
2271 static int smb_time_audit_fsetxattr(struct vfs_handle_struct *handle,
2272 struct files_struct *fsp, const char *name,
2273 const void *value, size_t size, int flags)
2275 int result;
2276 struct timespec ts1,ts2;
2277 double timediff;
2279 clock_gettime_mono(&ts1);
2280 result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, name, value, size, flags);
2281 clock_gettime_mono(&ts2);
2282 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2284 if (timediff > audit_timeout) {
2285 smb_time_audit_log("fsetxattr", timediff);
2288 return result;
2291 static bool smb_time_audit_aio_force(struct vfs_handle_struct *handle,
2292 struct files_struct *fsp)
2294 bool result;
2295 struct timespec ts1,ts2;
2296 double timediff;
2298 clock_gettime_mono(&ts1);
2299 result = SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
2300 clock_gettime_mono(&ts2);
2301 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2303 if (timediff > audit_timeout) {
2304 smb_time_audit_log("aio_force", timediff);
2307 return result;
2312 /* VFS operations */
2314 static struct vfs_fn_pointers vfs_time_audit_fns = {
2315 .connect_fn = smb_time_audit_connect,
2316 .disconnect_fn = smb_time_audit_disconnect,
2317 .disk_free_fn = smb_time_audit_disk_free,
2318 .get_quota_fn = smb_time_audit_get_quota,
2319 .set_quota_fn = smb_time_audit_set_quota,
2320 .get_shadow_copy_data_fn = smb_time_audit_get_shadow_copy_data,
2321 .statvfs_fn = smb_time_audit_statvfs,
2322 .fs_capabilities_fn = smb_time_audit_fs_capabilities,
2323 .opendir_fn = smb_time_audit_opendir,
2324 .fdopendir_fn = smb_time_audit_fdopendir,
2325 .readdir_fn = smb_time_audit_readdir,
2326 .seekdir_fn = smb_time_audit_seekdir,
2327 .telldir_fn = smb_time_audit_telldir,
2328 .rewind_dir_fn = smb_time_audit_rewinddir,
2329 .mkdir_fn = smb_time_audit_mkdir,
2330 .rmdir_fn = smb_time_audit_rmdir,
2331 .closedir_fn = smb_time_audit_closedir,
2332 .init_search_op_fn = smb_time_audit_init_search_op,
2333 .open_fn = smb_time_audit_open,
2334 .create_file_fn = smb_time_audit_create_file,
2335 .close_fn = smb_time_audit_close,
2336 .read_fn = smb_time_audit_read,
2337 .pread_fn = smb_time_audit_pread,
2338 .pread_send_fn = smb_time_audit_pread_send,
2339 .pread_recv_fn = smb_time_audit_pread_recv,
2340 .write_fn = smb_time_audit_write,
2341 .pwrite_fn = smb_time_audit_pwrite,
2342 .pwrite_send_fn = smb_time_audit_pwrite_send,
2343 .pwrite_recv_fn = smb_time_audit_pwrite_recv,
2344 .lseek_fn = smb_time_audit_lseek,
2345 .sendfile_fn = smb_time_audit_sendfile,
2346 .recvfile_fn = smb_time_audit_recvfile,
2347 .rename_fn = smb_time_audit_rename,
2348 .fsync_fn = smb_time_audit_fsync,
2349 .fsync_send_fn = smb_time_audit_fsync_send,
2350 .fsync_recv_fn = smb_time_audit_fsync_recv,
2351 .stat_fn = smb_time_audit_stat,
2352 .fstat_fn = smb_time_audit_fstat,
2353 .lstat_fn = smb_time_audit_lstat,
2354 .get_alloc_size_fn = smb_time_audit_get_alloc_size,
2355 .unlink_fn = smb_time_audit_unlink,
2356 .chmod_fn = smb_time_audit_chmod,
2357 .fchmod_fn = smb_time_audit_fchmod,
2358 .chown_fn = smb_time_audit_chown,
2359 .fchown_fn = smb_time_audit_fchown,
2360 .lchown_fn = smb_time_audit_lchown,
2361 .chdir_fn = smb_time_audit_chdir,
2362 .getwd_fn = smb_time_audit_getwd,
2363 .ntimes_fn = smb_time_audit_ntimes,
2364 .ftruncate_fn = smb_time_audit_ftruncate,
2365 .fallocate_fn = smb_time_audit_fallocate,
2366 .lock_fn = smb_time_audit_lock,
2367 .kernel_flock_fn = smb_time_audit_kernel_flock,
2368 .linux_setlease_fn = smb_time_audit_linux_setlease,
2369 .getlock_fn = smb_time_audit_getlock,
2370 .symlink_fn = smb_time_audit_symlink,
2371 .readlink_fn = smb_time_audit_readlink,
2372 .link_fn = smb_time_audit_link,
2373 .mknod_fn = smb_time_audit_mknod,
2374 .realpath_fn = smb_time_audit_realpath,
2375 .notify_watch_fn = smb_time_audit_notify_watch,
2376 .chflags_fn = smb_time_audit_chflags,
2377 .file_id_create_fn = smb_time_audit_file_id_create,
2378 .streaminfo_fn = smb_time_audit_streaminfo,
2379 .get_real_filename_fn = smb_time_audit_get_real_filename,
2380 .connectpath_fn = smb_time_audit_connectpath,
2381 .brl_lock_windows_fn = smb_time_audit_brl_lock_windows,
2382 .brl_unlock_windows_fn = smb_time_audit_brl_unlock_windows,
2383 .brl_cancel_windows_fn = smb_time_audit_brl_cancel_windows,
2384 .strict_lock_fn = smb_time_audit_strict_lock,
2385 .strict_unlock_fn = smb_time_audit_strict_unlock,
2386 .translate_name_fn = smb_time_audit_translate_name,
2387 .fget_nt_acl_fn = smb_time_audit_fget_nt_acl,
2388 .get_nt_acl_fn = smb_time_audit_get_nt_acl,
2389 .fset_nt_acl_fn = smb_time_audit_fset_nt_acl,
2390 .chmod_acl_fn = smb_time_audit_chmod_acl,
2391 .fchmod_acl_fn = smb_time_audit_fchmod_acl,
2392 .sys_acl_get_entry_fn = smb_time_audit_sys_acl_get_entry,
2393 .sys_acl_get_tag_type_fn = smb_time_audit_sys_acl_get_tag_type,
2394 .sys_acl_get_permset_fn = smb_time_audit_sys_acl_get_permset,
2395 .sys_acl_get_qualifier_fn = smb_time_audit_sys_acl_get_qualifier,
2396 .sys_acl_get_file_fn = smb_time_audit_sys_acl_get_file,
2397 .sys_acl_get_fd_fn = smb_time_audit_sys_acl_get_fd,
2398 .sys_acl_clear_perms_fn = smb_time_audit_sys_acl_clear_perms,
2399 .sys_acl_add_perm_fn = smb_time_audit_sys_acl_add_perm,
2400 .sys_acl_to_text_fn = smb_time_audit_sys_acl_to_text,
2401 .sys_acl_init_fn = smb_time_audit_sys_acl_init,
2402 .sys_acl_create_entry_fn = smb_time_audit_sys_acl_create_entry,
2403 .sys_acl_set_tag_type_fn = smb_time_audit_sys_acl_set_tag_type,
2404 .sys_acl_set_qualifier_fn = smb_time_audit_sys_acl_set_qualifier,
2405 .sys_acl_set_permset_fn = smb_time_audit_sys_acl_set_permset,
2406 .sys_acl_valid_fn = smb_time_audit_sys_acl_valid,
2407 .sys_acl_set_file_fn = smb_time_audit_sys_acl_set_file,
2408 .sys_acl_set_fd_fn = smb_time_audit_sys_acl_set_fd,
2409 .sys_acl_delete_def_file_fn = smb_time_audit_sys_acl_delete_def_file,
2410 .sys_acl_get_perm_fn = smb_time_audit_sys_acl_get_perm,
2411 .sys_acl_free_text_fn = smb_time_audit_sys_acl_free_text,
2412 .sys_acl_free_acl_fn = smb_time_audit_sys_acl_free_acl,
2413 .sys_acl_free_qualifier_fn = smb_time_audit_sys_acl_free_qualifier,
2414 .getxattr_fn = smb_time_audit_getxattr,
2415 .fgetxattr_fn = smb_time_audit_fgetxattr,
2416 .listxattr_fn = smb_time_audit_listxattr,
2417 .flistxattr_fn = smb_time_audit_flistxattr,
2418 .removexattr_fn = smb_time_audit_removexattr,
2419 .fremovexattr_fn = smb_time_audit_fremovexattr,
2420 .setxattr_fn = smb_time_audit_setxattr,
2421 .fsetxattr_fn = smb_time_audit_fsetxattr,
2422 .aio_force_fn = smb_time_audit_aio_force,
2426 NTSTATUS vfs_time_audit_init(void);
2427 NTSTATUS vfs_time_audit_init(void)
2429 audit_timeout = (double)lp_parm_int(-1, "time_audit", "timeout",
2430 10000) / 1000.0;
2431 return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "time_audit",
2432 &vfs_time_audit_fns);