2 * Time auditing VFS module for samba. Log time taken for VFS call to syslog
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
29 #include "smbd/smbd.h"
31 #include "lib/util/tevent_unix.h"
32 #include "lib/util/tevent_ntstatus.h"
35 #define DBGC_CLASS DBGC_VFS
37 static double audit_timeout;
39 static void smb_time_audit_log_msg(const char *syscallname, double elapsed,
42 DEBUG(0, ("WARNING: VFS call \"%s\" took unexpectedly long "
43 "(%.2f seconds) %s%s-- Validate that file and storage "
44 "subsystems are operating normally\n", syscallname,
45 elapsed, (msg != NULL) ? msg : "",
46 (msg != NULL) ? " " : ""));
49 static void smb_time_audit_log(const char *syscallname, double elapsed)
51 smb_time_audit_log_msg(syscallname, elapsed, NULL);
54 static void smb_time_audit_log_fsp(const char *syscallname, double elapsed,
55 const struct files_struct *fsp)
57 char *base_name = NULL;
58 char *connectpath = NULL;
62 smb_time_audit_log(syscallname, elapsed);
66 connectpath = fsp->conn->connectpath;
68 base_name = fsp->fsp_name->base_name;
70 if (connectpath != NULL && base_name != NULL) {
71 msg = talloc_asprintf(talloc_tos(), "filename = \"%s/%s\"",
72 connectpath, base_name);
73 } else if (connectpath != NULL && base_name == NULL) {
74 msg = talloc_asprintf(talloc_tos(), "connectpath = \"%s\", "
77 } else if (connectpath == NULL && base_name != NULL) {
78 msg = talloc_asprintf(talloc_tos(), "connectpath = <NULL>, "
81 } else { /* connectpath == NULL && base_name == NULL */
82 msg = talloc_asprintf(talloc_tos(), "connectpath = <NULL>, "
83 "base_name = <NULL>");
85 smb_time_audit_log_msg(syscallname, elapsed, msg);
89 static void smb_time_audit_log_fname(const char *syscallname, double elapsed,
95 if (getcwd(cwd, sizeof(cwd)) == NULL) {
96 snprintf(cwd, sizeof(cwd), "<getcwd() error %d>", errno);
99 msg = talloc_asprintf(talloc_tos(),
100 "cwd = \"%s\", filename = \"%s\"",
103 msg = talloc_asprintf(talloc_tos(),
104 "cwd = \"%s\", filename = <NULL>",
107 smb_time_audit_log_msg(syscallname, elapsed, msg);
111 static void smb_time_audit_log_smb_fname(const char *syscallname, double elapsed,
112 const struct smb_filename *smb_fname)
114 if (smb_fname != NULL) {
115 smb_time_audit_log_fname(syscallname, elapsed,
116 smb_fname->base_name);
118 smb_time_audit_log_fname(syscallname, elapsed,
119 "smb_fname = <NULL>");
123 static int smb_time_audit_connect(vfs_handle_struct *handle,
124 const char *svc, const char *user)
127 struct timespec ts1,ts2;
134 clock_gettime_mono(&ts1);
135 result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
136 clock_gettime_mono(&ts2);
137 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
138 if (timediff > audit_timeout) {
139 smb_time_audit_log_msg("connect", timediff, user);
144 static void smb_time_audit_disconnect(vfs_handle_struct *handle)
146 struct timespec ts1,ts2;
149 clock_gettime_mono(&ts1);
150 SMB_VFS_NEXT_DISCONNECT(handle);
151 clock_gettime_mono(&ts2);
152 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
154 if (timediff > audit_timeout) {
155 smb_time_audit_log("disconnect", timediff);
159 static uint64_t smb_time_audit_disk_free(vfs_handle_struct *handle,
161 bool small_query, uint64_t *bsize,
162 uint64_t *dfree, uint64_t *dsize)
165 struct timespec ts1,ts2;
168 clock_gettime_mono(&ts1);
169 result = SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize,
171 clock_gettime_mono(&ts2);
172 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
174 /* Don't have a reasonable notion of failure here */
175 if (timediff > audit_timeout) {
176 smb_time_audit_log_fname("disk_free", timediff, path);
182 static int smb_time_audit_get_quota(struct vfs_handle_struct *handle,
183 enum SMB_QUOTA_TYPE qtype, unid_t id,
187 struct timespec ts1,ts2;
190 clock_gettime_mono(&ts1);
191 result = SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, qt);
192 clock_gettime_mono(&ts2);
193 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
195 if (timediff > audit_timeout) {
196 smb_time_audit_log("get_quota", timediff);
201 static int smb_time_audit_set_quota(struct vfs_handle_struct *handle,
202 enum SMB_QUOTA_TYPE qtype, unid_t id,
206 struct timespec ts1,ts2;
209 clock_gettime_mono(&ts1);
210 result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
211 clock_gettime_mono(&ts2);
212 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
214 if (timediff > audit_timeout) {
215 smb_time_audit_log("set_quota", timediff);
221 static int smb_time_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
222 struct files_struct *fsp,
223 struct shadow_copy_data *shadow_copy_data,
227 struct timespec ts1,ts2;
230 clock_gettime_mono(&ts1);
231 result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp,
232 shadow_copy_data, labels);
233 clock_gettime_mono(&ts2);
234 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
236 if (timediff > audit_timeout) {
237 smb_time_audit_log_fsp("get_shadow_copy_data", timediff, fsp);
243 static int smb_time_audit_statvfs(struct vfs_handle_struct *handle,
245 struct vfs_statvfs_struct *statbuf)
248 struct timespec ts1,ts2;
251 clock_gettime_mono(&ts1);
252 result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
253 clock_gettime_mono(&ts2);
254 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
256 if (timediff > audit_timeout) {
257 smb_time_audit_log_fname("statvfs", timediff, path);
263 static uint32_t smb_time_audit_fs_capabilities(struct vfs_handle_struct *handle,
264 enum timestamp_set_resolution *p_ts_res)
267 struct timespec ts1,ts2;
270 clock_gettime_mono(&ts1);
271 result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
272 clock_gettime_mono(&ts2);
273 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
275 if (timediff > audit_timeout) {
276 smb_time_audit_log("fs_capabilities", timediff);
282 static DIR *smb_time_audit_opendir(vfs_handle_struct *handle,
284 const char *mask, uint32 attr)
287 struct timespec ts1,ts2;
290 clock_gettime_mono(&ts1);
291 result = SMB_VFS_NEXT_OPENDIR(handle, fname, mask, attr);
292 clock_gettime_mono(&ts2);
293 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
295 if (timediff > audit_timeout) {
296 smb_time_audit_log_fname("opendir", timediff, fname);
302 static DIR *smb_time_audit_fdopendir(vfs_handle_struct *handle,
304 const char *mask, uint32 attr)
307 struct timespec ts1,ts2;
310 clock_gettime_mono(&ts1);
311 result = SMB_VFS_NEXT_FDOPENDIR(handle, fsp, mask, attr);
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_fsp("fdopendir", timediff, fsp);
322 static struct dirent *smb_time_audit_readdir(vfs_handle_struct *handle,
324 SMB_STRUCT_STAT *sbuf)
326 struct dirent *result;
327 struct timespec ts1,ts2;
330 clock_gettime_mono(&ts1);
331 result = SMB_VFS_NEXT_READDIR(handle, dirp, sbuf);
332 clock_gettime_mono(&ts2);
333 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
335 if (timediff > audit_timeout) {
336 smb_time_audit_log("readdir", timediff);
342 static void smb_time_audit_seekdir(vfs_handle_struct *handle,
343 DIR *dirp, long offset)
345 struct timespec ts1,ts2;
348 clock_gettime_mono(&ts1);
349 SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
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("seekdir", timediff);
359 static long smb_time_audit_telldir(vfs_handle_struct *handle,
363 struct timespec ts1,ts2;
366 clock_gettime_mono(&ts1);
367 result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
368 clock_gettime_mono(&ts2);
369 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
371 if (timediff > audit_timeout) {
372 smb_time_audit_log("telldir", timediff);
378 static void smb_time_audit_rewinddir(vfs_handle_struct *handle,
381 struct timespec ts1,ts2;
384 clock_gettime_mono(&ts1);
385 SMB_VFS_NEXT_REWINDDIR(handle, dirp);
386 clock_gettime_mono(&ts2);
387 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
389 if (timediff > audit_timeout) {
390 smb_time_audit_log("rewinddir", timediff);
395 static int smb_time_audit_mkdir(vfs_handle_struct *handle,
396 const char *path, mode_t mode)
399 struct timespec ts1,ts2;
402 clock_gettime_mono(&ts1);
403 result = SMB_VFS_NEXT_MKDIR(handle, path, mode);
404 clock_gettime_mono(&ts2);
405 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
407 if (timediff > audit_timeout) {
408 smb_time_audit_log_fname("mkdir", timediff, path);
414 static int smb_time_audit_rmdir(vfs_handle_struct *handle,
418 struct timespec ts1,ts2;
421 clock_gettime_mono(&ts1);
422 result = SMB_VFS_NEXT_RMDIR(handle, path);
423 clock_gettime_mono(&ts2);
424 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
426 if (timediff > audit_timeout) {
427 smb_time_audit_log_fname("rmdir", timediff, path);
433 static int smb_time_audit_closedir(vfs_handle_struct *handle,
437 struct timespec ts1,ts2;
440 clock_gettime_mono(&ts1);
441 result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
442 clock_gettime_mono(&ts2);
443 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
445 if (timediff > audit_timeout) {
446 smb_time_audit_log("closedir", timediff);
452 static void smb_time_audit_init_search_op(vfs_handle_struct *handle,
455 struct timespec ts1,ts2;
458 clock_gettime_mono(&ts1);
459 SMB_VFS_NEXT_INIT_SEARCH_OP(handle, dirp);
460 clock_gettime_mono(&ts2);
461 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
463 if (timediff > audit_timeout) {
464 smb_time_audit_log("init_search_op", timediff);
468 static int smb_time_audit_open(vfs_handle_struct *handle,
469 struct smb_filename *fname,
471 int flags, mode_t mode)
474 struct timespec ts1,ts2;
477 clock_gettime_mono(&ts1);
478 result = SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode);
479 clock_gettime_mono(&ts2);
480 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
482 if (timediff > audit_timeout) {
483 smb_time_audit_log_fsp("open", timediff, fsp);
489 static NTSTATUS smb_time_audit_create_file(vfs_handle_struct *handle,
490 struct smb_request *req,
491 uint16_t root_dir_fid,
492 struct smb_filename *fname,
493 uint32_t access_mask,
494 uint32_t share_access,
495 uint32_t create_disposition,
496 uint32_t create_options,
497 uint32_t file_attributes,
498 uint32_t oplock_request,
499 struct smb2_lease *lease,
500 uint64_t allocation_size,
501 uint32_t private_flags,
502 struct security_descriptor *sd,
503 struct ea_list *ea_list,
504 files_struct **result_fsp,
506 const struct smb2_create_blobs *in_context_blobs,
507 struct smb2_create_blobs *out_context_blobs)
510 struct timespec ts1,ts2;
513 clock_gettime_mono(&ts1);
514 result = SMB_VFS_NEXT_CREATE_FILE(
517 root_dir_fid, /* root_dir_fid */
519 access_mask, /* access_mask */
520 share_access, /* share_access */
521 create_disposition, /* create_disposition*/
522 create_options, /* create_options */
523 file_attributes, /* file_attributes */
524 oplock_request, /* oplock_request */
526 allocation_size, /* allocation_size */
529 ea_list, /* ea_list */
530 result_fsp, /* result */
532 in_context_blobs, out_context_blobs); /* create context */
533 clock_gettime_mono(&ts2);
534 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
536 if (timediff > audit_timeout) {
538 * can't use result_fsp this time, may have
539 * invalid content causing smbd crash
541 smb_time_audit_log_smb_fname("create_file", timediff,
548 static int smb_time_audit_close(vfs_handle_struct *handle, files_struct *fsp)
551 struct timespec ts1,ts2;
554 clock_gettime_mono(&ts1);
555 result = SMB_VFS_NEXT_CLOSE(handle, fsp);
556 clock_gettime_mono(&ts2);
557 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
559 if (timediff > audit_timeout) {
560 smb_time_audit_log_fsp("close", timediff, fsp);
566 static ssize_t smb_time_audit_read(vfs_handle_struct *handle,
567 files_struct *fsp, void *data, size_t n)
570 struct timespec ts1,ts2;
573 clock_gettime_mono(&ts1);
574 result = SMB_VFS_NEXT_READ(handle, fsp, data, n);
575 clock_gettime_mono(&ts2);
576 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
578 if (timediff > audit_timeout) {
579 smb_time_audit_log_fsp("read", timediff, fsp);
585 static ssize_t smb_time_audit_pread(vfs_handle_struct *handle,
587 void *data, size_t n, off_t offset)
590 struct timespec ts1,ts2;
593 clock_gettime_mono(&ts1);
594 result = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
595 clock_gettime_mono(&ts2);
596 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
598 if (timediff > audit_timeout) {
599 smb_time_audit_log_fsp("pread", timediff, fsp);
605 struct smb_time_audit_pread_state {
606 struct files_struct *fsp;
612 static void smb_time_audit_pread_done(struct tevent_req *subreq);
614 static struct tevent_req *smb_time_audit_pread_send(
615 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
616 struct tevent_context *ev, struct files_struct *fsp,
617 void *data, size_t n, off_t offset)
619 struct tevent_req *req, *subreq;
620 struct smb_time_audit_pread_state *state;
622 req = tevent_req_create(mem_ctx, &state,
623 struct smb_time_audit_pread_state);
627 clock_gettime_mono(&state->ts1);
630 subreq = SMB_VFS_NEXT_PREAD_SEND(state, ev, handle, fsp, data,
632 if (tevent_req_nomem(subreq, req)) {
633 return tevent_req_post(req, ev);
635 tevent_req_set_callback(subreq, smb_time_audit_pread_done, req);
639 static void smb_time_audit_pread_done(struct tevent_req *subreq)
641 struct tevent_req *req = tevent_req_callback_data(
642 subreq, struct tevent_req);
643 struct smb_time_audit_pread_state *state = tevent_req_data(
644 req, struct smb_time_audit_pread_state);
646 state->ret = SMB_VFS_PREAD_RECV(subreq, &state->err);
648 tevent_req_done(req);
651 static ssize_t smb_time_audit_pread_recv(struct tevent_req *req, int *err)
653 struct smb_time_audit_pread_state *state = tevent_req_data(
654 req, struct smb_time_audit_pread_state);
658 clock_gettime_mono(&ts2);
659 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
661 if (timediff > audit_timeout) {
662 smb_time_audit_log_fsp("pread", timediff, state->fsp);
665 if (tevent_req_is_unix_error(req, err)) {
672 static ssize_t smb_time_audit_write(vfs_handle_struct *handle,
674 const void *data, size_t n)
677 struct timespec ts1,ts2;
680 clock_gettime_mono(&ts1);
681 result = SMB_VFS_NEXT_WRITE(handle, fsp, data, n);
682 clock_gettime_mono(&ts2);
683 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
685 if (timediff > audit_timeout) {
686 smb_time_audit_log_fsp("write", timediff, fsp);
692 static ssize_t smb_time_audit_pwrite(vfs_handle_struct *handle,
694 const void *data, size_t n,
698 struct timespec ts1,ts2;
701 clock_gettime_mono(&ts1);
702 result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
703 clock_gettime_mono(&ts2);
704 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
706 if (timediff > audit_timeout) {
707 smb_time_audit_log_fsp("pwrite", timediff, fsp);
713 struct smb_time_audit_pwrite_state {
714 struct files_struct *fsp;
720 static void smb_time_audit_pwrite_done(struct tevent_req *subreq);
722 static struct tevent_req *smb_time_audit_pwrite_send(
723 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
724 struct tevent_context *ev, struct files_struct *fsp,
725 const void *data, size_t n, off_t offset)
727 struct tevent_req *req, *subreq;
728 struct smb_time_audit_pwrite_state *state;
730 req = tevent_req_create(mem_ctx, &state,
731 struct smb_time_audit_pwrite_state);
735 clock_gettime_mono(&state->ts1);
738 subreq = SMB_VFS_NEXT_PWRITE_SEND(state, ev, handle, fsp, data,
740 if (tevent_req_nomem(subreq, req)) {
741 return tevent_req_post(req, ev);
743 tevent_req_set_callback(subreq, smb_time_audit_pwrite_done, req);
747 static void smb_time_audit_pwrite_done(struct tevent_req *subreq)
749 struct tevent_req *req = tevent_req_callback_data(
750 subreq, struct tevent_req);
751 struct smb_time_audit_pwrite_state *state = tevent_req_data(
752 req, struct smb_time_audit_pwrite_state);
754 state->ret = SMB_VFS_PWRITE_RECV(subreq, &state->err);
756 tevent_req_done(req);
759 static ssize_t smb_time_audit_pwrite_recv(struct tevent_req *req, int *err)
761 struct smb_time_audit_pwrite_state *state = tevent_req_data(
762 req, struct smb_time_audit_pwrite_state);
766 clock_gettime_mono(&ts2);
767 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
769 if (timediff > audit_timeout) {
770 smb_time_audit_log_fsp("pwrite", timediff, state->fsp);
773 if (tevent_req_is_unix_error(req, err)) {
780 static off_t smb_time_audit_lseek(vfs_handle_struct *handle,
782 off_t offset, int whence)
785 struct timespec ts1,ts2;
788 clock_gettime_mono(&ts1);
789 result = SMB_VFS_NEXT_LSEEK(handle, fsp, offset, whence);
790 clock_gettime_mono(&ts2);
791 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
793 if (timediff > audit_timeout) {
794 smb_time_audit_log_fsp("lseek", timediff, fsp);
800 static ssize_t smb_time_audit_sendfile(vfs_handle_struct *handle, int tofd,
801 files_struct *fromfsp,
802 const DATA_BLOB *hdr, off_t offset,
806 struct timespec ts1,ts2;
809 clock_gettime_mono(&ts1);
810 result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fromfsp, hdr, offset, n);
811 clock_gettime_mono(&ts2);
812 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
814 if (timediff > audit_timeout) {
815 smb_time_audit_log_fsp("sendfile", timediff, fromfsp);
821 static ssize_t smb_time_audit_recvfile(vfs_handle_struct *handle, int fromfd,
827 struct timespec ts1,ts2;
830 clock_gettime_mono(&ts1);
831 result = SMB_VFS_NEXT_RECVFILE(handle, fromfd, tofsp, offset, n);
832 clock_gettime_mono(&ts2);
833 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
835 if (timediff > audit_timeout) {
836 smb_time_audit_log_fsp("recvfile", timediff, tofsp);
842 static int smb_time_audit_rename(vfs_handle_struct *handle,
843 const struct smb_filename *oldname,
844 const struct smb_filename *newname)
847 struct timespec ts1,ts2;
850 clock_gettime_mono(&ts1);
851 result = SMB_VFS_NEXT_RENAME(handle, oldname, newname);
852 clock_gettime_mono(&ts2);
853 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
855 if (timediff > audit_timeout) {
856 smb_time_audit_log_smb_fname("rename", timediff, newname);
862 static int smb_time_audit_fsync(vfs_handle_struct *handle, files_struct *fsp)
865 struct timespec ts1,ts2;
868 clock_gettime_mono(&ts1);
869 result = SMB_VFS_NEXT_FSYNC(handle, fsp);
870 clock_gettime_mono(&ts2);
871 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
873 if (timediff > audit_timeout) {
874 smb_time_audit_log_fsp("fsync", timediff, fsp);
880 struct smb_time_audit_fsync_state {
881 struct files_struct *fsp;
887 static void smb_time_audit_fsync_done(struct tevent_req *subreq);
889 static struct tevent_req *smb_time_audit_fsync_send(
890 struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
891 struct tevent_context *ev, struct files_struct *fsp)
893 struct tevent_req *req, *subreq;
894 struct smb_time_audit_fsync_state *state;
896 req = tevent_req_create(mem_ctx, &state,
897 struct smb_time_audit_fsync_state);
901 clock_gettime_mono(&state->ts1);
904 subreq = SMB_VFS_NEXT_FSYNC_SEND(state, ev, handle, fsp);
905 if (tevent_req_nomem(subreq, req)) {
906 return tevent_req_post(req, ev);
908 tevent_req_set_callback(subreq, smb_time_audit_fsync_done, req);
912 static void smb_time_audit_fsync_done(struct tevent_req *subreq)
914 struct tevent_req *req = tevent_req_callback_data(
915 subreq, struct tevent_req);
916 struct smb_time_audit_fsync_state *state = tevent_req_data(
917 req, struct smb_time_audit_fsync_state);
919 state->ret = SMB_VFS_FSYNC_RECV(subreq, &state->err);
921 tevent_req_done(req);
924 static int smb_time_audit_fsync_recv(struct tevent_req *req, int *err)
926 struct smb_time_audit_fsync_state *state = tevent_req_data(
927 req, struct smb_time_audit_fsync_state);
931 clock_gettime_mono(&ts2);
932 timediff = nsec_time_diff(&ts2,&state->ts1)*1.0e-9;
934 if (timediff > audit_timeout) {
935 smb_time_audit_log_fsp("fsync", timediff, state->fsp);
938 if (tevent_req_is_unix_error(req, err)) {
945 static int smb_time_audit_stat(vfs_handle_struct *handle,
946 struct smb_filename *fname)
949 struct timespec ts1,ts2;
952 clock_gettime_mono(&ts1);
953 result = SMB_VFS_NEXT_STAT(handle, fname);
954 clock_gettime_mono(&ts2);
955 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
957 if (timediff > audit_timeout) {
958 smb_time_audit_log_smb_fname("stat", timediff, fname);
964 static int smb_time_audit_fstat(vfs_handle_struct *handle, files_struct *fsp,
965 SMB_STRUCT_STAT *sbuf)
968 struct timespec ts1,ts2;
971 clock_gettime_mono(&ts1);
972 result = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
973 clock_gettime_mono(&ts2);
974 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
976 if (timediff > audit_timeout) {
977 smb_time_audit_log_fsp("fstat", timediff, fsp);
983 static int smb_time_audit_lstat(vfs_handle_struct *handle,
984 struct smb_filename *path)
987 struct timespec ts1,ts2;
990 clock_gettime_mono(&ts1);
991 result = SMB_VFS_NEXT_LSTAT(handle, path);
992 clock_gettime_mono(&ts2);
993 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
995 if (timediff > audit_timeout) {
996 smb_time_audit_log_smb_fname("lstat", timediff, path);
1002 static uint64_t smb_time_audit_get_alloc_size(vfs_handle_struct *handle,
1004 const SMB_STRUCT_STAT *sbuf)
1007 struct timespec ts1,ts2;
1010 clock_gettime_mono(&ts1);
1011 result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
1012 clock_gettime_mono(&ts2);
1013 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1015 if (timediff > audit_timeout) {
1016 smb_time_audit_log_fsp("get_alloc_size", timediff, fsp);
1022 static int smb_time_audit_unlink(vfs_handle_struct *handle,
1023 const struct smb_filename *path)
1026 struct timespec ts1,ts2;
1029 clock_gettime_mono(&ts1);
1030 result = SMB_VFS_NEXT_UNLINK(handle, path);
1031 clock_gettime_mono(&ts2);
1032 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1034 if (timediff > audit_timeout) {
1035 smb_time_audit_log_smb_fname("unlink", timediff, path);
1041 static int smb_time_audit_chmod(vfs_handle_struct *handle,
1042 const char *path, mode_t mode)
1045 struct timespec ts1,ts2;
1048 clock_gettime_mono(&ts1);
1049 result = SMB_VFS_NEXT_CHMOD(handle, path, mode);
1050 clock_gettime_mono(&ts2);
1051 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1053 if (timediff > audit_timeout) {
1054 smb_time_audit_log_fname("chmod", timediff, path);
1060 static int smb_time_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp,
1064 struct timespec ts1,ts2;
1067 clock_gettime_mono(&ts1);
1068 result = SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
1069 clock_gettime_mono(&ts2);
1070 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1072 if (timediff > audit_timeout) {
1073 smb_time_audit_log_fsp("fchmod", timediff, fsp);
1079 static int smb_time_audit_chown(vfs_handle_struct *handle,
1080 const char *path, uid_t uid, gid_t gid)
1083 struct timespec ts1,ts2;
1086 clock_gettime_mono(&ts1);
1087 result = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid);
1088 clock_gettime_mono(&ts2);
1089 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1091 if (timediff > audit_timeout) {
1092 smb_time_audit_log_fname("chown", timediff, path);
1098 static int smb_time_audit_fchown(vfs_handle_struct *handle, files_struct *fsp,
1099 uid_t uid, gid_t gid)
1102 struct timespec ts1,ts2;
1105 clock_gettime_mono(&ts1);
1106 result = SMB_VFS_NEXT_FCHOWN(handle, fsp, uid, gid);
1107 clock_gettime_mono(&ts2);
1108 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1110 if (timediff > audit_timeout) {
1111 smb_time_audit_log_fsp("fchown", timediff, fsp);
1117 static int smb_time_audit_lchown(vfs_handle_struct *handle,
1118 const char *path, uid_t uid, gid_t gid)
1121 struct timespec ts1,ts2;
1124 clock_gettime_mono(&ts1);
1125 result = SMB_VFS_NEXT_LCHOWN(handle, path, uid, gid);
1126 clock_gettime_mono(&ts2);
1127 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1129 if (timediff > audit_timeout) {
1130 smb_time_audit_log_fname("lchown", timediff, path);
1136 static int smb_time_audit_chdir(vfs_handle_struct *handle, const char *path)
1139 struct timespec ts1,ts2;
1142 clock_gettime_mono(&ts1);
1143 result = SMB_VFS_NEXT_CHDIR(handle, path);
1144 clock_gettime_mono(&ts2);
1145 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1147 if (timediff > audit_timeout) {
1148 smb_time_audit_log_fname("chdir", timediff, path);
1154 static char *smb_time_audit_getwd(vfs_handle_struct *handle)
1157 struct timespec ts1,ts2;
1160 clock_gettime_mono(&ts1);
1161 result = SMB_VFS_NEXT_GETWD(handle);
1162 clock_gettime_mono(&ts2);
1163 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1165 if (timediff > audit_timeout) {
1166 smb_time_audit_log("getwd", timediff);
1172 static int smb_time_audit_ntimes(vfs_handle_struct *handle,
1173 const struct smb_filename *path,
1174 struct smb_file_time *ft)
1177 struct timespec ts1,ts2;
1180 clock_gettime_mono(&ts1);
1181 result = SMB_VFS_NEXT_NTIMES(handle, path, ft);
1182 clock_gettime_mono(&ts2);
1183 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1185 if (timediff > audit_timeout) {
1186 smb_time_audit_log_smb_fname("ntimes", timediff, path);
1192 static int smb_time_audit_ftruncate(vfs_handle_struct *handle,
1197 struct timespec ts1,ts2;
1200 clock_gettime_mono(&ts1);
1201 result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len);
1202 clock_gettime_mono(&ts2);
1203 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1205 if (timediff > audit_timeout) {
1206 smb_time_audit_log_fsp("ftruncate", timediff, fsp);
1212 static int smb_time_audit_fallocate(vfs_handle_struct *handle,
1214 enum vfs_fallocate_mode mode,
1219 struct timespec ts1,ts2;
1222 clock_gettime_mono(&ts1);
1223 result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len);
1224 clock_gettime_mono(&ts2);
1225 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1227 if (timediff > audit_timeout) {
1228 smb_time_audit_log_fsp("fallocate", timediff, fsp);
1234 static bool smb_time_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
1235 int op, off_t offset, off_t count,
1239 struct timespec ts1,ts2;
1242 clock_gettime_mono(&ts1);
1243 result = SMB_VFS_NEXT_LOCK(handle, fsp, op, offset, count, type);
1244 clock_gettime_mono(&ts2);
1245 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1247 if (timediff > audit_timeout) {
1248 smb_time_audit_log_fsp("lock", timediff, fsp);
1254 static int smb_time_audit_kernel_flock(struct vfs_handle_struct *handle,
1255 struct files_struct *fsp,
1256 uint32 share_mode, uint32 access_mask)
1259 struct timespec ts1,ts2;
1262 clock_gettime_mono(&ts1);
1263 result = SMB_VFS_NEXT_KERNEL_FLOCK(handle, fsp, share_mode,
1265 clock_gettime_mono(&ts2);
1266 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1268 if (timediff > audit_timeout) {
1269 smb_time_audit_log_fsp("kernel_flock", timediff, fsp);
1275 static int smb_time_audit_linux_setlease(vfs_handle_struct *handle,
1280 struct timespec ts1,ts2;
1283 clock_gettime_mono(&ts1);
1284 result = SMB_VFS_NEXT_LINUX_SETLEASE(handle, fsp, leasetype);
1285 clock_gettime_mono(&ts2);
1286 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1288 if (timediff > audit_timeout) {
1289 smb_time_audit_log_fsp("linux_setlease", timediff, fsp);
1295 static bool smb_time_audit_getlock(vfs_handle_struct *handle,
1297 off_t *poffset, off_t *pcount,
1298 int *ptype, pid_t *ppid)
1301 struct timespec ts1,ts2;
1304 clock_gettime_mono(&ts1);
1305 result = SMB_VFS_NEXT_GETLOCK(handle, fsp, poffset, pcount, ptype,
1307 clock_gettime_mono(&ts2);
1308 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1310 if (timediff > audit_timeout) {
1311 smb_time_audit_log_fsp("getlock", timediff, fsp);
1317 static int smb_time_audit_symlink(vfs_handle_struct *handle,
1318 const char *oldpath, const char *newpath)
1321 struct timespec ts1,ts2;
1324 clock_gettime_mono(&ts1);
1325 result = SMB_VFS_NEXT_SYMLINK(handle, oldpath, newpath);
1326 clock_gettime_mono(&ts2);
1327 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1329 if (timediff > audit_timeout) {
1330 smb_time_audit_log_fname("symlink", timediff, newpath);
1336 static int smb_time_audit_readlink(vfs_handle_struct *handle,
1337 const char *path, char *buf, size_t bufsiz)
1340 struct timespec ts1,ts2;
1343 clock_gettime_mono(&ts1);
1344 result = SMB_VFS_NEXT_READLINK(handle, path, buf, bufsiz);
1345 clock_gettime_mono(&ts2);
1346 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1348 if (timediff > audit_timeout) {
1349 smb_time_audit_log_fname("readlink", timediff, path);
1355 static int smb_time_audit_link(vfs_handle_struct *handle,
1356 const char *oldpath, const char *newpath)
1359 struct timespec ts1,ts2;
1362 clock_gettime_mono(&ts1);
1363 result = SMB_VFS_NEXT_LINK(handle, oldpath, newpath);
1364 clock_gettime_mono(&ts2);
1365 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1367 if (timediff > audit_timeout) {
1368 smb_time_audit_log_fname("link", timediff, newpath);
1374 static int smb_time_audit_mknod(vfs_handle_struct *handle,
1375 const char *pathname, mode_t mode,
1379 struct timespec ts1,ts2;
1382 clock_gettime_mono(&ts1);
1383 result = SMB_VFS_NEXT_MKNOD(handle, pathname, mode, dev);
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_fname("mknod", timediff, pathname);
1394 static char *smb_time_audit_realpath(vfs_handle_struct *handle,
1398 struct timespec ts1,ts2;
1401 clock_gettime_mono(&ts1);
1402 result = SMB_VFS_NEXT_REALPATH(handle, path);
1403 clock_gettime_mono(&ts2);
1404 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1406 if (timediff > audit_timeout) {
1407 smb_time_audit_log_fname("realpath", timediff, path);
1413 static NTSTATUS smb_time_audit_notify_watch(struct vfs_handle_struct *handle,
1414 struct sys_notify_context *ctx,
1417 uint32_t *subdir_filter,
1418 void (*callback)(struct sys_notify_context *ctx,
1420 struct notify_event *ev),
1421 void *private_data, void *handle_p)
1424 struct timespec ts1,ts2;
1427 clock_gettime_mono(&ts1);
1428 result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, path,
1429 filter, subdir_filter, callback,
1430 private_data, handle_p);
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_fname("notify_watch", timediff, path);
1441 static int smb_time_audit_chflags(vfs_handle_struct *handle,
1442 const char *path, unsigned int flags)
1445 struct timespec ts1,ts2;
1448 clock_gettime_mono(&ts1);
1449 result = SMB_VFS_NEXT_CHFLAGS(handle, path, flags);
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_fname("chflags", timediff, path);
1460 static struct file_id smb_time_audit_file_id_create(struct vfs_handle_struct *handle,
1461 const SMB_STRUCT_STAT *sbuf)
1463 struct file_id id_zero;
1464 struct file_id result;
1465 struct timespec ts1,ts2;
1468 ZERO_STRUCT(id_zero);
1470 clock_gettime_mono(&ts1);
1471 result = SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
1472 clock_gettime_mono(&ts2);
1473 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1475 if (timediff > audit_timeout) {
1476 smb_time_audit_log("file_id_create", timediff);
1482 static NTSTATUS smb_time_audit_streaminfo(vfs_handle_struct *handle,
1483 struct files_struct *fsp,
1485 TALLOC_CTX *mem_ctx,
1486 unsigned int *pnum_streams,
1487 struct stream_struct **pstreams)
1490 struct timespec ts1,ts2;
1493 clock_gettime_mono(&ts1);
1494 result = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx,
1495 pnum_streams, pstreams);
1496 clock_gettime_mono(&ts2);
1497 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1499 if (timediff > audit_timeout) {
1500 smb_time_audit_log_fsp("streaminfo", timediff, fsp);
1506 static int smb_time_audit_get_real_filename(struct vfs_handle_struct *handle,
1509 TALLOC_CTX *mem_ctx,
1513 struct timespec ts1,ts2;
1516 clock_gettime_mono(&ts1);
1517 result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx,
1519 clock_gettime_mono(&ts2);
1520 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1522 if (timediff > audit_timeout) {
1523 smb_time_audit_log_fname("get_real_filename", timediff, path);
1529 static const char *smb_time_audit_connectpath(vfs_handle_struct *handle,
1533 struct timespec ts1,ts2;
1536 clock_gettime_mono(&ts1);
1537 result = SMB_VFS_NEXT_CONNECTPATH(handle, fname);
1538 clock_gettime_mono(&ts2);
1539 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1541 if (timediff > audit_timeout) {
1542 smb_time_audit_log_fname("connectpath", timediff, fname);
1548 static NTSTATUS smb_time_audit_brl_lock_windows(struct vfs_handle_struct *handle,
1549 struct byte_range_lock *br_lck,
1550 struct lock_struct *plock,
1554 struct timespec ts1,ts2;
1557 clock_gettime_mono(&ts1);
1558 result = SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock,
1560 clock_gettime_mono(&ts2);
1561 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1563 if (timediff > audit_timeout) {
1564 smb_time_audit_log_fsp("brl_lock_windows", timediff,
1571 static bool smb_time_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
1572 struct messaging_context *msg_ctx,
1573 struct byte_range_lock *br_lck,
1574 const struct lock_struct *plock)
1577 struct timespec ts1,ts2;
1580 clock_gettime_mono(&ts1);
1581 result = SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, msg_ctx, br_lck,
1583 clock_gettime_mono(&ts2);
1584 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1586 if (timediff > audit_timeout) {
1587 smb_time_audit_log_fsp("brl_unlock_windows", timediff,
1594 static bool smb_time_audit_brl_cancel_windows(struct vfs_handle_struct *handle,
1595 struct byte_range_lock *br_lck,
1596 struct lock_struct *plock)
1599 struct timespec ts1,ts2;
1602 clock_gettime_mono(&ts1);
1603 result = SMB_VFS_NEXT_BRL_CANCEL_WINDOWS(handle, br_lck, plock);
1604 clock_gettime_mono(&ts2);
1605 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1607 if (timediff > audit_timeout) {
1608 smb_time_audit_log_fsp("brl_cancel_windows", timediff,
1615 static bool smb_time_audit_strict_lock(struct vfs_handle_struct *handle,
1616 struct files_struct *fsp,
1617 struct lock_struct *plock)
1620 struct timespec ts1,ts2;
1623 clock_gettime_mono(&ts1);
1624 result = SMB_VFS_NEXT_STRICT_LOCK(handle, fsp, plock);
1625 clock_gettime_mono(&ts2);
1626 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1628 if (timediff > audit_timeout) {
1629 smb_time_audit_log_fsp("strict_lock", timediff, fsp);
1635 static void smb_time_audit_strict_unlock(struct vfs_handle_struct *handle,
1636 struct files_struct *fsp,
1637 struct lock_struct *plock)
1639 struct timespec ts1,ts2;
1642 clock_gettime_mono(&ts1);
1643 SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock);
1644 clock_gettime_mono(&ts2);
1645 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1647 if (timediff > audit_timeout) {
1648 smb_time_audit_log_fsp("strict_unlock", timediff, fsp);
1652 static NTSTATUS smb_time_audit_translate_name(struct vfs_handle_struct *handle,
1654 enum vfs_translate_direction direction,
1655 TALLOC_CTX *mem_ctx,
1659 struct timespec ts1,ts2;
1662 clock_gettime_mono(&ts1);
1663 result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx,
1665 clock_gettime_mono(&ts2);
1666 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1668 if (timediff > audit_timeout) {
1669 smb_time_audit_log_fname("translate_name", timediff, name);
1675 struct time_audit_cc_state {
1676 struct timespec ts_send;
1677 struct vfs_handle_struct *handle;
1680 static void smb_time_audit_copy_chunk_done(struct tevent_req *subreq);
1682 static struct tevent_req *smb_time_audit_copy_chunk_send(struct vfs_handle_struct *handle,
1683 TALLOC_CTX *mem_ctx,
1684 struct tevent_context *ev,
1685 struct files_struct *src_fsp,
1687 struct files_struct *dest_fsp,
1691 struct tevent_req *req;
1692 struct tevent_req *subreq;
1693 struct time_audit_cc_state *cc_state;
1695 req = tevent_req_create(mem_ctx, &cc_state, struct time_audit_cc_state);
1700 cc_state->handle = handle;
1701 clock_gettime_mono(&cc_state->ts_send);
1702 subreq = SMB_VFS_NEXT_COPY_CHUNK_SEND(handle, cc_state, ev,
1704 dest_fsp, dest_off, num);
1705 if (tevent_req_nomem(subreq, req)) {
1706 return tevent_req_post(req, ev);
1709 tevent_req_set_callback(subreq, smb_time_audit_copy_chunk_done, req);
1713 static void smb_time_audit_copy_chunk_done(struct tevent_req *subreq)
1715 struct tevent_req *req = tevent_req_callback_data(
1716 subreq, struct tevent_req);
1717 struct time_audit_cc_state *cc_state
1718 = tevent_req_data(req, struct time_audit_cc_state);
1721 status = SMB_VFS_NEXT_COPY_CHUNK_RECV(cc_state->handle,
1724 TALLOC_FREE(subreq);
1725 if (tevent_req_nterror(req, status)) {
1728 tevent_req_done(req);
1731 static NTSTATUS smb_time_audit_copy_chunk_recv(struct vfs_handle_struct *handle,
1732 struct tevent_req *req,
1735 struct time_audit_cc_state *cc_state
1736 = tevent_req_data(req, struct time_audit_cc_state);
1737 struct timespec ts_recv;
1741 clock_gettime_mono(&ts_recv);
1742 timediff = nsec_time_diff(&ts_recv, &cc_state->ts_send)*1.0e-9;
1743 if (timediff > audit_timeout) {
1744 smb_time_audit_log("copy_chunk", timediff);
1747 *copied = cc_state->copied;
1748 if (tevent_req_is_nterror(req, &status)) {
1749 tevent_req_received(req);
1753 tevent_req_received(req);
1754 return NT_STATUS_OK;
1757 static NTSTATUS smb_time_audit_get_compression(vfs_handle_struct *handle,
1758 TALLOC_CTX *mem_ctx,
1759 struct files_struct *fsp,
1760 struct smb_filename *smb_fname,
1761 uint16_t *_compression_fmt)
1764 struct timespec ts1,ts2;
1767 clock_gettime_mono(&ts1);
1768 result = SMB_VFS_NEXT_GET_COMPRESSION(handle, mem_ctx, fsp, smb_fname,
1770 clock_gettime_mono(&ts2);
1771 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1773 if (timediff > audit_timeout) {
1775 smb_time_audit_log_fsp("get_compression",
1778 smb_time_audit_log_smb_fname("get_compression",
1779 timediff, smb_fname);
1786 static NTSTATUS smb_time_audit_set_compression(vfs_handle_struct *handle,
1787 TALLOC_CTX *mem_ctx,
1788 struct files_struct *fsp,
1789 uint16_t compression_fmt)
1792 struct timespec ts1,ts2;
1795 clock_gettime_mono(&ts1);
1796 result = SMB_VFS_NEXT_SET_COMPRESSION(handle, mem_ctx, fsp,
1798 clock_gettime_mono(&ts2);
1799 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1801 if (timediff > audit_timeout) {
1802 smb_time_audit_log_fsp("set_compression", timediff, fsp);
1808 static NTSTATUS smb_time_audit_readdir_attr(struct vfs_handle_struct *handle,
1809 const struct smb_filename *fname,
1810 TALLOC_CTX *mem_ctx,
1811 struct readdir_attr_data **pattr_data)
1814 struct timespec ts1,ts2;
1817 clock_gettime_mono(&ts1);
1818 status = SMB_VFS_NEXT_READDIR_ATTR(handle, fname, mem_ctx, pattr_data);
1819 clock_gettime_mono(&ts2);
1820 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1822 if (timediff > audit_timeout) {
1823 smb_time_audit_log_smb_fname("readdir_attr", timediff, fname);
1829 static NTSTATUS smb_time_audit_fget_nt_acl(vfs_handle_struct *handle,
1831 uint32 security_info,
1832 TALLOC_CTX *mem_ctx,
1833 struct security_descriptor **ppdesc)
1836 struct timespec ts1,ts2;
1839 clock_gettime_mono(&ts1);
1840 result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, security_info,
1842 clock_gettime_mono(&ts2);
1843 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1845 if (timediff > audit_timeout) {
1846 smb_time_audit_log_fsp("fget_nt_acl", timediff, fsp);
1852 static NTSTATUS smb_time_audit_get_nt_acl(vfs_handle_struct *handle,
1854 uint32 security_info,
1855 TALLOC_CTX *mem_ctx,
1856 struct security_descriptor **ppdesc)
1859 struct timespec ts1,ts2;
1862 clock_gettime_mono(&ts1);
1863 result = SMB_VFS_NEXT_GET_NT_ACL(handle, name, security_info,
1865 clock_gettime_mono(&ts2);
1866 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1868 if (timediff > audit_timeout) {
1869 smb_time_audit_log_fname("get_nt_acl", timediff, name);
1875 static NTSTATUS smb_time_audit_fset_nt_acl(vfs_handle_struct *handle,
1877 uint32 security_info_sent,
1878 const struct security_descriptor *psd)
1881 struct timespec ts1,ts2;
1884 clock_gettime_mono(&ts1);
1885 result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, security_info_sent,
1887 clock_gettime_mono(&ts2);
1888 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1890 if (timediff > audit_timeout) {
1891 smb_time_audit_log_fsp("fset_nt_acl", timediff, fsp);
1897 static int smb_time_audit_chmod_acl(vfs_handle_struct *handle,
1898 const char *path, mode_t mode)
1901 struct timespec ts1,ts2;
1904 clock_gettime_mono(&ts1);
1905 result = SMB_VFS_NEXT_CHMOD_ACL(handle, path, mode);
1906 clock_gettime_mono(&ts2);
1907 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1909 if (timediff > audit_timeout) {
1910 smb_time_audit_log_fname("chmod_acl", timediff, path);
1916 static int smb_time_audit_fchmod_acl(vfs_handle_struct *handle,
1917 files_struct *fsp, mode_t mode)
1920 struct timespec ts1,ts2;
1923 clock_gettime_mono(&ts1);
1924 result = SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
1925 clock_gettime_mono(&ts2);
1926 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1928 if (timediff > audit_timeout) {
1929 smb_time_audit_log_fsp("fchmod_acl", timediff, fsp);
1935 static SMB_ACL_T smb_time_audit_sys_acl_get_file(vfs_handle_struct *handle,
1937 SMB_ACL_TYPE_T type,
1938 TALLOC_CTX *mem_ctx)
1941 struct timespec ts1,ts2;
1944 clock_gettime_mono(&ts1);
1945 result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, path_p, type, mem_ctx);
1946 clock_gettime_mono(&ts2);
1947 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1949 if (timediff > audit_timeout) {
1950 smb_time_audit_log_fname("sys_acl_get_file", timediff, path_p);
1956 static SMB_ACL_T smb_time_audit_sys_acl_get_fd(vfs_handle_struct *handle,
1958 TALLOC_CTX *mem_ctx)
1961 struct timespec ts1,ts2;
1964 clock_gettime_mono(&ts1);
1965 result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, mem_ctx);
1966 clock_gettime_mono(&ts2);
1967 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1969 if (timediff > audit_timeout) {
1970 smb_time_audit_log_fsp("sys_acl_get_fd", timediff, fsp);
1977 static int smb_time_audit_sys_acl_blob_get_file(vfs_handle_struct *handle,
1979 TALLOC_CTX *mem_ctx,
1980 char **blob_description,
1984 struct timespec ts1,ts2;
1987 clock_gettime_mono(&ts1);
1988 result = SMB_VFS_NEXT_SYS_ACL_BLOB_GET_FILE(handle, path_p, mem_ctx, blob_description, blob);
1989 clock_gettime_mono(&ts2);
1990 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
1992 if (timediff > audit_timeout) {
1993 smb_time_audit_log("sys_acl_blob_get_file", timediff);
1999 static int smb_time_audit_sys_acl_blob_get_fd(vfs_handle_struct *handle,
2001 TALLOC_CTX *mem_ctx,
2002 char **blob_description,
2006 struct timespec ts1,ts2;
2009 clock_gettime_mono(&ts1);
2010 result = SMB_VFS_NEXT_SYS_ACL_BLOB_GET_FD(handle, fsp, mem_ctx, blob_description, blob);
2011 clock_gettime_mono(&ts2);
2012 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2014 if (timediff > audit_timeout) {
2015 smb_time_audit_log("sys_acl_blob_get_fd", timediff);
2021 static int smb_time_audit_sys_acl_set_file(vfs_handle_struct *handle,
2023 SMB_ACL_TYPE_T acltype,
2027 struct timespec ts1,ts2;
2030 clock_gettime_mono(&ts1);
2031 result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, name, acltype,
2033 clock_gettime_mono(&ts2);
2034 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2036 if (timediff > audit_timeout) {
2037 smb_time_audit_log_fname("sys_acl_set_file", timediff, name);
2043 static int smb_time_audit_sys_acl_set_fd(vfs_handle_struct *handle,
2048 struct timespec ts1,ts2;
2051 clock_gettime_mono(&ts1);
2052 result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, theacl);
2053 clock_gettime_mono(&ts2);
2054 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2056 if (timediff > audit_timeout) {
2057 smb_time_audit_log_fsp("sys_acl_set_fd", timediff, fsp);
2063 static int smb_time_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
2067 struct timespec ts1,ts2;
2070 clock_gettime_mono(&ts1);
2071 result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, path);
2072 clock_gettime_mono(&ts2);
2073 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2075 if (timediff > audit_timeout) {
2076 smb_time_audit_log_fname("sys_acl_delete_def_file", timediff, path);
2082 static ssize_t smb_time_audit_getxattr(struct vfs_handle_struct *handle,
2083 const char *path, const char *name,
2084 void *value, size_t size)
2087 struct timespec ts1,ts2;
2090 clock_gettime_mono(&ts1);
2091 result = SMB_VFS_NEXT_GETXATTR(handle, path, name, value, size);
2092 clock_gettime_mono(&ts2);
2093 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2095 if (timediff > audit_timeout) {
2096 smb_time_audit_log_fname("getxattr", timediff, path);
2102 static ssize_t smb_time_audit_fgetxattr(struct vfs_handle_struct *handle,
2103 struct files_struct *fsp,
2104 const char *name, void *value,
2108 struct timespec ts1,ts2;
2111 clock_gettime_mono(&ts1);
2112 result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
2113 clock_gettime_mono(&ts2);
2114 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2116 if (timediff > audit_timeout) {
2117 smb_time_audit_log_fsp("fgetxattr", timediff, fsp);
2123 static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle,
2124 const char *path, char *list,
2128 struct timespec ts1,ts2;
2131 clock_gettime_mono(&ts1);
2132 result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
2133 clock_gettime_mono(&ts2);
2134 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2136 if (timediff > audit_timeout) {
2137 smb_time_audit_log_fname("listxattr", timediff, path);
2143 static ssize_t smb_time_audit_flistxattr(struct vfs_handle_struct *handle,
2144 struct files_struct *fsp, char *list,
2148 struct timespec ts1,ts2;
2151 clock_gettime_mono(&ts1);
2152 result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, list, size);
2153 clock_gettime_mono(&ts2);
2154 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2156 if (timediff > audit_timeout) {
2157 smb_time_audit_log_fsp("flistxattr", timediff, fsp);
2163 static int smb_time_audit_removexattr(struct vfs_handle_struct *handle,
2164 const char *path, const char *name)
2167 struct timespec ts1,ts2;
2170 clock_gettime_mono(&ts1);
2171 result = SMB_VFS_NEXT_REMOVEXATTR(handle, path, name);
2172 clock_gettime_mono(&ts2);
2173 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2175 if (timediff > audit_timeout) {
2176 smb_time_audit_log_fname("removexattr", timediff, path);
2182 static int smb_time_audit_fremovexattr(struct vfs_handle_struct *handle,
2183 struct files_struct *fsp,
2187 struct timespec ts1,ts2;
2190 clock_gettime_mono(&ts1);
2191 result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, name);
2192 clock_gettime_mono(&ts2);
2193 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2195 if (timediff > audit_timeout) {
2196 smb_time_audit_log_fsp("fremovexattr", timediff, fsp);
2202 static int smb_time_audit_setxattr(struct vfs_handle_struct *handle,
2203 const char *path, const char *name,
2204 const void *value, size_t size,
2208 struct timespec ts1,ts2;
2211 clock_gettime_mono(&ts1);
2212 result = SMB_VFS_NEXT_SETXATTR(handle, path, name, value, size,
2214 clock_gettime_mono(&ts2);
2215 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2217 if (timediff > audit_timeout) {
2218 smb_time_audit_log_fname("setxattr", timediff, path);
2224 static int smb_time_audit_fsetxattr(struct vfs_handle_struct *handle,
2225 struct files_struct *fsp, const char *name,
2226 const void *value, size_t size, int flags)
2229 struct timespec ts1,ts2;
2232 clock_gettime_mono(&ts1);
2233 result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, name, value, size, flags);
2234 clock_gettime_mono(&ts2);
2235 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2237 if (timediff > audit_timeout) {
2238 smb_time_audit_log_fsp("fsetxattr", timediff, fsp);
2244 static bool smb_time_audit_aio_force(struct vfs_handle_struct *handle,
2245 struct files_struct *fsp)
2248 struct timespec ts1,ts2;
2251 clock_gettime_mono(&ts1);
2252 result = SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
2253 clock_gettime_mono(&ts2);
2254 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2256 if (timediff > audit_timeout) {
2257 smb_time_audit_log_fsp("aio_force", timediff, fsp);
2263 static bool smb_time_audit_is_offline(struct vfs_handle_struct *handle,
2264 const struct smb_filename *fname,
2265 SMB_STRUCT_STAT *sbuf)
2268 struct timespec ts1,ts2;
2271 clock_gettime_mono(&ts1);
2272 result = SMB_VFS_NEXT_IS_OFFLINE(handle, fname, sbuf);
2273 clock_gettime_mono(&ts2);
2274 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2276 if (timediff > audit_timeout) {
2277 smb_time_audit_log_smb_fname("is_offline", timediff, fname);
2283 static int smb_time_audit_set_offline(struct vfs_handle_struct *handle,
2284 const struct smb_filename *fname)
2287 struct timespec ts1,ts2;
2290 clock_gettime_mono(&ts1);
2291 result = SMB_VFS_NEXT_SET_OFFLINE(handle, fname);
2292 clock_gettime_mono(&ts2);
2293 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2295 if (timediff > audit_timeout) {
2296 smb_time_audit_log_smb_fname("set_offline", timediff, fname);
2302 static NTSTATUS smb_time_audit_durable_cookie(struct vfs_handle_struct *handle,
2303 struct files_struct *fsp,
2304 TALLOC_CTX *mem_ctx,
2308 struct timespec ts1,ts2;
2311 clock_gettime_mono(&ts1);
2312 result = SMB_VFS_NEXT_DURABLE_COOKIE(handle, fsp, mem_ctx, cookie);
2313 clock_gettime_mono(&ts2);
2314 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2316 if (timediff > audit_timeout) {
2317 smb_time_audit_log_fsp("durable_cookie", timediff, fsp);
2323 static NTSTATUS smb_time_audit_durable_disconnect(struct vfs_handle_struct *handle,
2324 struct files_struct *fsp,
2325 const DATA_BLOB old_cookie,
2326 TALLOC_CTX *mem_ctx,
2327 DATA_BLOB *new_cookie)
2330 struct timespec ts1,ts2;
2333 clock_gettime_mono(&ts1);
2334 result = SMB_VFS_NEXT_DURABLE_DISCONNECT(handle, fsp, old_cookie,
2335 mem_ctx, new_cookie);
2336 clock_gettime_mono(&ts2);
2337 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2339 if (timediff > audit_timeout) {
2340 smb_time_audit_log_fsp("durable_disconnect", timediff, fsp);
2346 static NTSTATUS smb_time_audit_durable_reconnect(struct vfs_handle_struct *handle,
2347 struct smb_request *smb1req,
2348 struct smbXsrv_open *op,
2349 const DATA_BLOB old_cookie,
2350 TALLOC_CTX *mem_ctx,
2351 struct files_struct **fsp,
2352 DATA_BLOB *new_cookie)
2355 struct timespec ts1,ts2;
2358 clock_gettime_mono(&ts1);
2359 result = SMB_VFS_NEXT_DURABLE_RECONNECT(handle, smb1req, op, old_cookie,
2360 mem_ctx, fsp, new_cookie);
2361 clock_gettime_mono(&ts2);
2362 timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9;
2364 if (timediff > audit_timeout) {
2365 smb_time_audit_log("durable_reconnect", timediff);
2371 /* VFS operations */
2373 static struct vfs_fn_pointers vfs_time_audit_fns = {
2374 .connect_fn = smb_time_audit_connect,
2375 .disconnect_fn = smb_time_audit_disconnect,
2376 .disk_free_fn = smb_time_audit_disk_free,
2377 .get_quota_fn = smb_time_audit_get_quota,
2378 .set_quota_fn = smb_time_audit_set_quota,
2379 .get_shadow_copy_data_fn = smb_time_audit_get_shadow_copy_data,
2380 .statvfs_fn = smb_time_audit_statvfs,
2381 .fs_capabilities_fn = smb_time_audit_fs_capabilities,
2382 .opendir_fn = smb_time_audit_opendir,
2383 .fdopendir_fn = smb_time_audit_fdopendir,
2384 .readdir_fn = smb_time_audit_readdir,
2385 .seekdir_fn = smb_time_audit_seekdir,
2386 .telldir_fn = smb_time_audit_telldir,
2387 .rewind_dir_fn = smb_time_audit_rewinddir,
2388 .mkdir_fn = smb_time_audit_mkdir,
2389 .rmdir_fn = smb_time_audit_rmdir,
2390 .closedir_fn = smb_time_audit_closedir,
2391 .init_search_op_fn = smb_time_audit_init_search_op,
2392 .open_fn = smb_time_audit_open,
2393 .create_file_fn = smb_time_audit_create_file,
2394 .close_fn = smb_time_audit_close,
2395 .read_fn = smb_time_audit_read,
2396 .pread_fn = smb_time_audit_pread,
2397 .pread_send_fn = smb_time_audit_pread_send,
2398 .pread_recv_fn = smb_time_audit_pread_recv,
2399 .write_fn = smb_time_audit_write,
2400 .pwrite_fn = smb_time_audit_pwrite,
2401 .pwrite_send_fn = smb_time_audit_pwrite_send,
2402 .pwrite_recv_fn = smb_time_audit_pwrite_recv,
2403 .lseek_fn = smb_time_audit_lseek,
2404 .sendfile_fn = smb_time_audit_sendfile,
2405 .recvfile_fn = smb_time_audit_recvfile,
2406 .rename_fn = smb_time_audit_rename,
2407 .fsync_fn = smb_time_audit_fsync,
2408 .fsync_send_fn = smb_time_audit_fsync_send,
2409 .fsync_recv_fn = smb_time_audit_fsync_recv,
2410 .stat_fn = smb_time_audit_stat,
2411 .fstat_fn = smb_time_audit_fstat,
2412 .lstat_fn = smb_time_audit_lstat,
2413 .get_alloc_size_fn = smb_time_audit_get_alloc_size,
2414 .unlink_fn = smb_time_audit_unlink,
2415 .chmod_fn = smb_time_audit_chmod,
2416 .fchmod_fn = smb_time_audit_fchmod,
2417 .chown_fn = smb_time_audit_chown,
2418 .fchown_fn = smb_time_audit_fchown,
2419 .lchown_fn = smb_time_audit_lchown,
2420 .chdir_fn = smb_time_audit_chdir,
2421 .getwd_fn = smb_time_audit_getwd,
2422 .ntimes_fn = smb_time_audit_ntimes,
2423 .ftruncate_fn = smb_time_audit_ftruncate,
2424 .fallocate_fn = smb_time_audit_fallocate,
2425 .lock_fn = smb_time_audit_lock,
2426 .kernel_flock_fn = smb_time_audit_kernel_flock,
2427 .linux_setlease_fn = smb_time_audit_linux_setlease,
2428 .getlock_fn = smb_time_audit_getlock,
2429 .symlink_fn = smb_time_audit_symlink,
2430 .readlink_fn = smb_time_audit_readlink,
2431 .link_fn = smb_time_audit_link,
2432 .mknod_fn = smb_time_audit_mknod,
2433 .realpath_fn = smb_time_audit_realpath,
2434 .notify_watch_fn = smb_time_audit_notify_watch,
2435 .chflags_fn = smb_time_audit_chflags,
2436 .file_id_create_fn = smb_time_audit_file_id_create,
2437 .streaminfo_fn = smb_time_audit_streaminfo,
2438 .get_real_filename_fn = smb_time_audit_get_real_filename,
2439 .connectpath_fn = smb_time_audit_connectpath,
2440 .brl_lock_windows_fn = smb_time_audit_brl_lock_windows,
2441 .brl_unlock_windows_fn = smb_time_audit_brl_unlock_windows,
2442 .brl_cancel_windows_fn = smb_time_audit_brl_cancel_windows,
2443 .strict_lock_fn = smb_time_audit_strict_lock,
2444 .strict_unlock_fn = smb_time_audit_strict_unlock,
2445 .translate_name_fn = smb_time_audit_translate_name,
2446 .copy_chunk_send_fn = smb_time_audit_copy_chunk_send,
2447 .copy_chunk_recv_fn = smb_time_audit_copy_chunk_recv,
2448 .get_compression_fn = smb_time_audit_get_compression,
2449 .set_compression_fn = smb_time_audit_set_compression,
2450 .readdir_attr_fn = smb_time_audit_readdir_attr,
2451 .fget_nt_acl_fn = smb_time_audit_fget_nt_acl,
2452 .get_nt_acl_fn = smb_time_audit_get_nt_acl,
2453 .fset_nt_acl_fn = smb_time_audit_fset_nt_acl,
2454 .chmod_acl_fn = smb_time_audit_chmod_acl,
2455 .fchmod_acl_fn = smb_time_audit_fchmod_acl,
2456 .sys_acl_get_file_fn = smb_time_audit_sys_acl_get_file,
2457 .sys_acl_get_fd_fn = smb_time_audit_sys_acl_get_fd,
2458 .sys_acl_blob_get_file_fn = smb_time_audit_sys_acl_blob_get_file,
2459 .sys_acl_blob_get_fd_fn = smb_time_audit_sys_acl_blob_get_fd,
2460 .sys_acl_set_file_fn = smb_time_audit_sys_acl_set_file,
2461 .sys_acl_set_fd_fn = smb_time_audit_sys_acl_set_fd,
2462 .sys_acl_delete_def_file_fn = smb_time_audit_sys_acl_delete_def_file,
2463 .getxattr_fn = smb_time_audit_getxattr,
2464 .fgetxattr_fn = smb_time_audit_fgetxattr,
2465 .listxattr_fn = smb_time_audit_listxattr,
2466 .flistxattr_fn = smb_time_audit_flistxattr,
2467 .removexattr_fn = smb_time_audit_removexattr,
2468 .fremovexattr_fn = smb_time_audit_fremovexattr,
2469 .setxattr_fn = smb_time_audit_setxattr,
2470 .fsetxattr_fn = smb_time_audit_fsetxattr,
2471 .aio_force_fn = smb_time_audit_aio_force,
2472 .is_offline_fn = smb_time_audit_is_offline,
2473 .set_offline_fn = smb_time_audit_set_offline,
2474 .durable_cookie_fn = smb_time_audit_durable_cookie,
2475 .durable_disconnect_fn = smb_time_audit_durable_disconnect,
2476 .durable_reconnect_fn = smb_time_audit_durable_reconnect,
2480 NTSTATUS vfs_time_audit_init(void);
2481 NTSTATUS vfs_time_audit_init(void)
2483 audit_timeout = (double)lp_parm_int(-1, "time_audit", "timeout",
2485 return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "time_audit",
2486 &vfs_time_audit_fns);