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