smbd: Remove unused [push_pull]_file_id_24
[samba.git] / source3 / modules / vfs_full_audit.c
1 /* 
2  * Auditing VFS module for samba.  Log selected file operations to syslog
3  * facility.
4  *
5  * Copyright (C) Tim Potter, 1999-2000
6  * Copyright (C) Alexander Bokovoy, 2002
7  * Copyright (C) John H Terpstra, 2003
8  * Copyright (C) Stefan (metze) Metzmacher, 2003
9  * Copyright (C) Volker Lendecke, 2004
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 3 of the License, or
14  * (at your option) any later version.
15  *  
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *  
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, see <http://www.gnu.org/licenses/>.
23  */
24
25 /*
26  * This module implements parseable logging for all Samba VFS operations.
27  *
28  * You use it as follows:
29  *
30  * [tmp]
31  * path = /tmp
32  * vfs objects = full_audit
33  * full_audit:prefix = %u|%I
34  * full_audit:success = open opendir
35  * full_audit:failure = all
36  *
37  * vfs op can be "all" which means log all operations.
38  * vfs op can be "none" which means no logging.
39  *
40  * This leads to syslog entries of the form:
41  * smbd_audit: nobody|192.168.234.1|opendir|ok|.
42  * smbd_audit: nobody|192.168.234.1|open|fail (File not found)|r|x.txt
43  *
44  * where "nobody" is the connected username and "192.168.234.1" is the
45  * client's IP address. 
46  *
47  * Options:
48  *
49  * prefix: A macro expansion template prepended to the syslog entry.
50  *
51  * success: A list of VFS operations for which a successful completion should
52  * be logged. Defaults to no logging at all. The special operation "all" logs
53  * - you guessed it - everything.
54  *
55  * failure: A list of VFS operations for which failure to complete should be
56  * logged. Defaults to logging everything.
57  */
58
59
60 #include "includes.h"
61 #include "../librpc/gen_ndr/ndr_netlogon.h"
62
63 static int vfs_full_audit_debug_level = DBGC_VFS;
64
65 struct vfs_full_audit_private_data {
66         struct bitmap *success_ops;
67         struct bitmap *failure_ops;
68 };
69
70 #undef DBGC_CLASS
71 #define DBGC_CLASS vfs_full_audit_debug_level
72
73 typedef enum _vfs_op_type {
74         SMB_VFS_OP_NOOP = -1,
75
76         /* Disk operations */
77
78         SMB_VFS_OP_CONNECT = 0,
79         SMB_VFS_OP_DISCONNECT,
80         SMB_VFS_OP_DISK_FREE,
81         SMB_VFS_OP_GET_QUOTA,
82         SMB_VFS_OP_SET_QUOTA,
83         SMB_VFS_OP_GET_SHADOW_COPY_DATA,
84         SMB_VFS_OP_STATVFS,
85         SMB_VFS_OP_FS_CAPABILITIES,
86
87         /* Directory operations */
88
89         SMB_VFS_OP_OPENDIR,
90         SMB_VFS_OP_FDOPENDIR,
91         SMB_VFS_OP_READDIR,
92         SMB_VFS_OP_SEEKDIR,
93         SMB_VFS_OP_TELLDIR,
94         SMB_VFS_OP_REWINDDIR,
95         SMB_VFS_OP_MKDIR,
96         SMB_VFS_OP_RMDIR,
97         SMB_VFS_OP_CLOSEDIR,
98         SMB_VFS_OP_INIT_SEARCH_OP,
99
100         /* File operations */
101
102         SMB_VFS_OP_OPEN,
103         SMB_VFS_OP_CREATE_FILE,
104         SMB_VFS_OP_CLOSE,
105         SMB_VFS_OP_READ,
106         SMB_VFS_OP_PREAD,
107         SMB_VFS_OP_WRITE,
108         SMB_VFS_OP_PWRITE,
109         SMB_VFS_OP_LSEEK,
110         SMB_VFS_OP_SENDFILE,
111         SMB_VFS_OP_RECVFILE,
112         SMB_VFS_OP_RENAME,
113         SMB_VFS_OP_FSYNC,
114         SMB_VFS_OP_STAT,
115         SMB_VFS_OP_FSTAT,
116         SMB_VFS_OP_LSTAT,
117         SMB_VFS_OP_GET_ALLOC_SIZE,
118         SMB_VFS_OP_UNLINK,
119         SMB_VFS_OP_CHMOD,
120         SMB_VFS_OP_FCHMOD,
121         SMB_VFS_OP_CHOWN,
122         SMB_VFS_OP_FCHOWN,
123         SMB_VFS_OP_LCHOWN,
124         SMB_VFS_OP_CHDIR,
125         SMB_VFS_OP_GETWD,
126         SMB_VFS_OP_NTIMES,
127         SMB_VFS_OP_FTRUNCATE,
128         SMB_VFS_OP_FALLOCATE,
129         SMB_VFS_OP_LOCK,
130         SMB_VFS_OP_KERNEL_FLOCK,
131         SMB_VFS_OP_LINUX_SETLEASE,
132         SMB_VFS_OP_GETLOCK,
133         SMB_VFS_OP_SYMLINK,
134         SMB_VFS_OP_READLINK,
135         SMB_VFS_OP_LINK,
136         SMB_VFS_OP_MKNOD,
137         SMB_VFS_OP_REALPATH,
138         SMB_VFS_OP_NOTIFY_WATCH,
139         SMB_VFS_OP_CHFLAGS,
140         SMB_VFS_OP_FILE_ID_CREATE,
141         SMB_VFS_OP_STREAMINFO,
142         SMB_VFS_OP_GET_REAL_FILENAME,
143         SMB_VFS_OP_CONNECTPATH,
144         SMB_VFS_OP_BRL_LOCK_WINDOWS,
145         SMB_VFS_OP_BRL_UNLOCK_WINDOWS,
146         SMB_VFS_OP_BRL_CANCEL_WINDOWS,
147         SMB_VFS_OP_STRICT_LOCK,
148         SMB_VFS_OP_STRICT_UNLOCK,
149         SMB_VFS_OP_TRANSLATE_NAME,
150
151         /* NT ACL operations. */
152
153         SMB_VFS_OP_FGET_NT_ACL,
154         SMB_VFS_OP_GET_NT_ACL,
155         SMB_VFS_OP_FSET_NT_ACL,
156
157         /* POSIX ACL operations. */
158
159         SMB_VFS_OP_CHMOD_ACL,
160         SMB_VFS_OP_FCHMOD_ACL,
161
162         SMB_VFS_OP_SYS_ACL_GET_ENTRY,
163         SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,
164         SMB_VFS_OP_SYS_ACL_GET_PERMSET,
165         SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,
166         SMB_VFS_OP_SYS_ACL_GET_FILE,
167         SMB_VFS_OP_SYS_ACL_GET_FD,
168         SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,
169         SMB_VFS_OP_SYS_ACL_ADD_PERM,
170         SMB_VFS_OP_SYS_ACL_TO_TEXT,
171         SMB_VFS_OP_SYS_ACL_INIT,
172         SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,
173         SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,
174         SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,
175         SMB_VFS_OP_SYS_ACL_SET_PERMSET,
176         SMB_VFS_OP_SYS_ACL_VALID,
177         SMB_VFS_OP_SYS_ACL_SET_FILE,
178         SMB_VFS_OP_SYS_ACL_SET_FD,
179         SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
180         SMB_VFS_OP_SYS_ACL_GET_PERM,
181         SMB_VFS_OP_SYS_ACL_FREE_TEXT,
182         SMB_VFS_OP_SYS_ACL_FREE_ACL,
183         SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,
184
185         /* EA operations. */
186         SMB_VFS_OP_GETXATTR,
187         SMB_VFS_OP_LGETXATTR,
188         SMB_VFS_OP_FGETXATTR,
189         SMB_VFS_OP_LISTXATTR,
190         SMB_VFS_OP_LLISTXATTR,
191         SMB_VFS_OP_FLISTXATTR,
192         SMB_VFS_OP_REMOVEXATTR,
193         SMB_VFS_OP_LREMOVEXATTR,
194         SMB_VFS_OP_FREMOVEXATTR,
195         SMB_VFS_OP_SETXATTR,
196         SMB_VFS_OP_LSETXATTR,
197         SMB_VFS_OP_FSETXATTR,
198
199         /* aio operations */
200         SMB_VFS_OP_AIO_READ,
201         SMB_VFS_OP_AIO_WRITE,
202         SMB_VFS_OP_AIO_RETURN,
203         SMB_VFS_OP_AIO_CANCEL,
204         SMB_VFS_OP_AIO_ERROR,
205         SMB_VFS_OP_AIO_FSYNC,
206         SMB_VFS_OP_AIO_SUSPEND,
207         SMB_VFS_OP_AIO_FORCE,
208
209         /* offline operations */
210         SMB_VFS_OP_IS_OFFLINE,
211         SMB_VFS_OP_SET_OFFLINE,
212
213         /* This should always be last enum value */
214
215         SMB_VFS_OP_LAST
216 } vfs_op_type;
217
218 /* The following array *must* be in the same order as defined in vfs.h */
219
220 static struct {
221         vfs_op_type type;
222         const char *name;
223 } vfs_op_names[] = {
224         { SMB_VFS_OP_CONNECT,   "connect" },
225         { SMB_VFS_OP_DISCONNECT,        "disconnect" },
226         { SMB_VFS_OP_DISK_FREE, "disk_free" },
227         { SMB_VFS_OP_GET_QUOTA, "get_quota" },
228         { SMB_VFS_OP_SET_QUOTA, "set_quota" },
229         { SMB_VFS_OP_GET_SHADOW_COPY_DATA,      "get_shadow_copy_data" },
230         { SMB_VFS_OP_STATVFS,   "statvfs" },
231         { SMB_VFS_OP_FS_CAPABILITIES,   "fs_capabilities" },
232         { SMB_VFS_OP_OPENDIR,   "opendir" },
233         { SMB_VFS_OP_FDOPENDIR, "fdopendir" },
234         { SMB_VFS_OP_READDIR,   "readdir" },
235         { SMB_VFS_OP_SEEKDIR,   "seekdir" },
236         { SMB_VFS_OP_TELLDIR,   "telldir" },
237         { SMB_VFS_OP_REWINDDIR, "rewinddir" },
238         { SMB_VFS_OP_MKDIR,     "mkdir" },
239         { SMB_VFS_OP_RMDIR,     "rmdir" },
240         { SMB_VFS_OP_CLOSEDIR,  "closedir" },
241         { SMB_VFS_OP_INIT_SEARCH_OP, "init_search_op" },
242         { SMB_VFS_OP_OPEN,      "open" },
243         { SMB_VFS_OP_CREATE_FILE, "create_file" },
244         { SMB_VFS_OP_CLOSE,     "close" },
245         { SMB_VFS_OP_READ,      "read" },
246         { SMB_VFS_OP_PREAD,     "pread" },
247         { SMB_VFS_OP_WRITE,     "write" },
248         { SMB_VFS_OP_PWRITE,    "pwrite" },
249         { SMB_VFS_OP_LSEEK,     "lseek" },
250         { SMB_VFS_OP_SENDFILE,  "sendfile" },
251         { SMB_VFS_OP_RECVFILE,  "recvfile" },
252         { SMB_VFS_OP_RENAME,    "rename" },
253         { SMB_VFS_OP_FSYNC,     "fsync" },
254         { SMB_VFS_OP_STAT,      "stat" },
255         { SMB_VFS_OP_FSTAT,     "fstat" },
256         { SMB_VFS_OP_LSTAT,     "lstat" },
257         { SMB_VFS_OP_GET_ALLOC_SIZE,    "get_alloc_size" },
258         { SMB_VFS_OP_UNLINK,    "unlink" },
259         { SMB_VFS_OP_CHMOD,     "chmod" },
260         { SMB_VFS_OP_FCHMOD,    "fchmod" },
261         { SMB_VFS_OP_CHOWN,     "chown" },
262         { SMB_VFS_OP_FCHOWN,    "fchown" },
263         { SMB_VFS_OP_LCHOWN,    "lchown" },
264         { SMB_VFS_OP_CHDIR,     "chdir" },
265         { SMB_VFS_OP_GETWD,     "getwd" },
266         { SMB_VFS_OP_NTIMES,    "ntimes" },
267         { SMB_VFS_OP_FTRUNCATE, "ftruncate" },
268         { SMB_VFS_OP_FALLOCATE,"fallocate" },
269         { SMB_VFS_OP_LOCK,      "lock" },
270         { SMB_VFS_OP_KERNEL_FLOCK,      "kernel_flock" },
271         { SMB_VFS_OP_LINUX_SETLEASE, "linux_setlease" },
272         { SMB_VFS_OP_GETLOCK,   "getlock" },
273         { SMB_VFS_OP_SYMLINK,   "symlink" },
274         { SMB_VFS_OP_READLINK,  "readlink" },
275         { SMB_VFS_OP_LINK,      "link" },
276         { SMB_VFS_OP_MKNOD,     "mknod" },
277         { SMB_VFS_OP_REALPATH,  "realpath" },
278         { SMB_VFS_OP_NOTIFY_WATCH, "notify_watch" },
279         { SMB_VFS_OP_CHFLAGS,   "chflags" },
280         { SMB_VFS_OP_FILE_ID_CREATE,    "file_id_create" },
281         { SMB_VFS_OP_STREAMINFO,        "streaminfo" },
282         { SMB_VFS_OP_GET_REAL_FILENAME, "get_real_filename" },
283         { SMB_VFS_OP_CONNECTPATH,       "connectpath" },
284         { SMB_VFS_OP_BRL_LOCK_WINDOWS,  "brl_lock_windows" },
285         { SMB_VFS_OP_BRL_UNLOCK_WINDOWS, "brl_unlock_windows" },
286         { SMB_VFS_OP_BRL_CANCEL_WINDOWS, "brl_cancel_windows" },
287         { SMB_VFS_OP_STRICT_LOCK, "strict_lock" },
288         { SMB_VFS_OP_STRICT_UNLOCK, "strict_unlock" },
289         { SMB_VFS_OP_TRANSLATE_NAME,    "translate_name" },
290         { SMB_VFS_OP_FGET_NT_ACL,       "fget_nt_acl" },
291         { SMB_VFS_OP_GET_NT_ACL,        "get_nt_acl" },
292         { SMB_VFS_OP_FSET_NT_ACL,       "fset_nt_acl" },
293         { SMB_VFS_OP_CHMOD_ACL, "chmod_acl" },
294         { SMB_VFS_OP_FCHMOD_ACL,        "fchmod_acl" },
295         { SMB_VFS_OP_SYS_ACL_GET_ENTRY, "sys_acl_get_entry" },
296         { SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,      "sys_acl_get_tag_type" },
297         { SMB_VFS_OP_SYS_ACL_GET_PERMSET,       "sys_acl_get_permset" },
298         { SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,     "sys_acl_get_qualifier" },
299         { SMB_VFS_OP_SYS_ACL_GET_FILE,  "sys_acl_get_file" },
300         { SMB_VFS_OP_SYS_ACL_GET_FD,    "sys_acl_get_fd" },
301         { SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,       "sys_acl_clear_perms" },
302         { SMB_VFS_OP_SYS_ACL_ADD_PERM,  "sys_acl_add_perm" },
303         { SMB_VFS_OP_SYS_ACL_TO_TEXT,   "sys_acl_to_text" },
304         { SMB_VFS_OP_SYS_ACL_INIT,      "sys_acl_init" },
305         { SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,      "sys_acl_create_entry" },
306         { SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,      "sys_acl_set_tag_type" },
307         { SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,     "sys_acl_set_qualifier" },
308         { SMB_VFS_OP_SYS_ACL_SET_PERMSET,       "sys_acl_set_permset" },
309         { SMB_VFS_OP_SYS_ACL_VALID,     "sys_acl_valid" },
310         { SMB_VFS_OP_SYS_ACL_SET_FILE,  "sys_acl_set_file" },
311         { SMB_VFS_OP_SYS_ACL_SET_FD,    "sys_acl_set_fd" },
312         { SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,   "sys_acl_delete_def_file" },
313         { SMB_VFS_OP_SYS_ACL_GET_PERM,  "sys_acl_get_perm" },
314         { SMB_VFS_OP_SYS_ACL_FREE_TEXT, "sys_acl_free_text" },
315         { SMB_VFS_OP_SYS_ACL_FREE_ACL,  "sys_acl_free_acl" },
316         { SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,    "sys_acl_free_qualifier" },
317         { SMB_VFS_OP_GETXATTR,  "getxattr" },
318         { SMB_VFS_OP_LGETXATTR, "lgetxattr" },
319         { SMB_VFS_OP_FGETXATTR, "fgetxattr" },
320         { SMB_VFS_OP_LISTXATTR, "listxattr" },
321         { SMB_VFS_OP_LLISTXATTR,        "llistxattr" },
322         { SMB_VFS_OP_FLISTXATTR,        "flistxattr" },
323         { SMB_VFS_OP_REMOVEXATTR,       "removexattr" },
324         { SMB_VFS_OP_LREMOVEXATTR,      "lremovexattr" },
325         { SMB_VFS_OP_FREMOVEXATTR,      "fremovexattr" },
326         { SMB_VFS_OP_SETXATTR,  "setxattr" },
327         { SMB_VFS_OP_LSETXATTR, "lsetxattr" },
328         { SMB_VFS_OP_FSETXATTR, "fsetxattr" },
329         { SMB_VFS_OP_AIO_READ,  "aio_read" },
330         { SMB_VFS_OP_AIO_WRITE, "aio_write" },
331         { SMB_VFS_OP_AIO_RETURN,"aio_return" },
332         { SMB_VFS_OP_AIO_CANCEL,"aio_cancel" },
333         { SMB_VFS_OP_AIO_ERROR, "aio_error" },
334         { SMB_VFS_OP_AIO_FSYNC, "aio_fsync" },
335         { SMB_VFS_OP_AIO_SUSPEND,"aio_suspend" },
336         { SMB_VFS_OP_AIO_FORCE, "aio_force" },
337         { SMB_VFS_OP_IS_OFFLINE, "is_offline" },
338         { SMB_VFS_OP_SET_OFFLINE, "set_offline" },
339         { SMB_VFS_OP_LAST, NULL }
340 };
341
342 static int audit_syslog_facility(vfs_handle_struct *handle)
343 {
344         static const struct enum_list enum_log_facilities[] = {
345                 { LOG_USER, "USER" },
346                 { LOG_LOCAL0, "LOCAL0" },
347                 { LOG_LOCAL1, "LOCAL1" },
348                 { LOG_LOCAL2, "LOCAL2" },
349                 { LOG_LOCAL3, "LOCAL3" },
350                 { LOG_LOCAL4, "LOCAL4" },
351                 { LOG_LOCAL5, "LOCAL5" },
352                 { LOG_LOCAL6, "LOCAL6" },
353                 { LOG_LOCAL7, "LOCAL7" }
354         };
355
356         int facility;
357
358         facility = lp_parm_enum(SNUM(handle->conn), "full_audit", "facility", enum_log_facilities, LOG_USER);
359
360         return facility;
361 }
362
363 static int audit_syslog_priority(vfs_handle_struct *handle)
364 {
365         static const struct enum_list enum_log_priorities[] = {
366                 { LOG_EMERG, "EMERG" },
367                 { LOG_ALERT, "ALERT" },
368                 { LOG_CRIT, "CRIT" },
369                 { LOG_ERR, "ERR" },
370                 { LOG_WARNING, "WARNING" },
371                 { LOG_NOTICE, "NOTICE" },
372                 { LOG_INFO, "INFO" },
373                 { LOG_DEBUG, "DEBUG" }
374         };
375
376         int priority;
377
378         priority = lp_parm_enum(SNUM(handle->conn), "full_audit", "priority",
379                                 enum_log_priorities, LOG_NOTICE);
380         if (priority == -1) {
381                 priority = LOG_WARNING;
382         }
383
384         return priority;
385 }
386
387 static char *audit_prefix(TALLOC_CTX *ctx, connection_struct *conn)
388 {
389         char *prefix = NULL;
390         char *result;
391
392         prefix = talloc_strdup(ctx,
393                         lp_parm_const_string(SNUM(conn), "full_audit",
394                                              "prefix", "%u|%I"));
395         if (!prefix) {
396                 return NULL;
397         }
398         result = talloc_sub_advanced(ctx,
399                         lp_servicename(SNUM(conn)),
400                         conn->session_info->unix_name,
401                         conn->connectpath,
402                         conn->session_info->utok.gid,
403                         conn->session_info->sanitized_username,
404                         conn->session_info->info3->base.domain.string,
405                         prefix);
406         TALLOC_FREE(prefix);
407         return result;
408 }
409
410 static bool log_success(vfs_handle_struct *handle, vfs_op_type op)
411 {
412         struct vfs_full_audit_private_data *pd = NULL;
413
414         SMB_VFS_HANDLE_GET_DATA(handle, pd,
415                 struct vfs_full_audit_private_data,
416                 return True);
417
418         if (pd->success_ops == NULL) {
419                 return True;
420         }
421
422         return bitmap_query(pd->success_ops, op);
423 }
424
425 static bool log_failure(vfs_handle_struct *handle, vfs_op_type op)
426 {
427         struct vfs_full_audit_private_data *pd = NULL;
428
429         SMB_VFS_HANDLE_GET_DATA(handle, pd,
430                 struct vfs_full_audit_private_data,
431                 return True);
432
433         if (pd->failure_ops == NULL)
434                 return True;
435
436         return bitmap_query(pd->failure_ops, op);
437 }
438
439 static struct bitmap *init_bitmap(TALLOC_CTX *mem_ctx, const char **ops)
440 {
441         struct bitmap *bm;
442
443         if (ops == NULL) {
444                 return NULL;
445         }
446
447         bm = bitmap_talloc(mem_ctx, SMB_VFS_OP_LAST);
448         if (bm == NULL) {
449                 DEBUG(0, ("Could not alloc bitmap -- "
450                           "defaulting to logging everything\n"));
451                 return NULL;
452         }
453
454         for (; *ops != NULL; ops += 1) {
455                 int i;
456                 bool neg = false;
457                 const char *op;
458
459                 if (strequal(*ops, "all")) {
460                         for (i=0; i<SMB_VFS_OP_LAST; i++) {
461                                 bitmap_set(bm, i);
462                         }
463                         continue;
464                 }
465
466                 if (strequal(*ops, "none")) {
467                         break;
468                 }
469
470                 op = ops[0];
471                 if (op[0] == '!') {
472                         neg = true;
473                         op += 1;
474                 }
475
476                 for (i=0; i<SMB_VFS_OP_LAST; i++) {
477                         if (vfs_op_names[i].name == NULL) {
478                                 smb_panic("vfs_full_audit.c: name table not "
479                                           "in sync with vfs.h\n");
480                         }
481                         if (strequal(op, vfs_op_names[i].name)) {
482                                 if (neg) {
483                                         bitmap_clear(bm, i);
484                                 } else {
485                                         bitmap_set(bm, i);
486                                 }
487                                 break;
488                         }
489                 }
490                 if (i == SMB_VFS_OP_LAST) {
491                         DEBUG(0, ("Could not find opname %s, logging all\n",
492                                   *ops));
493                         TALLOC_FREE(bm);
494                         return NULL;
495                 }
496         }
497         return bm;
498 }
499
500 static const char *audit_opname(vfs_op_type op)
501 {
502         if (op >= SMB_VFS_OP_LAST)
503                 return "INVALID VFS OP";
504         return vfs_op_names[op].name;
505 }
506
507 static TALLOC_CTX *tmp_do_log_ctx;
508 /*
509  * Get us a temporary talloc context usable just for DEBUG arguments
510  */
511 static TALLOC_CTX *do_log_ctx(void)
512 {
513         if (tmp_do_log_ctx == NULL) {
514                 tmp_do_log_ctx = talloc_named_const(NULL, 0, "do_log_ctx");
515         }
516         return tmp_do_log_ctx;
517 }
518
519 static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
520                    const char *format, ...)
521 {
522         fstring err_msg;
523         char *audit_pre = NULL;
524         va_list ap;
525         char *op_msg = NULL;
526         int priority;
527
528         if (success && (!log_success(handle, op)))
529                 goto out;
530
531         if (!success && (!log_failure(handle, op)))
532                 goto out;
533
534         if (success)
535                 fstrcpy(err_msg, "ok");
536         else
537                 fstr_sprintf(err_msg, "fail (%s)", strerror(errno));
538
539         va_start(ap, format);
540         op_msg = talloc_vasprintf(talloc_tos(), format, ap);
541         va_end(ap);
542
543         if (!op_msg) {
544                 goto out;
545         }
546
547         /*
548          * Specify the facility to interoperate with other syslog callers
549          * (smbd for example).
550          */
551         priority = audit_syslog_priority(handle) |
552             audit_syslog_facility(handle);
553
554         audit_pre = audit_prefix(talloc_tos(), handle->conn);
555         syslog(priority, "%s|%s|%s|%s\n",
556                 audit_pre ? audit_pre : "",
557                 audit_opname(op), err_msg, op_msg);
558
559  out:
560         TALLOC_FREE(audit_pre);
561         TALLOC_FREE(op_msg);
562         TALLOC_FREE(tmp_do_log_ctx);
563
564         return;
565 }
566
567 /**
568  * Return a string using the do_log_ctx()
569  */
570 static const char *smb_fname_str_do_log(const struct smb_filename *smb_fname)
571 {
572         char *fname = NULL;
573         NTSTATUS status;
574
575         if (smb_fname == NULL) {
576                 return "";
577         }
578         status = get_full_smb_filename(do_log_ctx(), smb_fname, &fname);
579         if (!NT_STATUS_IS_OK(status)) {
580                 return "";
581         }
582         return fname;
583 }
584
585 /**
586  * Return an fsp debug string using the do_log_ctx()
587  */
588 static const char *fsp_str_do_log(const struct files_struct *fsp)
589 {
590         return smb_fname_str_do_log(fsp->fsp_name);
591 }
592
593 /* Implementation of vfs_ops.  Pass everything on to the default
594    operation but log event first. */
595
596 static int smb_full_audit_connect(vfs_handle_struct *handle,
597                          const char *svc, const char *user)
598 {
599         int result;
600         struct vfs_full_audit_private_data *pd = NULL;
601
602         result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
603         if (result < 0) {
604                 return result;
605         }
606
607         pd = TALLOC_ZERO_P(handle, struct vfs_full_audit_private_data);
608         if (!pd) {
609                 SMB_VFS_NEXT_DISCONNECT(handle);
610                 return -1;
611         }
612
613 #ifndef WITH_SYSLOG
614         openlog("smbd_audit", 0, audit_syslog_facility(handle));
615 #endif
616
617         pd->success_ops = init_bitmap(
618                 pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
619                                         "success", NULL));
620         pd->failure_ops = init_bitmap(
621                 pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
622                                         "failure", NULL));
623
624         /* Store the private data. */
625         SMB_VFS_HANDLE_SET_DATA(handle, pd, NULL,
626                                 struct vfs_full_audit_private_data, return -1);
627
628         do_log(SMB_VFS_OP_CONNECT, True, handle,
629                "%s", svc);
630
631         return 0;
632 }
633
634 static void smb_full_audit_disconnect(vfs_handle_struct *handle)
635 {
636         SMB_VFS_NEXT_DISCONNECT(handle);
637
638         do_log(SMB_VFS_OP_DISCONNECT, True, handle,
639                "%s", lp_servicename(SNUM(handle->conn)));
640
641         /* The bitmaps will be disconnected when the private
642            data is deleted. */
643
644         return;
645 }
646
647 static uint64_t smb_full_audit_disk_free(vfs_handle_struct *handle,
648                                     const char *path,
649                                     bool small_query, uint64_t *bsize, 
650                                     uint64_t *dfree, uint64_t *dsize)
651 {
652         uint64_t result;
653
654         result = SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize,
655                                         dfree, dsize);
656
657         /* Don't have a reasonable notion of failure here */
658
659         do_log(SMB_VFS_OP_DISK_FREE, True, handle, "%s", path);
660
661         return result;
662 }
663
664 static int smb_full_audit_get_quota(struct vfs_handle_struct *handle,
665                            enum SMB_QUOTA_TYPE qtype, unid_t id,
666                            SMB_DISK_QUOTA *qt)
667 {
668         int result;
669
670         result = SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, qt);
671
672         do_log(SMB_VFS_OP_GET_QUOTA, (result >= 0), handle, "");
673
674         return result;
675 }
676
677         
678 static int smb_full_audit_set_quota(struct vfs_handle_struct *handle,
679                            enum SMB_QUOTA_TYPE qtype, unid_t id,
680                            SMB_DISK_QUOTA *qt)
681 {
682         int result;
683
684         result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
685
686         do_log(SMB_VFS_OP_SET_QUOTA, (result >= 0), handle, "");
687
688         return result;
689 }
690
691 static int smb_full_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
692                                 struct files_struct *fsp,
693                                 SHADOW_COPY_DATA *shadow_copy_data, bool labels)
694 {
695         int result;
696
697         result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp, shadow_copy_data, labels);
698
699         do_log(SMB_VFS_OP_GET_SHADOW_COPY_DATA, (result >= 0), handle, "");
700
701         return result;
702 }
703
704 static int smb_full_audit_statvfs(struct vfs_handle_struct *handle,
705                                 const char *path,
706                                 struct vfs_statvfs_struct *statbuf)
707 {
708         int result;
709
710         result = SMB_VFS_NEXT_STATVFS(handle, path, statbuf);
711
712         do_log(SMB_VFS_OP_STATVFS, (result >= 0), handle, "");
713
714         return result;
715 }
716
717 static uint32_t smb_full_audit_fs_capabilities(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res)
718 {
719         int result;
720
721         result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
722
723         do_log(SMB_VFS_OP_FS_CAPABILITIES, true, handle, "");
724
725         return result;
726 }
727
728 static SMB_STRUCT_DIR *smb_full_audit_opendir(vfs_handle_struct *handle,
729                           const char *fname, const char *mask, uint32 attr)
730 {
731         SMB_STRUCT_DIR *result;
732
733         result = SMB_VFS_NEXT_OPENDIR(handle, fname, mask, attr);
734
735         do_log(SMB_VFS_OP_OPENDIR, (result != NULL), handle, "%s", fname);
736
737         return result;
738 }
739
740 static SMB_STRUCT_DIR *smb_full_audit_fdopendir(vfs_handle_struct *handle,
741                           files_struct *fsp, const char *mask, uint32 attr)
742 {
743         SMB_STRUCT_DIR *result;
744
745         result = SMB_VFS_NEXT_FDOPENDIR(handle, fsp, mask, attr);
746
747         do_log(SMB_VFS_OP_FDOPENDIR, (result != NULL), handle, "%s",
748                         fsp_str_do_log(fsp));
749
750         return result;
751 }
752
753 static SMB_STRUCT_DIRENT *smb_full_audit_readdir(vfs_handle_struct *handle,
754                                     SMB_STRUCT_DIR *dirp, SMB_STRUCT_STAT *sbuf)
755 {
756         SMB_STRUCT_DIRENT *result;
757
758         result = SMB_VFS_NEXT_READDIR(handle, dirp, sbuf);
759
760         /* This operation has no reasonable error condition
761          * (End of dir is also failure), so always succeed.
762          */
763         do_log(SMB_VFS_OP_READDIR, True, handle, "");
764
765         return result;
766 }
767
768 static void smb_full_audit_seekdir(vfs_handle_struct *handle,
769                         SMB_STRUCT_DIR *dirp, long offset)
770 {
771         SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
772
773         do_log(SMB_VFS_OP_SEEKDIR, True, handle, "");
774         return;
775 }
776
777 static long smb_full_audit_telldir(vfs_handle_struct *handle,
778                         SMB_STRUCT_DIR *dirp)
779 {
780         long result;
781
782         result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
783
784         do_log(SMB_VFS_OP_TELLDIR, True, handle, "");
785
786         return result;
787 }
788
789 static void smb_full_audit_rewinddir(vfs_handle_struct *handle,
790                         SMB_STRUCT_DIR *dirp)
791 {
792         SMB_VFS_NEXT_REWINDDIR(handle, dirp);
793
794         do_log(SMB_VFS_OP_REWINDDIR, True, handle, "");
795         return;
796 }
797
798 static int smb_full_audit_mkdir(vfs_handle_struct *handle,
799                        const char *path, mode_t mode)
800 {
801         int result;
802         
803         result = SMB_VFS_NEXT_MKDIR(handle, path, mode);
804         
805         do_log(SMB_VFS_OP_MKDIR, (result >= 0), handle, "%s", path);
806
807         return result;
808 }
809
810 static int smb_full_audit_rmdir(vfs_handle_struct *handle,
811                        const char *path)
812 {
813         int result;
814         
815         result = SMB_VFS_NEXT_RMDIR(handle, path);
816
817         do_log(SMB_VFS_OP_RMDIR, (result >= 0), handle, "%s", path);
818
819         return result;
820 }
821
822 static int smb_full_audit_closedir(vfs_handle_struct *handle,
823                           SMB_STRUCT_DIR *dirp)
824 {
825         int result;
826
827         result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
828         
829         do_log(SMB_VFS_OP_CLOSEDIR, (result >= 0), handle, "");
830
831         return result;
832 }
833
834 static void smb_full_audit_init_search_op(vfs_handle_struct *handle,
835                         SMB_STRUCT_DIR *dirp)
836 {
837         SMB_VFS_NEXT_INIT_SEARCH_OP(handle, dirp);
838
839         do_log(SMB_VFS_OP_INIT_SEARCH_OP, True, handle, "");
840         return;
841 }
842
843 static int smb_full_audit_open(vfs_handle_struct *handle,
844                                struct smb_filename *smb_fname,
845                                files_struct *fsp, int flags, mode_t mode)
846 {
847         int result;
848         
849         result = SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode);
850
851         do_log(SMB_VFS_OP_OPEN, (result >= 0), handle, "%s|%s",
852                ((flags & O_WRONLY) || (flags & O_RDWR))?"w":"r",
853                smb_fname_str_do_log(smb_fname));
854
855         return result;
856 }
857
858 static NTSTATUS smb_full_audit_create_file(vfs_handle_struct *handle,
859                                       struct smb_request *req,
860                                       uint16_t root_dir_fid,
861                                       struct smb_filename *smb_fname,
862                                       uint32_t access_mask,
863                                       uint32_t share_access,
864                                       uint32_t create_disposition,
865                                       uint32_t create_options,
866                                       uint32_t file_attributes,
867                                       uint32_t oplock_request,
868                                       uint64_t allocation_size,
869                                       uint32_t private_flags,
870                                       struct security_descriptor *sd,
871                                       struct ea_list *ea_list,
872                                       files_struct **result_fsp,
873                                       int *pinfo)
874 {
875         NTSTATUS result;
876         const char* str_create_disposition;
877
878         switch (create_disposition) {
879         case FILE_SUPERSEDE:
880                 str_create_disposition = "supersede";
881                 break;
882         case FILE_OVERWRITE_IF:
883                 str_create_disposition = "overwrite_if";
884                 break;
885         case FILE_OPEN:
886                 str_create_disposition = "open";
887                 break;
888         case FILE_OVERWRITE:
889                 str_create_disposition = "overwrite";
890                 break;
891         case FILE_CREATE:
892                 str_create_disposition = "create";
893                 break;
894         case FILE_OPEN_IF:
895                 str_create_disposition = "open_if";
896                 break;
897         default:
898                 str_create_disposition = "unknown";
899         }
900
901         result = SMB_VFS_NEXT_CREATE_FILE(
902                 handle,                                 /* handle */
903                 req,                                    /* req */
904                 root_dir_fid,                           /* root_dir_fid */
905                 smb_fname,                              /* fname */
906                 access_mask,                            /* access_mask */
907                 share_access,                           /* share_access */
908                 create_disposition,                     /* create_disposition*/
909                 create_options,                         /* create_options */
910                 file_attributes,                        /* file_attributes */
911                 oplock_request,                         /* oplock_request */
912                 allocation_size,                        /* allocation_size */
913                 private_flags,
914                 sd,                                     /* sd */
915                 ea_list,                                /* ea_list */
916                 result_fsp,                             /* result */
917                 pinfo);                                 /* pinfo */
918
919         do_log(SMB_VFS_OP_CREATE_FILE, (NT_STATUS_IS_OK(result)), handle,
920                "0x%x|%s|%s|%s", access_mask,
921                create_options & FILE_DIRECTORY_FILE ? "dir" : "file",
922                str_create_disposition, smb_fname_str_do_log(smb_fname));
923
924         return result;
925 }
926
927 static int smb_full_audit_close(vfs_handle_struct *handle, files_struct *fsp)
928 {
929         int result;
930         
931         result = SMB_VFS_NEXT_CLOSE(handle, fsp);
932
933         do_log(SMB_VFS_OP_CLOSE, (result >= 0), handle, "%s",
934                fsp_str_do_log(fsp));
935
936         return result;
937 }
938
939 static ssize_t smb_full_audit_read(vfs_handle_struct *handle, files_struct *fsp,
940                           void *data, size_t n)
941 {
942         ssize_t result;
943
944         result = SMB_VFS_NEXT_READ(handle, fsp, data, n);
945
946         do_log(SMB_VFS_OP_READ, (result >= 0), handle, "%s",
947                fsp_str_do_log(fsp));
948
949         return result;
950 }
951
952 static ssize_t smb_full_audit_pread(vfs_handle_struct *handle, files_struct *fsp,
953                            void *data, size_t n, SMB_OFF_T offset)
954 {
955         ssize_t result;
956
957         result = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
958
959         do_log(SMB_VFS_OP_PREAD, (result >= 0), handle, "%s",
960                fsp_str_do_log(fsp));
961
962         return result;
963 }
964
965 static ssize_t smb_full_audit_write(vfs_handle_struct *handle, files_struct *fsp,
966                            const void *data, size_t n)
967 {
968         ssize_t result;
969
970         result = SMB_VFS_NEXT_WRITE(handle, fsp, data, n);
971
972         do_log(SMB_VFS_OP_WRITE, (result >= 0), handle, "%s",
973                fsp_str_do_log(fsp));
974
975         return result;
976 }
977
978 static ssize_t smb_full_audit_pwrite(vfs_handle_struct *handle, files_struct *fsp,
979                             const void *data, size_t n,
980                             SMB_OFF_T offset)
981 {
982         ssize_t result;
983
984         result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
985
986         do_log(SMB_VFS_OP_PWRITE, (result >= 0), handle, "%s",
987                fsp_str_do_log(fsp));
988
989         return result;
990 }
991
992 static SMB_OFF_T smb_full_audit_lseek(vfs_handle_struct *handle, files_struct *fsp,
993                              SMB_OFF_T offset, int whence)
994 {
995         ssize_t result;
996
997         result = SMB_VFS_NEXT_LSEEK(handle, fsp, offset, whence);
998
999         do_log(SMB_VFS_OP_LSEEK, (result != (ssize_t)-1), handle,
1000                "%s", fsp_str_do_log(fsp));
1001
1002         return result;
1003 }
1004
1005 static ssize_t smb_full_audit_sendfile(vfs_handle_struct *handle, int tofd,
1006                               files_struct *fromfsp,
1007                               const DATA_BLOB *hdr, SMB_OFF_T offset,
1008                               size_t n)
1009 {
1010         ssize_t result;
1011
1012         result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fromfsp, hdr, offset, n);
1013
1014         do_log(SMB_VFS_OP_SENDFILE, (result >= 0), handle,
1015                "%s", fsp_str_do_log(fromfsp));
1016
1017         return result;
1018 }
1019
1020 static ssize_t smb_full_audit_recvfile(vfs_handle_struct *handle, int fromfd,
1021                       files_struct *tofsp,
1022                               SMB_OFF_T offset,
1023                               size_t n)
1024 {
1025         ssize_t result;
1026
1027         result = SMB_VFS_NEXT_RECVFILE(handle, fromfd, tofsp, offset, n);
1028
1029         do_log(SMB_VFS_OP_RECVFILE, (result >= 0), handle,
1030                "%s", fsp_str_do_log(tofsp));
1031
1032         return result;
1033 }
1034
1035 static int smb_full_audit_rename(vfs_handle_struct *handle,
1036                                  const struct smb_filename *smb_fname_src,
1037                                  const struct smb_filename *smb_fname_dst)
1038 {
1039         int result;
1040         
1041         result = SMB_VFS_NEXT_RENAME(handle, smb_fname_src, smb_fname_dst);
1042
1043         do_log(SMB_VFS_OP_RENAME, (result >= 0), handle, "%s|%s",
1044                smb_fname_str_do_log(smb_fname_src),
1045                smb_fname_str_do_log(smb_fname_dst));
1046
1047         return result;    
1048 }
1049
1050 static int smb_full_audit_fsync(vfs_handle_struct *handle, files_struct *fsp)
1051 {
1052         int result;
1053         
1054         result = SMB_VFS_NEXT_FSYNC(handle, fsp);
1055
1056         do_log(SMB_VFS_OP_FSYNC, (result >= 0), handle, "%s",
1057                fsp_str_do_log(fsp));
1058
1059         return result;    
1060 }
1061
1062 static int smb_full_audit_stat(vfs_handle_struct *handle,
1063                                struct smb_filename *smb_fname)
1064 {
1065         int result;
1066         
1067         result = SMB_VFS_NEXT_STAT(handle, smb_fname);
1068
1069         do_log(SMB_VFS_OP_STAT, (result >= 0), handle, "%s",
1070                smb_fname_str_do_log(smb_fname));
1071
1072         return result;    
1073 }
1074
1075 static int smb_full_audit_fstat(vfs_handle_struct *handle, files_struct *fsp,
1076                        SMB_STRUCT_STAT *sbuf)
1077 {
1078         int result;
1079         
1080         result = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
1081
1082         do_log(SMB_VFS_OP_FSTAT, (result >= 0), handle, "%s",
1083                fsp_str_do_log(fsp));
1084
1085         return result;
1086 }
1087
1088 static int smb_full_audit_lstat(vfs_handle_struct *handle,
1089                                 struct smb_filename *smb_fname)
1090 {
1091         int result;
1092         
1093         result = SMB_VFS_NEXT_LSTAT(handle, smb_fname);
1094
1095         do_log(SMB_VFS_OP_LSTAT, (result >= 0), handle, "%s",
1096                smb_fname_str_do_log(smb_fname));
1097
1098         return result;    
1099 }
1100
1101 static uint64_t smb_full_audit_get_alloc_size(vfs_handle_struct *handle,
1102                        files_struct *fsp, const SMB_STRUCT_STAT *sbuf)
1103 {
1104         uint64_t result;
1105
1106         result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
1107
1108         do_log(SMB_VFS_OP_GET_ALLOC_SIZE, (result != (uint64_t)-1), handle,
1109                         "%llu", result);
1110
1111         return result;
1112 }
1113
1114 static int smb_full_audit_unlink(vfs_handle_struct *handle,
1115                                  const struct smb_filename *smb_fname)
1116 {
1117         int result;
1118         
1119         result = SMB_VFS_NEXT_UNLINK(handle, smb_fname);
1120
1121         do_log(SMB_VFS_OP_UNLINK, (result >= 0), handle, "%s",
1122                smb_fname_str_do_log(smb_fname));
1123
1124         return result;
1125 }
1126
1127 static int smb_full_audit_chmod(vfs_handle_struct *handle,
1128                        const char *path, mode_t mode)
1129 {
1130         int result;
1131
1132         result = SMB_VFS_NEXT_CHMOD(handle, path, mode);
1133
1134         do_log(SMB_VFS_OP_CHMOD, (result >= 0), handle, "%s|%o", path, mode);
1135
1136         return result;
1137 }
1138
1139 static int smb_full_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp,
1140                         mode_t mode)
1141 {
1142         int result;
1143         
1144         result = SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
1145
1146         do_log(SMB_VFS_OP_FCHMOD, (result >= 0), handle,
1147                "%s|%o", fsp_str_do_log(fsp), mode);
1148
1149         return result;
1150 }
1151
1152 static int smb_full_audit_chown(vfs_handle_struct *handle,
1153                        const char *path, uid_t uid, gid_t gid)
1154 {
1155         int result;
1156
1157         result = SMB_VFS_NEXT_CHOWN(handle, path, uid, gid);
1158
1159         do_log(SMB_VFS_OP_CHOWN, (result >= 0), handle, "%s|%ld|%ld",
1160                path, (long int)uid, (long int)gid);
1161
1162         return result;
1163 }
1164
1165 static int smb_full_audit_fchown(vfs_handle_struct *handle, files_struct *fsp,
1166                         uid_t uid, gid_t gid)
1167 {
1168         int result;
1169
1170         result = SMB_VFS_NEXT_FCHOWN(handle, fsp, uid, gid);
1171
1172         do_log(SMB_VFS_OP_FCHOWN, (result >= 0), handle, "%s|%ld|%ld",
1173                fsp_str_do_log(fsp), (long int)uid, (long int)gid);
1174
1175         return result;
1176 }
1177
1178 static int smb_full_audit_lchown(vfs_handle_struct *handle,
1179                        const char *path, uid_t uid, gid_t gid)
1180 {
1181         int result;
1182
1183         result = SMB_VFS_NEXT_LCHOWN(handle, path, uid, gid);
1184
1185         do_log(SMB_VFS_OP_LCHOWN, (result >= 0), handle, "%s|%ld|%ld",
1186                path, (long int)uid, (long int)gid);
1187
1188         return result;
1189 }
1190
1191 static int smb_full_audit_chdir(vfs_handle_struct *handle,
1192                        const char *path)
1193 {
1194         int result;
1195
1196         result = SMB_VFS_NEXT_CHDIR(handle, path);
1197
1198         do_log(SMB_VFS_OP_CHDIR, (result >= 0), handle, "chdir|%s", path);
1199
1200         return result;
1201 }
1202
1203 static char *smb_full_audit_getwd(vfs_handle_struct *handle,
1204                          char *path)
1205 {
1206         char *result;
1207
1208         result = SMB_VFS_NEXT_GETWD(handle, path);
1209         
1210         do_log(SMB_VFS_OP_GETWD, (result != NULL), handle, "%s", path);
1211
1212         return result;
1213 }
1214
1215 static int smb_full_audit_ntimes(vfs_handle_struct *handle,
1216                                  const struct smb_filename *smb_fname,
1217                                  struct smb_file_time *ft)
1218 {
1219         int result;
1220
1221         result = SMB_VFS_NEXT_NTIMES(handle, smb_fname, ft);
1222
1223         do_log(SMB_VFS_OP_NTIMES, (result >= 0), handle, "%s",
1224                smb_fname_str_do_log(smb_fname));
1225
1226         return result;
1227 }
1228
1229 static int smb_full_audit_ftruncate(vfs_handle_struct *handle, files_struct *fsp,
1230                            SMB_OFF_T len)
1231 {
1232         int result;
1233
1234         result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len);
1235
1236         do_log(SMB_VFS_OP_FTRUNCATE, (result >= 0), handle,
1237                "%s", fsp_str_do_log(fsp));
1238
1239         return result;
1240 }
1241
1242 static int smb_full_audit_fallocate(vfs_handle_struct *handle, files_struct *fsp,
1243                            enum vfs_fallocate_mode mode,
1244                            SMB_OFF_T offset,
1245                            SMB_OFF_T len)
1246 {
1247         int result;
1248
1249         result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len);
1250
1251         do_log(SMB_VFS_OP_FALLOCATE, (result >= 0), handle,
1252                "%s", fsp_str_do_log(fsp));
1253
1254         return result;
1255 }
1256
1257 static bool smb_full_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
1258                        int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
1259 {
1260         bool result;
1261
1262         result = SMB_VFS_NEXT_LOCK(handle, fsp, op, offset, count, type);
1263
1264         do_log(SMB_VFS_OP_LOCK, result, handle, "%s", fsp_str_do_log(fsp));
1265
1266         return result;
1267 }
1268
1269 static int smb_full_audit_kernel_flock(struct vfs_handle_struct *handle,
1270                                        struct files_struct *fsp,
1271                                        uint32 share_mode, uint32 access_mask)
1272 {
1273         int result;
1274
1275         result = SMB_VFS_NEXT_KERNEL_FLOCK(handle, fsp, share_mode, access_mask);
1276
1277         do_log(SMB_VFS_OP_KERNEL_FLOCK, (result >= 0), handle, "%s",
1278                fsp_str_do_log(fsp));
1279
1280         return result;
1281 }
1282
1283 static int smb_full_audit_linux_setlease(vfs_handle_struct *handle, files_struct *fsp,
1284                                  int leasetype)
1285 {
1286         int result;
1287
1288         result = SMB_VFS_NEXT_LINUX_SETLEASE(handle, fsp, leasetype);
1289
1290         do_log(SMB_VFS_OP_LINUX_SETLEASE, (result >= 0), handle, "%s",
1291                fsp_str_do_log(fsp));
1292
1293         return result;
1294 }
1295
1296 static bool smb_full_audit_getlock(vfs_handle_struct *handle, files_struct *fsp,
1297                        SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1298 {
1299         bool result;
1300
1301         result = SMB_VFS_NEXT_GETLOCK(handle, fsp, poffset, pcount, ptype, ppid);
1302
1303         do_log(SMB_VFS_OP_GETLOCK, result, handle, "%s", fsp_str_do_log(fsp));
1304
1305         return result;
1306 }
1307
1308 static int smb_full_audit_symlink(vfs_handle_struct *handle,
1309                          const char *oldpath, const char *newpath)
1310 {
1311         int result;
1312
1313         result = SMB_VFS_NEXT_SYMLINK(handle, oldpath, newpath);
1314
1315         do_log(SMB_VFS_OP_SYMLINK, (result >= 0), handle,
1316                "%s|%s", oldpath, newpath);
1317
1318         return result;
1319 }
1320
1321 static int smb_full_audit_readlink(vfs_handle_struct *handle,
1322                           const char *path, char *buf, size_t bufsiz)
1323 {
1324         int result;
1325
1326         result = SMB_VFS_NEXT_READLINK(handle, path, buf, bufsiz);
1327
1328         do_log(SMB_VFS_OP_READLINK, (result >= 0), handle, "%s", path);
1329
1330         return result;
1331 }
1332
1333 static int smb_full_audit_link(vfs_handle_struct *handle,
1334                       const char *oldpath, const char *newpath)
1335 {
1336         int result;
1337
1338         result = SMB_VFS_NEXT_LINK(handle, oldpath, newpath);
1339
1340         do_log(SMB_VFS_OP_LINK, (result >= 0), handle,
1341                "%s|%s", oldpath, newpath);
1342
1343         return result;
1344 }
1345
1346 static int smb_full_audit_mknod(vfs_handle_struct *handle,
1347                        const char *pathname, mode_t mode, SMB_DEV_T dev)
1348 {
1349         int result;
1350
1351         result = SMB_VFS_NEXT_MKNOD(handle, pathname, mode, dev);
1352
1353         do_log(SMB_VFS_OP_MKNOD, (result >= 0), handle, "%s", pathname);
1354
1355         return result;
1356 }
1357
1358 static char *smb_full_audit_realpath(vfs_handle_struct *handle,
1359                             const char *path)
1360 {
1361         char *result;
1362
1363         result = SMB_VFS_NEXT_REALPATH(handle, path);
1364
1365         do_log(SMB_VFS_OP_REALPATH, (result != NULL), handle, "%s", path);
1366
1367         return result;
1368 }
1369
1370 static NTSTATUS smb_full_audit_notify_watch(struct vfs_handle_struct *handle,
1371                         struct sys_notify_context *ctx,
1372                         struct notify_entry *e,
1373                         void (*callback)(struct sys_notify_context *ctx,
1374                                         void *private_data,
1375                                         struct notify_event *ev),
1376                         void *private_data, void *handle_p)
1377 {
1378         NTSTATUS result;
1379
1380         result = SMB_VFS_NEXT_NOTIFY_WATCH(handle, ctx, e, callback, private_data, handle_p);
1381
1382         do_log(SMB_VFS_OP_NOTIFY_WATCH, NT_STATUS_IS_OK(result), handle, "");
1383
1384         return result;
1385 }
1386
1387 static int smb_full_audit_chflags(vfs_handle_struct *handle,
1388                             const char *path, unsigned int flags)
1389 {
1390         int result;
1391
1392         result = SMB_VFS_NEXT_CHFLAGS(handle, path, flags);
1393
1394         do_log(SMB_VFS_OP_CHFLAGS, (result != 0), handle, "%s", path);
1395
1396         return result;
1397 }
1398
1399 static struct file_id smb_full_audit_file_id_create(struct vfs_handle_struct *handle,
1400                                                     const SMB_STRUCT_STAT *sbuf)
1401 {
1402         struct file_id id_zero;
1403         struct file_id result;
1404
1405         ZERO_STRUCT(id_zero);
1406
1407         result = SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
1408
1409         do_log(SMB_VFS_OP_FILE_ID_CREATE,
1410                !file_id_equal(&id_zero, &result),
1411                handle, "%s", file_id_string_tos(&result));
1412
1413         return result;
1414 }
1415
1416 static NTSTATUS smb_full_audit_streaminfo(vfs_handle_struct *handle,
1417                                           struct files_struct *fsp,
1418                                           const char *fname,
1419                                           TALLOC_CTX *mem_ctx,
1420                                           unsigned int *pnum_streams,
1421                                           struct stream_struct **pstreams)
1422 {
1423         NTSTATUS result;
1424
1425         result = SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx,
1426                                          pnum_streams, pstreams);
1427
1428         do_log(SMB_VFS_OP_STREAMINFO, NT_STATUS_IS_OK(result), handle,
1429                "%s", fname);
1430
1431         return result;
1432 }
1433
1434 static int smb_full_audit_get_real_filename(struct vfs_handle_struct *handle,
1435                                             const char *path,
1436                                             const char *name,
1437                                             TALLOC_CTX *mem_ctx,
1438                                             char **found_name)
1439 {
1440         int result;
1441
1442         result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx,
1443                                                 found_name);
1444
1445         do_log(SMB_VFS_OP_GET_REAL_FILENAME, (result == 0), handle,
1446                "%s/%s->%s", path, name, (result == 0) ? "" : *found_name);
1447
1448         return result;
1449 }
1450
1451 static const char *smb_full_audit_connectpath(vfs_handle_struct *handle,
1452                                               const char *fname)
1453 {
1454         const char *result;
1455
1456         result = SMB_VFS_NEXT_CONNECTPATH(handle, fname);
1457
1458         do_log(SMB_VFS_OP_CONNECTPATH, result != NULL, handle,
1459                "%s", fname);
1460
1461         return result;
1462 }
1463
1464 static NTSTATUS smb_full_audit_brl_lock_windows(struct vfs_handle_struct *handle,
1465                                                 struct byte_range_lock *br_lck,
1466                                                 struct lock_struct *plock,
1467                                                 bool blocking_lock,
1468                                                 struct blocking_lock_record *blr)
1469 {
1470         NTSTATUS result;
1471
1472         result = SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock,
1473             blocking_lock, blr);
1474
1475         do_log(SMB_VFS_OP_BRL_LOCK_WINDOWS, NT_STATUS_IS_OK(result), handle,
1476             "%s:%llu-%llu. type=%d. blocking=%d", fsp_str_do_log(br_lck->fsp),
1477             plock->start, plock->size, plock->lock_type, blocking_lock );
1478
1479         return result;
1480 }
1481
1482 static bool smb_full_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
1483                                               struct messaging_context *msg_ctx,
1484                                               struct byte_range_lock *br_lck,
1485                                               const struct lock_struct *plock)
1486 {
1487         bool result;
1488
1489         result = SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, msg_ctx, br_lck,
1490             plock);
1491
1492         do_log(SMB_VFS_OP_BRL_UNLOCK_WINDOWS, (result == 0), handle,
1493             "%s:%llu-%llu:%d", fsp_str_do_log(br_lck->fsp), plock->start,
1494             plock->size, plock->lock_type);
1495
1496         return result;
1497 }
1498
1499 static bool smb_full_audit_brl_cancel_windows(struct vfs_handle_struct *handle,
1500                                               struct byte_range_lock *br_lck,
1501                                               struct lock_struct *plock,
1502                                               struct blocking_lock_record *blr)
1503 {
1504         bool result;
1505
1506         result = SMB_VFS_NEXT_BRL_CANCEL_WINDOWS(handle, br_lck, plock, blr);
1507
1508         do_log(SMB_VFS_OP_BRL_CANCEL_WINDOWS, (result == 0), handle,
1509             "%s:%llu-%llu:%d", fsp_str_do_log(br_lck->fsp), plock->start,
1510             plock->size);
1511
1512         return result;
1513 }
1514
1515 static bool smb_full_audit_strict_lock(struct vfs_handle_struct *handle,
1516                                        struct files_struct *fsp,
1517                                        struct lock_struct *plock)
1518 {
1519         bool result;
1520
1521         result = SMB_VFS_NEXT_STRICT_LOCK(handle, fsp, plock);
1522
1523         do_log(SMB_VFS_OP_STRICT_LOCK, result, handle,
1524             "%s:%llu-%llu:%d", fsp_str_do_log(fsp), plock->start,
1525             plock->size);
1526
1527         return result;
1528 }
1529
1530 static void smb_full_audit_strict_unlock(struct vfs_handle_struct *handle,
1531                                          struct files_struct *fsp,
1532                                          struct lock_struct *plock)
1533 {
1534         SMB_VFS_NEXT_STRICT_UNLOCK(handle, fsp, plock);
1535
1536         do_log(SMB_VFS_OP_STRICT_UNLOCK, true, handle,
1537             "%s:%llu-%llu:%d", fsp_str_do_log(fsp), plock->start,
1538             plock->size);
1539
1540         return;
1541 }
1542
1543 static NTSTATUS smb_full_audit_translate_name(struct vfs_handle_struct *handle,
1544                                               const char *name,
1545                                               enum vfs_translate_direction direction,
1546                                               TALLOC_CTX *mem_ctx,
1547                                               char **mapped_name)
1548 {
1549         NTSTATUS result;
1550
1551         result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx,
1552                                              mapped_name);
1553
1554         do_log(SMB_VFS_OP_TRANSLATE_NAME, NT_STATUS_IS_OK(result), handle, "");
1555
1556         return result;
1557 }
1558
1559 static NTSTATUS smb_full_audit_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1560                                 uint32 security_info,
1561                                 struct security_descriptor **ppdesc)
1562 {
1563         NTSTATUS result;
1564
1565         result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, security_info, ppdesc);
1566
1567         do_log(SMB_VFS_OP_FGET_NT_ACL, NT_STATUS_IS_OK(result), handle,
1568                "%s", fsp_str_do_log(fsp));
1569
1570         return result;
1571 }
1572
1573 static NTSTATUS smb_full_audit_get_nt_acl(vfs_handle_struct *handle,
1574                                           const char *name,
1575                                           uint32 security_info,
1576                                           struct security_descriptor **ppdesc)
1577 {
1578         NTSTATUS result;
1579
1580         result = SMB_VFS_NEXT_GET_NT_ACL(handle, name, security_info, ppdesc);
1581
1582         do_log(SMB_VFS_OP_GET_NT_ACL, NT_STATUS_IS_OK(result), handle,
1583                "%s", name);
1584
1585         return result;
1586 }
1587
1588 static NTSTATUS smb_full_audit_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1589                               uint32 security_info_sent,
1590                               const struct security_descriptor *psd)
1591 {
1592         NTSTATUS result;
1593
1594         result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, security_info_sent, psd);
1595
1596         do_log(SMB_VFS_OP_FSET_NT_ACL, NT_STATUS_IS_OK(result), handle, "%s",
1597                fsp_str_do_log(fsp));
1598
1599         return result;
1600 }
1601
1602 static int smb_full_audit_chmod_acl(vfs_handle_struct *handle,
1603                            const char *path, mode_t mode)
1604 {
1605         int result;
1606         
1607         result = SMB_VFS_NEXT_CHMOD_ACL(handle, path, mode);
1608
1609         do_log(SMB_VFS_OP_CHMOD_ACL, (result >= 0), handle,
1610                "%s|%o", path, mode);
1611
1612         return result;
1613 }
1614
1615 static int smb_full_audit_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp,
1616                                      mode_t mode)
1617 {
1618         int result;
1619         
1620         result = SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, mode);
1621
1622         do_log(SMB_VFS_OP_FCHMOD_ACL, (result >= 0), handle,
1623                "%s|%o", fsp_str_do_log(fsp), mode);
1624
1625         return result;
1626 }
1627
1628 static int smb_full_audit_sys_acl_get_entry(vfs_handle_struct *handle,
1629
1630                                    SMB_ACL_T theacl, int entry_id,
1631                                    SMB_ACL_ENTRY_T *entry_p)
1632 {
1633         int result;
1634
1635         result = SMB_VFS_NEXT_SYS_ACL_GET_ENTRY(handle, theacl, entry_id,
1636                                                 entry_p);
1637
1638         do_log(SMB_VFS_OP_SYS_ACL_GET_ENTRY, (result >= 0), handle,
1639                "");
1640
1641         return result;
1642 }
1643
1644 static int smb_full_audit_sys_acl_get_tag_type(vfs_handle_struct *handle,
1645
1646                                       SMB_ACL_ENTRY_T entry_d,
1647                                       SMB_ACL_TAG_T *tag_type_p)
1648 {
1649         int result;
1650
1651         result = SMB_VFS_NEXT_SYS_ACL_GET_TAG_TYPE(handle, entry_d,
1652                                                    tag_type_p);
1653
1654         do_log(SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE, (result >= 0), handle,
1655                "");
1656
1657         return result;
1658 }
1659
1660 static int smb_full_audit_sys_acl_get_permset(vfs_handle_struct *handle,
1661
1662                                      SMB_ACL_ENTRY_T entry_d,
1663                                      SMB_ACL_PERMSET_T *permset_p)
1664 {
1665         int result;
1666
1667         result = SMB_VFS_NEXT_SYS_ACL_GET_PERMSET(handle, entry_d,
1668                                                   permset_p);
1669
1670         do_log(SMB_VFS_OP_SYS_ACL_GET_PERMSET, (result >= 0), handle,
1671                "");
1672
1673         return result;
1674 }
1675
1676 static void * smb_full_audit_sys_acl_get_qualifier(vfs_handle_struct *handle,
1677
1678                                           SMB_ACL_ENTRY_T entry_d)
1679 {
1680         void *result;
1681
1682         result = SMB_VFS_NEXT_SYS_ACL_GET_QUALIFIER(handle, entry_d);
1683
1684         do_log(SMB_VFS_OP_SYS_ACL_GET_QUALIFIER, (result != NULL), handle,
1685                "");
1686
1687         return result;
1688 }
1689
1690 static SMB_ACL_T smb_full_audit_sys_acl_get_file(vfs_handle_struct *handle,
1691                                         const char *path_p,
1692                                         SMB_ACL_TYPE_T type)
1693 {
1694         SMB_ACL_T result;
1695
1696         result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, path_p, type);
1697
1698         do_log(SMB_VFS_OP_SYS_ACL_GET_FILE, (result != NULL), handle,
1699                "%s", path_p);
1700
1701         return result;
1702 }
1703
1704 static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
1705                                       files_struct *fsp)
1706 {
1707         SMB_ACL_T result;
1708
1709         result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp);
1710
1711         do_log(SMB_VFS_OP_SYS_ACL_GET_FD, (result != NULL), handle,
1712                "%s", fsp_str_do_log(fsp));
1713
1714         return result;
1715 }
1716
1717 static int smb_full_audit_sys_acl_clear_perms(vfs_handle_struct *handle,
1718
1719                                      SMB_ACL_PERMSET_T permset)
1720 {
1721         int result;
1722
1723         result = SMB_VFS_NEXT_SYS_ACL_CLEAR_PERMS(handle, permset);
1724
1725         do_log(SMB_VFS_OP_SYS_ACL_CLEAR_PERMS, (result >= 0), handle,
1726                "");
1727
1728         return result;
1729 }
1730
1731 static int smb_full_audit_sys_acl_add_perm(vfs_handle_struct *handle,
1732
1733                                   SMB_ACL_PERMSET_T permset,
1734                                   SMB_ACL_PERM_T perm)
1735 {
1736         int result;
1737
1738         result = SMB_VFS_NEXT_SYS_ACL_ADD_PERM(handle, permset, perm);
1739
1740         do_log(SMB_VFS_OP_SYS_ACL_ADD_PERM, (result >= 0), handle,
1741                "");
1742
1743         return result;
1744 }
1745
1746 static char * smb_full_audit_sys_acl_to_text(vfs_handle_struct *handle,
1747                                     SMB_ACL_T theacl,
1748                                     ssize_t *plen)
1749 {
1750         char * result;
1751
1752         result = SMB_VFS_NEXT_SYS_ACL_TO_TEXT(handle, theacl, plen);
1753
1754         do_log(SMB_VFS_OP_SYS_ACL_TO_TEXT, (result != NULL), handle,
1755                "");
1756
1757         return result;
1758 }
1759
1760 static SMB_ACL_T smb_full_audit_sys_acl_init(vfs_handle_struct *handle,
1761
1762                                     int count)
1763 {
1764         SMB_ACL_T result;
1765
1766         result = SMB_VFS_NEXT_SYS_ACL_INIT(handle, count);
1767
1768         do_log(SMB_VFS_OP_SYS_ACL_INIT, (result != NULL), handle,
1769                "");
1770
1771         return result;
1772 }
1773
1774 static int smb_full_audit_sys_acl_create_entry(vfs_handle_struct *handle,
1775                                       SMB_ACL_T *pacl,
1776                                       SMB_ACL_ENTRY_T *pentry)
1777 {
1778         int result;
1779
1780         result = SMB_VFS_NEXT_SYS_ACL_CREATE_ENTRY(handle, pacl, pentry);
1781
1782         do_log(SMB_VFS_OP_SYS_ACL_CREATE_ENTRY, (result >= 0), handle,
1783                "");
1784
1785         return result;
1786 }
1787
1788 static int smb_full_audit_sys_acl_set_tag_type(vfs_handle_struct *handle,
1789
1790                                       SMB_ACL_ENTRY_T entry,
1791                                       SMB_ACL_TAG_T tagtype)
1792 {
1793         int result;
1794
1795         result = SMB_VFS_NEXT_SYS_ACL_SET_TAG_TYPE(handle, entry,
1796                                                    tagtype);
1797
1798         do_log(SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE, (result >= 0), handle,
1799                "");
1800
1801         return result;
1802 }
1803
1804 static int smb_full_audit_sys_acl_set_qualifier(vfs_handle_struct *handle,
1805
1806                                        SMB_ACL_ENTRY_T entry,
1807                                        void *qual)
1808 {
1809         int result;
1810
1811         result = SMB_VFS_NEXT_SYS_ACL_SET_QUALIFIER(handle, entry, qual);
1812
1813         do_log(SMB_VFS_OP_SYS_ACL_SET_QUALIFIER, (result >= 0), handle,
1814                "");
1815
1816         return result;
1817 }
1818
1819 static int smb_full_audit_sys_acl_set_permset(vfs_handle_struct *handle,
1820
1821                                      SMB_ACL_ENTRY_T entry,
1822                                      SMB_ACL_PERMSET_T permset)
1823 {
1824         int result;
1825
1826         result = SMB_VFS_NEXT_SYS_ACL_SET_PERMSET(handle, entry, permset);
1827
1828         do_log(SMB_VFS_OP_SYS_ACL_SET_PERMSET, (result >= 0), handle,
1829                "");
1830
1831         return result;
1832 }
1833
1834 static int smb_full_audit_sys_acl_valid(vfs_handle_struct *handle,
1835
1836                                SMB_ACL_T theacl )
1837 {
1838         int result;
1839
1840         result = SMB_VFS_NEXT_SYS_ACL_VALID(handle, theacl);
1841
1842         do_log(SMB_VFS_OP_SYS_ACL_VALID, (result >= 0), handle,
1843                "");
1844
1845         return result;
1846 }
1847
1848 static int smb_full_audit_sys_acl_set_file(vfs_handle_struct *handle,
1849
1850                                   const char *name, SMB_ACL_TYPE_T acltype,
1851                                   SMB_ACL_T theacl)
1852 {
1853         int result;
1854
1855         result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, name, acltype,
1856                                                theacl);
1857
1858         do_log(SMB_VFS_OP_SYS_ACL_SET_FILE, (result >= 0), handle,
1859                "%s", name);
1860
1861         return result;
1862 }
1863
1864 static int smb_full_audit_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp,
1865                                 SMB_ACL_T theacl)
1866 {
1867         int result;
1868
1869         result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, theacl);
1870
1871         do_log(SMB_VFS_OP_SYS_ACL_SET_FD, (result >= 0), handle,
1872                "%s", fsp_str_do_log(fsp));
1873
1874         return result;
1875 }
1876
1877 static int smb_full_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
1878
1879                                          const char *path)
1880 {
1881         int result;
1882
1883         result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, path);
1884
1885         do_log(SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, (result >= 0), handle,
1886                "%s", path);
1887
1888         return result;
1889 }
1890
1891 static int smb_full_audit_sys_acl_get_perm(vfs_handle_struct *handle,
1892
1893                                   SMB_ACL_PERMSET_T permset,
1894                                   SMB_ACL_PERM_T perm)
1895 {
1896         int result;
1897
1898         result = SMB_VFS_NEXT_SYS_ACL_GET_PERM(handle, permset, perm);
1899
1900         do_log(SMB_VFS_OP_SYS_ACL_GET_PERM, (result >= 0), handle,
1901                "");
1902
1903         return result;
1904 }
1905
1906 static int smb_full_audit_sys_acl_free_text(vfs_handle_struct *handle,
1907
1908                                    char *text)
1909 {
1910         int result;
1911
1912         result = SMB_VFS_NEXT_SYS_ACL_FREE_TEXT(handle, text);
1913
1914         do_log(SMB_VFS_OP_SYS_ACL_FREE_TEXT, (result >= 0), handle,
1915                "");
1916
1917         return result;
1918 }
1919
1920 static int smb_full_audit_sys_acl_free_acl(vfs_handle_struct *handle,
1921
1922                                   SMB_ACL_T posix_acl)
1923 {
1924         int result;
1925
1926         result = SMB_VFS_NEXT_SYS_ACL_FREE_ACL(handle, posix_acl);
1927
1928         do_log(SMB_VFS_OP_SYS_ACL_FREE_ACL, (result >= 0), handle,
1929                "");
1930
1931         return result;
1932 }
1933
1934 static int smb_full_audit_sys_acl_free_qualifier(vfs_handle_struct *handle,
1935                                         void *qualifier,
1936                                         SMB_ACL_TAG_T tagtype)
1937 {
1938         int result;
1939
1940         result = SMB_VFS_NEXT_SYS_ACL_FREE_QUALIFIER(handle, qualifier,
1941                                                      tagtype);
1942
1943         do_log(SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER, (result >= 0), handle,
1944                "");
1945
1946         return result;
1947 }
1948
1949 static ssize_t smb_full_audit_getxattr(struct vfs_handle_struct *handle,
1950                               const char *path,
1951                               const char *name, void *value, size_t size)
1952 {
1953         ssize_t result;
1954
1955         result = SMB_VFS_NEXT_GETXATTR(handle, path, name, value, size);
1956
1957         do_log(SMB_VFS_OP_GETXATTR, (result >= 0), handle,
1958                "%s|%s", path, name);
1959
1960         return result;
1961 }
1962
1963 static ssize_t smb_full_audit_lgetxattr(struct vfs_handle_struct *handle,
1964                                const char *path, const char *name,
1965                                void *value, size_t size)
1966 {
1967         ssize_t result;
1968
1969         result = SMB_VFS_NEXT_LGETXATTR(handle, path, name, value, size);
1970
1971         do_log(SMB_VFS_OP_LGETXATTR, (result >= 0), handle,
1972                "%s|%s", path, name);
1973
1974         return result;
1975 }
1976
1977 static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
1978                                struct files_struct *fsp,
1979                                const char *name, void *value, size_t size)
1980 {
1981         ssize_t result;
1982
1983         result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
1984
1985         do_log(SMB_VFS_OP_FGETXATTR, (result >= 0), handle,
1986                "%s|%s", fsp_str_do_log(fsp), name);
1987
1988         return result;
1989 }
1990
1991 static ssize_t smb_full_audit_listxattr(struct vfs_handle_struct *handle,
1992                                const char *path, char *list, size_t size)
1993 {
1994         ssize_t result;
1995
1996         result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size);
1997
1998         do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s", path);
1999
2000         return result;
2001 }
2002
2003 static ssize_t smb_full_audit_llistxattr(struct vfs_handle_struct *handle,
2004                                 const char *path, char *list, size_t size)
2005 {
2006         ssize_t result;
2007
2008         result = SMB_VFS_NEXT_LLISTXATTR(handle, path, list, size);
2009
2010         do_log(SMB_VFS_OP_LLISTXATTR, (result >= 0), handle, "%s", path);
2011
2012         return result;
2013 }
2014
2015 static ssize_t smb_full_audit_flistxattr(struct vfs_handle_struct *handle,
2016                                 struct files_struct *fsp, char *list,
2017                                 size_t size)
2018 {
2019         ssize_t result;
2020
2021         result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, list, size);
2022
2023         do_log(SMB_VFS_OP_FLISTXATTR, (result >= 0), handle,
2024                "%s", fsp_str_do_log(fsp));
2025
2026         return result;
2027 }
2028
2029 static int smb_full_audit_removexattr(struct vfs_handle_struct *handle,
2030                              const char *path,
2031                              const char *name)
2032 {
2033         int result;
2034
2035         result = SMB_VFS_NEXT_REMOVEXATTR(handle, path, name);
2036
2037         do_log(SMB_VFS_OP_REMOVEXATTR, (result >= 0), handle,
2038                "%s|%s", path, name);
2039
2040         return result;
2041 }
2042
2043 static int smb_full_audit_lremovexattr(struct vfs_handle_struct *handle,
2044                               const char *path,
2045                               const char *name)
2046 {
2047         int result;
2048
2049         result = SMB_VFS_NEXT_LREMOVEXATTR(handle, path, name);
2050
2051         do_log(SMB_VFS_OP_LREMOVEXATTR, (result >= 0), handle,
2052                "%s|%s", path, name);
2053
2054         return result;
2055 }
2056
2057 static int smb_full_audit_fremovexattr(struct vfs_handle_struct *handle,
2058                               struct files_struct *fsp,
2059                               const char *name)
2060 {
2061         int result;
2062
2063         result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, name);
2064
2065         do_log(SMB_VFS_OP_FREMOVEXATTR, (result >= 0), handle,
2066                "%s|%s", fsp_str_do_log(fsp), name);
2067
2068         return result;
2069 }
2070
2071 static int smb_full_audit_setxattr(struct vfs_handle_struct *handle,
2072                           const char *path,
2073                           const char *name, const void *value, size_t size,
2074                           int flags)
2075 {
2076         int result;
2077
2078         result = SMB_VFS_NEXT_SETXATTR(handle, path, name, value, size,
2079                                        flags);
2080
2081         do_log(SMB_VFS_OP_SETXATTR, (result >= 0), handle,
2082                "%s|%s", path, name);
2083
2084         return result;
2085 }
2086
2087 static int smb_full_audit_lsetxattr(struct vfs_handle_struct *handle,
2088                            const char *path,
2089                            const char *name, const void *value, size_t size,
2090                            int flags)
2091 {
2092         int result;
2093
2094         result = SMB_VFS_NEXT_LSETXATTR(handle, path, name, value, size,
2095                                         flags);
2096
2097         do_log(SMB_VFS_OP_LSETXATTR, (result >= 0), handle,
2098                "%s|%s", path, name);
2099
2100         return result;
2101 }
2102
2103 static int smb_full_audit_fsetxattr(struct vfs_handle_struct *handle,
2104                            struct files_struct *fsp, const char *name,
2105                            const void *value, size_t size, int flags)
2106 {
2107         int result;
2108
2109         result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, name, value, size, flags);
2110
2111         do_log(SMB_VFS_OP_FSETXATTR, (result >= 0), handle,
2112                "%s|%s", fsp_str_do_log(fsp), name);
2113
2114         return result;
2115 }
2116
2117 static int smb_full_audit_aio_read(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
2118 {
2119         int result;
2120
2121         result = SMB_VFS_NEXT_AIO_READ(handle, fsp, aiocb);
2122         do_log(SMB_VFS_OP_AIO_READ, (result >= 0), handle,
2123                "%s", fsp_str_do_log(fsp));
2124
2125         return result;
2126 }
2127
2128 static int smb_full_audit_aio_write(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
2129 {
2130         int result;
2131
2132         result = SMB_VFS_NEXT_AIO_WRITE(handle, fsp, aiocb);
2133         do_log(SMB_VFS_OP_AIO_WRITE, (result >= 0), handle,
2134                "%s", fsp_str_do_log(fsp));
2135
2136         return result;
2137 }
2138
2139 static ssize_t smb_full_audit_aio_return(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
2140 {
2141         int result;
2142
2143         result = SMB_VFS_NEXT_AIO_RETURN(handle, fsp, aiocb);
2144         do_log(SMB_VFS_OP_AIO_RETURN, (result >= 0), handle,
2145                "%s", fsp_str_do_log(fsp));
2146
2147         return result;
2148 }
2149
2150 static int smb_full_audit_aio_cancel(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
2151 {
2152         int result;
2153
2154         result = SMB_VFS_NEXT_AIO_CANCEL(handle, fsp, aiocb);
2155         do_log(SMB_VFS_OP_AIO_CANCEL, (result >= 0), handle,
2156                "%s", fsp_str_do_log(fsp));
2157
2158         return result;
2159 }
2160
2161 static int smb_full_audit_aio_error(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)
2162 {
2163         int result;
2164
2165         result = SMB_VFS_NEXT_AIO_ERROR(handle, fsp, aiocb);
2166         do_log(SMB_VFS_OP_AIO_ERROR, (result >= 0), handle,
2167                "%s", fsp_str_do_log(fsp));
2168
2169         return result;
2170 }
2171
2172 static int smb_full_audit_aio_fsync(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb)
2173 {
2174         int result;
2175
2176         result = SMB_VFS_NEXT_AIO_FSYNC(handle, fsp, op, aiocb);
2177         do_log(SMB_VFS_OP_AIO_FSYNC, (result >= 0), handle,
2178                 "%s", fsp_str_do_log(fsp));
2179
2180         return result;
2181 }
2182
2183 static int smb_full_audit_aio_suspend(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_AIOCB * const aiocb[], int n, const struct timespec *ts)
2184 {
2185         int result;
2186
2187         result = SMB_VFS_NEXT_AIO_SUSPEND(handle, fsp, aiocb, n, ts);
2188         do_log(SMB_VFS_OP_AIO_SUSPEND, (result >= 0), handle,
2189                 "%s", fsp_str_do_log(fsp));
2190
2191         return result;
2192 }
2193
2194 static bool smb_full_audit_aio_force(struct vfs_handle_struct *handle,
2195                                      struct files_struct *fsp)
2196 {
2197         bool result;
2198
2199         result = SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
2200         do_log(SMB_VFS_OP_AIO_FORCE, result, handle,
2201                 "%s", fsp_str_do_log(fsp));
2202
2203         return result;
2204 }
2205
2206 static bool smb_full_audit_is_offline(struct vfs_handle_struct *handle,
2207                                       const struct smb_filename *fname,
2208                                       SMB_STRUCT_STAT *sbuf)
2209 {
2210         bool result;
2211
2212         result = SMB_VFS_NEXT_IS_OFFLINE(handle, fname, sbuf);
2213         do_log(SMB_VFS_OP_IS_OFFLINE, result, handle, "%s",
2214                smb_fname_str_do_log(fname));
2215         return result;
2216 }
2217
2218 static int smb_full_audit_set_offline(struct vfs_handle_struct *handle,
2219                                       const struct smb_filename *fname)
2220 {
2221         int result;
2222
2223         result = SMB_VFS_NEXT_SET_OFFLINE(handle, fname);
2224         do_log(SMB_VFS_OP_SET_OFFLINE, result >= 0, handle, "%s",
2225                smb_fname_str_do_log(fname));
2226         return result;
2227 }
2228
2229 static struct vfs_fn_pointers vfs_full_audit_fns = {
2230
2231         /* Disk operations */
2232
2233         .connect_fn = smb_full_audit_connect,
2234         .disconnect = smb_full_audit_disconnect,
2235         .disk_free = smb_full_audit_disk_free,
2236         .get_quota = smb_full_audit_get_quota,
2237         .set_quota = smb_full_audit_set_quota,
2238         .get_shadow_copy_data = smb_full_audit_get_shadow_copy_data,
2239         .statvfs = smb_full_audit_statvfs,
2240         .fs_capabilities = smb_full_audit_fs_capabilities,
2241         .opendir = smb_full_audit_opendir,
2242         .fdopendir = smb_full_audit_fdopendir,
2243         .readdir = smb_full_audit_readdir,
2244         .seekdir = smb_full_audit_seekdir,
2245         .telldir = smb_full_audit_telldir,
2246         .rewind_dir = smb_full_audit_rewinddir,
2247         .mkdir = smb_full_audit_mkdir,
2248         .rmdir = smb_full_audit_rmdir,
2249         .closedir = smb_full_audit_closedir,
2250         .init_search_op = smb_full_audit_init_search_op,
2251         .open = smb_full_audit_open,
2252         .create_file = smb_full_audit_create_file,
2253         .close_fn = smb_full_audit_close,
2254         .vfs_read = smb_full_audit_read,
2255         .pread = smb_full_audit_pread,
2256         .write = smb_full_audit_write,
2257         .pwrite = smb_full_audit_pwrite,
2258         .lseek = smb_full_audit_lseek,
2259         .sendfile = smb_full_audit_sendfile,
2260         .recvfile = smb_full_audit_recvfile,
2261         .rename = smb_full_audit_rename,
2262         .fsync = smb_full_audit_fsync,
2263         .stat = smb_full_audit_stat,
2264         .fstat = smb_full_audit_fstat,
2265         .lstat = smb_full_audit_lstat,
2266         .get_alloc_size = smb_full_audit_get_alloc_size,
2267         .unlink = smb_full_audit_unlink,
2268         .chmod = smb_full_audit_chmod,
2269         .fchmod = smb_full_audit_fchmod,
2270         .chown = smb_full_audit_chown,
2271         .fchown = smb_full_audit_fchown,
2272         .lchown = smb_full_audit_lchown,
2273         .chdir = smb_full_audit_chdir,
2274         .getwd = smb_full_audit_getwd,
2275         .ntimes = smb_full_audit_ntimes,
2276         .ftruncate = smb_full_audit_ftruncate,
2277         .fallocate = smb_full_audit_fallocate,
2278         .lock = smb_full_audit_lock,
2279         .kernel_flock = smb_full_audit_kernel_flock,
2280         .linux_setlease = smb_full_audit_linux_setlease,
2281         .getlock = smb_full_audit_getlock,
2282         .symlink = smb_full_audit_symlink,
2283         .vfs_readlink = smb_full_audit_readlink,
2284         .link = smb_full_audit_link,
2285         .mknod = smb_full_audit_mknod,
2286         .realpath = smb_full_audit_realpath,
2287         .notify_watch = smb_full_audit_notify_watch,
2288         .chflags = smb_full_audit_chflags,
2289         .file_id_create = smb_full_audit_file_id_create,
2290         .streaminfo = smb_full_audit_streaminfo,
2291         .get_real_filename = smb_full_audit_get_real_filename,
2292         .connectpath = smb_full_audit_connectpath,
2293         .brl_lock_windows = smb_full_audit_brl_lock_windows,
2294         .brl_unlock_windows = smb_full_audit_brl_unlock_windows,
2295         .brl_cancel_windows = smb_full_audit_brl_cancel_windows,
2296         .strict_lock = smb_full_audit_strict_lock,
2297         .strict_unlock = smb_full_audit_strict_unlock,
2298         .translate_name = smb_full_audit_translate_name,
2299         .fget_nt_acl = smb_full_audit_fget_nt_acl,
2300         .get_nt_acl = smb_full_audit_get_nt_acl,
2301         .fset_nt_acl = smb_full_audit_fset_nt_acl,
2302         .chmod_acl = smb_full_audit_chmod_acl,
2303         .fchmod_acl = smb_full_audit_fchmod_acl,
2304         .sys_acl_get_entry = smb_full_audit_sys_acl_get_entry,
2305         .sys_acl_get_tag_type = smb_full_audit_sys_acl_get_tag_type,
2306         .sys_acl_get_permset = smb_full_audit_sys_acl_get_permset,
2307         .sys_acl_get_qualifier = smb_full_audit_sys_acl_get_qualifier,
2308         .sys_acl_get_file = smb_full_audit_sys_acl_get_file,
2309         .sys_acl_get_fd = smb_full_audit_sys_acl_get_fd,
2310         .sys_acl_clear_perms = smb_full_audit_sys_acl_clear_perms,
2311         .sys_acl_add_perm = smb_full_audit_sys_acl_add_perm,
2312         .sys_acl_to_text = smb_full_audit_sys_acl_to_text,
2313         .sys_acl_init = smb_full_audit_sys_acl_init,
2314         .sys_acl_create_entry = smb_full_audit_sys_acl_create_entry,
2315         .sys_acl_set_tag_type = smb_full_audit_sys_acl_set_tag_type,
2316         .sys_acl_set_qualifier = smb_full_audit_sys_acl_set_qualifier,
2317         .sys_acl_set_permset = smb_full_audit_sys_acl_set_permset,
2318         .sys_acl_valid = smb_full_audit_sys_acl_valid,
2319         .sys_acl_set_file = smb_full_audit_sys_acl_set_file,
2320         .sys_acl_set_fd = smb_full_audit_sys_acl_set_fd,
2321         .sys_acl_delete_def_file = smb_full_audit_sys_acl_delete_def_file,
2322         .sys_acl_get_perm = smb_full_audit_sys_acl_get_perm,
2323         .sys_acl_free_text = smb_full_audit_sys_acl_free_text,
2324         .sys_acl_free_acl = smb_full_audit_sys_acl_free_acl,
2325         .sys_acl_free_qualifier = smb_full_audit_sys_acl_free_qualifier,
2326         .getxattr = smb_full_audit_getxattr,
2327         .lgetxattr = smb_full_audit_lgetxattr,
2328         .fgetxattr = smb_full_audit_fgetxattr,
2329         .listxattr = smb_full_audit_listxattr,
2330         .llistxattr = smb_full_audit_llistxattr,
2331         .flistxattr = smb_full_audit_flistxattr,
2332         .removexattr = smb_full_audit_removexattr,
2333         .lremovexattr = smb_full_audit_lremovexattr,
2334         .fremovexattr = smb_full_audit_fremovexattr,
2335         .setxattr = smb_full_audit_setxattr,
2336         .lsetxattr = smb_full_audit_lsetxattr,
2337         .fsetxattr = smb_full_audit_fsetxattr,
2338         .aio_read = smb_full_audit_aio_read,
2339         .aio_write = smb_full_audit_aio_write,
2340         .aio_return_fn = smb_full_audit_aio_return,
2341         .aio_cancel = smb_full_audit_aio_cancel,
2342         .aio_error_fn = smb_full_audit_aio_error,
2343         .aio_fsync = smb_full_audit_aio_fsync,
2344         .aio_suspend = smb_full_audit_aio_suspend,
2345         .aio_force = smb_full_audit_aio_force,
2346         .is_offline = smb_full_audit_is_offline,
2347         .set_offline = smb_full_audit_set_offline,
2348 };
2349
2350 NTSTATUS vfs_full_audit_init(void)
2351 {
2352         NTSTATUS ret = smb_register_vfs(SMB_VFS_INTERFACE_VERSION,
2353                                         "full_audit", &vfs_full_audit_fns);
2354         
2355         if (!NT_STATUS_IS_OK(ret))
2356                 return ret;
2357
2358         vfs_full_audit_debug_level = debug_add_class("full_audit");
2359         if (vfs_full_audit_debug_level == -1) {
2360                 vfs_full_audit_debug_level = DBGC_VFS;
2361                 DEBUG(0, ("vfs_full_audit: Couldn't register custom debugging "
2362                           "class!\n"));
2363         } else {
2364                 DEBUG(10, ("vfs_full_audit: Debug class number of "
2365                            "'full_audit': %d\n", vfs_full_audit_debug_level));
2366         }
2367         
2368         return ret;
2369 }