LCOV - code coverage report
Current view: top level - source3/modules - vfs_full_audit.c (source / functions) Hit Total Coverage
Test: coverage report for recycleplus df22b230 Lines: 447 852 52.5 %
Date: 2024-02-14 10:14:15 Functions: 68 118 57.6 %

          Line data    Source code
       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 create_file
      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|/tmp
      42             :  * smbd_audit: nobody|192.168.234.1|create_file|fail (No such file or directory)|0x1|file|open|/ts/doesNotExist
      43             :  * smbd_audit: nobody|192.168.234.1|open|ok|w|/tmp/file.txt
      44             :  * smbd_audit: nobody|192.168.234.1|create_file|ok|0x3|file|open|/tmp/file.txt
      45             :  *
      46             :  * where "nobody" is the connected username and "192.168.234.1" is the
      47             :  * client's IP address.
      48             :  *
      49             :  * Options:
      50             :  *
      51             :  * prefix: A macro expansion template prepended to the syslog entry.
      52             :  *
      53             :  * success: A list of VFS operations for which a successful completion should
      54             :  * be logged. Defaults to no logging at all. The special operation "all" logs
      55             :  * - you guessed it - everything.
      56             :  *
      57             :  * failure: A list of VFS operations for which failure to complete should be
      58             :  * logged. Defaults to logging everything.
      59             :  */
      60             : 
      61             : 
      62             : #include "includes.h"
      63             : #include "system/filesys.h"
      64             : #include "system/syslog.h"
      65             : #include "smbd/smbd.h"
      66             : #include "../librpc/gen_ndr/ndr_netlogon.h"
      67             : #include "auth.h"
      68             : #include "ntioctl.h"
      69             : #include "lib/param/loadparm.h"
      70             : #include "lib/util/bitmap.h"
      71             : #include "lib/util/tevent_unix.h"
      72             : #include "libcli/security/sddl.h"
      73             : #include "passdb/machine_sid.h"
      74             : #include "lib/util/tevent_ntstatus.h"
      75             : #include "lib/util/string_wrappers.h"
      76             : #include "source3/lib/substitute.h"
      77             : 
      78             : static int vfs_full_audit_debug_level = DBGC_VFS;
      79             : 
      80             : struct vfs_full_audit_private_data {
      81             :         struct bitmap *success_ops;
      82             :         struct bitmap *failure_ops;
      83             :         int syslog_facility;
      84             :         int syslog_priority;
      85             :         bool log_secdesc;
      86             :         bool do_syslog;
      87             : };
      88             : 
      89             : #undef DBGC_CLASS
      90             : #define DBGC_CLASS vfs_full_audit_debug_level
      91             : 
      92             : typedef enum _vfs_op_type {
      93             :         SMB_VFS_OP_NOOP = -1,
      94             : 
      95             :         /* Disk operations */
      96             : 
      97             :         SMB_VFS_OP_CONNECT = 0,
      98             :         SMB_VFS_OP_DISCONNECT,
      99             :         SMB_VFS_OP_DISK_FREE,
     100             :         SMB_VFS_OP_GET_QUOTA,
     101             :         SMB_VFS_OP_SET_QUOTA,
     102             :         SMB_VFS_OP_GET_SHADOW_COPY_DATA,
     103             :         SMB_VFS_OP_STATVFS,
     104             :         SMB_VFS_OP_FS_CAPABILITIES,
     105             :         SMB_VFS_OP_GET_DFS_REFERRALS,
     106             :         SMB_VFS_OP_CREATE_DFS_PATHAT,
     107             :         SMB_VFS_OP_READ_DFS_PATHAT,
     108             : 
     109             :         /* Directory operations */
     110             : 
     111             :         SMB_VFS_OP_FDOPENDIR,
     112             :         SMB_VFS_OP_READDIR,
     113             :         SMB_VFS_OP_SEEKDIR,
     114             :         SMB_VFS_OP_TELLDIR,
     115             :         SMB_VFS_OP_REWINDDIR,
     116             :         SMB_VFS_OP_MKDIRAT,
     117             :         SMB_VFS_OP_CLOSEDIR,
     118             : 
     119             :         /* File operations */
     120             : 
     121             :         SMB_VFS_OP_OPEN,
     122             :         SMB_VFS_OP_OPENAT,
     123             :         SMB_VFS_OP_CREATE_FILE,
     124             :         SMB_VFS_OP_CLOSE,
     125             :         SMB_VFS_OP_READ,
     126             :         SMB_VFS_OP_PREAD,
     127             :         SMB_VFS_OP_PREAD_SEND,
     128             :         SMB_VFS_OP_PREAD_RECV,
     129             :         SMB_VFS_OP_WRITE,
     130             :         SMB_VFS_OP_PWRITE,
     131             :         SMB_VFS_OP_PWRITE_SEND,
     132             :         SMB_VFS_OP_PWRITE_RECV,
     133             :         SMB_VFS_OP_LSEEK,
     134             :         SMB_VFS_OP_SENDFILE,
     135             :         SMB_VFS_OP_RECVFILE,
     136             :         SMB_VFS_OP_RENAMEAT,
     137             :         SMB_VFS_OP_FSYNC_SEND,
     138             :         SMB_VFS_OP_FSYNC_RECV,
     139             :         SMB_VFS_OP_STAT,
     140             :         SMB_VFS_OP_FSTAT,
     141             :         SMB_VFS_OP_LSTAT,
     142             :         SMB_VFS_OP_FSTATAT,
     143             :         SMB_VFS_OP_GET_ALLOC_SIZE,
     144             :         SMB_VFS_OP_UNLINKAT,
     145             :         SMB_VFS_OP_FCHMOD,
     146             :         SMB_VFS_OP_FCHOWN,
     147             :         SMB_VFS_OP_LCHOWN,
     148             :         SMB_VFS_OP_CHDIR,
     149             :         SMB_VFS_OP_GETWD,
     150             :         SMB_VFS_OP_NTIMES,
     151             :         SMB_VFS_OP_FNTIMES,
     152             :         SMB_VFS_OP_FTRUNCATE,
     153             :         SMB_VFS_OP_FALLOCATE,
     154             :         SMB_VFS_OP_LOCK,
     155             :         SMB_VFS_OP_FILESYSTEM_SHAREMODE,
     156             :         SMB_VFS_OP_FCNTL,
     157             :         SMB_VFS_OP_LINUX_SETLEASE,
     158             :         SMB_VFS_OP_GETLOCK,
     159             :         SMB_VFS_OP_SYMLINKAT,
     160             :         SMB_VFS_OP_READLINKAT,
     161             :         SMB_VFS_OP_LINKAT,
     162             :         SMB_VFS_OP_MKNODAT,
     163             :         SMB_VFS_OP_REALPATH,
     164             :         SMB_VFS_OP_FCHFLAGS,
     165             :         SMB_VFS_OP_FILE_ID_CREATE,
     166             :         SMB_VFS_OP_FS_FILE_ID,
     167             :         SMB_VFS_OP_FSTREAMINFO,
     168             :         SMB_VFS_OP_GET_REAL_FILENAME,
     169             :         SMB_VFS_OP_GET_REAL_FILENAME_AT,
     170             :         SMB_VFS_OP_CONNECTPATH,
     171             :         SMB_VFS_OP_BRL_LOCK_WINDOWS,
     172             :         SMB_VFS_OP_BRL_UNLOCK_WINDOWS,
     173             :         SMB_VFS_OP_STRICT_LOCK_CHECK,
     174             :         SMB_VFS_OP_TRANSLATE_NAME,
     175             :         SMB_VFS_OP_PARENT_PATHNAME,
     176             :         SMB_VFS_OP_FSCTL,
     177             :         SMB_VFS_OP_OFFLOAD_READ_SEND,
     178             :         SMB_VFS_OP_OFFLOAD_READ_RECV,
     179             :         SMB_VFS_OP_OFFLOAD_WRITE_SEND,
     180             :         SMB_VFS_OP_OFFLOAD_WRITE_RECV,
     181             :         SMB_VFS_OP_FGET_COMPRESSION,
     182             :         SMB_VFS_OP_SET_COMPRESSION,
     183             :         SMB_VFS_OP_SNAP_CHECK_PATH,
     184             :         SMB_VFS_OP_SNAP_CREATE,
     185             :         SMB_VFS_OP_SNAP_DELETE,
     186             : 
     187             :         /* DOS attribute operations. */
     188             :         SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
     189             :         SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
     190             :         SMB_VFS_OP_FGET_DOS_ATTRIBUTES,
     191             :         SMB_VFS_OP_FSET_DOS_ATTRIBUTES,
     192             : 
     193             :         /* NT ACL operations. */
     194             : 
     195             :         SMB_VFS_OP_FGET_NT_ACL,
     196             :         SMB_VFS_OP_FSET_NT_ACL,
     197             :         SMB_VFS_OP_AUDIT_FILE,
     198             : 
     199             :         /* POSIX ACL operations. */
     200             : 
     201             :         SMB_VFS_OP_SYS_ACL_GET_FD,
     202             :         SMB_VFS_OP_SYS_ACL_BLOB_GET_FD,
     203             :         SMB_VFS_OP_SYS_ACL_SET_FD,
     204             :         SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD,
     205             : 
     206             :         /* EA operations. */
     207             :         SMB_VFS_OP_GETXATTRAT_SEND,
     208             :         SMB_VFS_OP_GETXATTRAT_RECV,
     209             :         SMB_VFS_OP_FGETXATTR,
     210             :         SMB_VFS_OP_FLISTXATTR,
     211             :         SMB_VFS_OP_REMOVEXATTR,
     212             :         SMB_VFS_OP_FREMOVEXATTR,
     213             :         SMB_VFS_OP_FSETXATTR,
     214             : 
     215             :         /* aio operations */
     216             :         SMB_VFS_OP_AIO_FORCE,
     217             : 
     218             :         /* offline operations */
     219             :         SMB_VFS_OP_IS_OFFLINE,
     220             :         SMB_VFS_OP_SET_OFFLINE,
     221             : 
     222             :         /* Durable handle operations. */
     223             :         SMB_VFS_OP_DURABLE_COOKIE,
     224             :         SMB_VFS_OP_DURABLE_DISCONNECT,
     225             :         SMB_VFS_OP_DURABLE_RECONNECT,
     226             : 
     227             :         SMB_VFS_OP_FREADDIR_ATTR,
     228             : 
     229             :         /* This should always be last enum value */
     230             : 
     231             :         SMB_VFS_OP_LAST
     232             : } vfs_op_type;
     233             : 
     234             : /* The following array *must* be in the same order as defined in vfs_op_type */
     235             : 
     236             : static struct {
     237             :         vfs_op_type type;
     238             :         const char *name;
     239             : } vfs_op_names[] = {
     240             :         { SMB_VFS_OP_CONNECT,   "connect" },
     241             :         { SMB_VFS_OP_DISCONNECT,        "disconnect" },
     242             :         { SMB_VFS_OP_DISK_FREE, "disk_free" },
     243             :         { SMB_VFS_OP_GET_QUOTA, "get_quota" },
     244             :         { SMB_VFS_OP_SET_QUOTA, "set_quota" },
     245             :         { SMB_VFS_OP_GET_SHADOW_COPY_DATA,      "get_shadow_copy_data" },
     246             :         { SMB_VFS_OP_STATVFS,   "statvfs" },
     247             :         { SMB_VFS_OP_FS_CAPABILITIES,   "fs_capabilities" },
     248             :         { SMB_VFS_OP_GET_DFS_REFERRALS, "get_dfs_referrals" },
     249             :         { SMB_VFS_OP_CREATE_DFS_PATHAT, "create_dfs_pathat" },
     250             :         { SMB_VFS_OP_READ_DFS_PATHAT,   "read_dfs_pathat" },
     251             :         { SMB_VFS_OP_FDOPENDIR, "fdopendir" },
     252             :         { SMB_VFS_OP_READDIR,   "readdir" },
     253             :         { SMB_VFS_OP_SEEKDIR,   "seekdir" },
     254             :         { SMB_VFS_OP_TELLDIR,   "telldir" },
     255             :         { SMB_VFS_OP_REWINDDIR, "rewinddir" },
     256             :         { SMB_VFS_OP_MKDIRAT,   "mkdirat" },
     257             :         { SMB_VFS_OP_CLOSEDIR,  "closedir" },
     258             :         { SMB_VFS_OP_OPEN,      "open" },
     259             :         { SMB_VFS_OP_OPENAT,    "openat" },
     260             :         { SMB_VFS_OP_CREATE_FILE, "create_file" },
     261             :         { SMB_VFS_OP_CLOSE,     "close" },
     262             :         { SMB_VFS_OP_READ,      "read" },
     263             :         { SMB_VFS_OP_PREAD,     "pread" },
     264             :         { SMB_VFS_OP_PREAD_SEND,        "pread_send" },
     265             :         { SMB_VFS_OP_PREAD_RECV,        "pread_recv" },
     266             :         { SMB_VFS_OP_WRITE,     "write" },
     267             :         { SMB_VFS_OP_PWRITE,    "pwrite" },
     268             :         { SMB_VFS_OP_PWRITE_SEND,       "pwrite_send" },
     269             :         { SMB_VFS_OP_PWRITE_RECV,       "pwrite_recv" },
     270             :         { SMB_VFS_OP_LSEEK,     "lseek" },
     271             :         { SMB_VFS_OP_SENDFILE,  "sendfile" },
     272             :         { SMB_VFS_OP_RECVFILE,  "recvfile" },
     273             :         { SMB_VFS_OP_RENAMEAT,  "renameat" },
     274             :         { SMB_VFS_OP_FSYNC_SEND,        "fsync_send" },
     275             :         { SMB_VFS_OP_FSYNC_RECV,        "fsync_recv" },
     276             :         { SMB_VFS_OP_STAT,      "stat" },
     277             :         { SMB_VFS_OP_FSTAT,     "fstat" },
     278             :         { SMB_VFS_OP_LSTAT,     "lstat" },
     279             :         { SMB_VFS_OP_FSTATAT,   "fstatat" },
     280             :         { SMB_VFS_OP_GET_ALLOC_SIZE,    "get_alloc_size" },
     281             :         { SMB_VFS_OP_UNLINKAT,  "unlinkat" },
     282             :         { SMB_VFS_OP_FCHMOD,    "fchmod" },
     283             :         { SMB_VFS_OP_FCHOWN,    "fchown" },
     284             :         { SMB_VFS_OP_LCHOWN,    "lchown" },
     285             :         { SMB_VFS_OP_CHDIR,     "chdir" },
     286             :         { SMB_VFS_OP_GETWD,     "getwd" },
     287             :         { SMB_VFS_OP_NTIMES,    "ntimes" },
     288             :         { SMB_VFS_OP_FNTIMES,   "fntimes" },
     289             :         { SMB_VFS_OP_FTRUNCATE, "ftruncate" },
     290             :         { SMB_VFS_OP_FALLOCATE,"fallocate" },
     291             :         { SMB_VFS_OP_LOCK,      "lock" },
     292             :         { SMB_VFS_OP_FILESYSTEM_SHAREMODE,      "filesystem_sharemode" },
     293             :         { SMB_VFS_OP_FCNTL,     "fcntl" },
     294             :         { SMB_VFS_OP_LINUX_SETLEASE, "linux_setlease" },
     295             :         { SMB_VFS_OP_GETLOCK,   "getlock" },
     296             :         { SMB_VFS_OP_SYMLINKAT, "symlinkat" },
     297             :         { SMB_VFS_OP_READLINKAT,"readlinkat" },
     298             :         { SMB_VFS_OP_LINKAT,    "linkat" },
     299             :         { SMB_VFS_OP_MKNODAT,   "mknodat" },
     300             :         { SMB_VFS_OP_REALPATH,  "realpath" },
     301             :         { SMB_VFS_OP_FCHFLAGS,  "fchflags" },
     302             :         { SMB_VFS_OP_FILE_ID_CREATE,    "file_id_create" },
     303             :         { SMB_VFS_OP_FS_FILE_ID,        "fs_file_id" },
     304             :         { SMB_VFS_OP_FSTREAMINFO,       "fstreaminfo" },
     305             :         { SMB_VFS_OP_GET_REAL_FILENAME, "get_real_filename" },
     306             :         { SMB_VFS_OP_GET_REAL_FILENAME_AT, "get_real_filename_at" },
     307             :         { SMB_VFS_OP_CONNECTPATH,       "connectpath" },
     308             :         { SMB_VFS_OP_BRL_LOCK_WINDOWS,  "brl_lock_windows" },
     309             :         { SMB_VFS_OP_BRL_UNLOCK_WINDOWS, "brl_unlock_windows" },
     310             :         { SMB_VFS_OP_STRICT_LOCK_CHECK, "strict_lock_check" },
     311             :         { SMB_VFS_OP_TRANSLATE_NAME,    "translate_name" },
     312             :         { SMB_VFS_OP_PARENT_PATHNAME,   "parent_pathname" },
     313             :         { SMB_VFS_OP_FSCTL,             "fsctl" },
     314             :         { SMB_VFS_OP_OFFLOAD_READ_SEND, "offload_read_send" },
     315             :         { SMB_VFS_OP_OFFLOAD_READ_RECV, "offload_read_recv" },
     316             :         { SMB_VFS_OP_OFFLOAD_WRITE_SEND,        "offload_write_send" },
     317             :         { SMB_VFS_OP_OFFLOAD_WRITE_RECV,        "offload_write_recv" },
     318             :         { SMB_VFS_OP_FGET_COMPRESSION,  "fget_compression" },
     319             :         { SMB_VFS_OP_SET_COMPRESSION,   "set_compression" },
     320             :         { SMB_VFS_OP_SNAP_CHECK_PATH, "snap_check_path" },
     321             :         { SMB_VFS_OP_SNAP_CREATE, "snap_create" },
     322             :         { SMB_VFS_OP_SNAP_DELETE, "snap_delete" },
     323             :         { SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND, "get_dos_attributes_send" },
     324             :         { SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV, "get_dos_attributes_recv" },
     325             :         { SMB_VFS_OP_FGET_DOS_ATTRIBUTES, "fget_dos_attributes" },
     326             :         { SMB_VFS_OP_FSET_DOS_ATTRIBUTES, "fset_dos_attributes" },
     327             :         { SMB_VFS_OP_FGET_NT_ACL,       "fget_nt_acl" },
     328             :         { SMB_VFS_OP_FSET_NT_ACL,       "fset_nt_acl" },
     329             :         { SMB_VFS_OP_AUDIT_FILE,        "audit_file" },
     330             :         { SMB_VFS_OP_SYS_ACL_GET_FD,    "sys_acl_get_fd" },
     331             :         { SMB_VFS_OP_SYS_ACL_BLOB_GET_FD,       "sys_acl_blob_get_fd" },
     332             :         { SMB_VFS_OP_SYS_ACL_SET_FD,    "sys_acl_set_fd" },
     333             :         { SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD,     "sys_acl_delete_def_fd" },
     334             :         { SMB_VFS_OP_GETXATTRAT_SEND, "getxattrat_send" },
     335             :         { SMB_VFS_OP_GETXATTRAT_RECV, "getxattrat_recv" },
     336             :         { SMB_VFS_OP_FGETXATTR, "fgetxattr" },
     337             :         { SMB_VFS_OP_FLISTXATTR,        "flistxattr" },
     338             :         { SMB_VFS_OP_REMOVEXATTR,       "removexattr" },
     339             :         { SMB_VFS_OP_FREMOVEXATTR,      "fremovexattr" },
     340             :         { SMB_VFS_OP_FSETXATTR, "fsetxattr" },
     341             :         { SMB_VFS_OP_AIO_FORCE, "aio_force" },
     342             :         { SMB_VFS_OP_IS_OFFLINE, "is_offline" },
     343             :         { SMB_VFS_OP_SET_OFFLINE, "set_offline" },
     344             :         { SMB_VFS_OP_DURABLE_COOKIE, "durable_cookie" },
     345             :         { SMB_VFS_OP_DURABLE_DISCONNECT, "durable_disconnect" },
     346             :         { SMB_VFS_OP_DURABLE_RECONNECT, "durable_reconnect" },
     347             :         { SMB_VFS_OP_FREADDIR_ATTR,      "freaddir_attr" },
     348             :         { SMB_VFS_OP_LAST, NULL }
     349             : };
     350             : 
     351        2579 : static int audit_syslog_facility(vfs_handle_struct *handle)
     352             : {
     353             :         static const struct enum_list enum_log_facilities[] = {
     354             : #ifdef LOG_AUTH
     355             :                 { LOG_AUTH,             "AUTH" },
     356             : #endif
     357             : #ifdef LOG_AUTHPRIV
     358             :                 { LOG_AUTHPRIV,         "AUTHPRIV" },
     359             : #endif
     360             : #ifdef LOG_AUDIT
     361             :                 { LOG_AUDIT,            "AUDIT" },
     362             : #endif
     363             : #ifdef LOG_CONSOLE
     364             :                 { LOG_CONSOLE,          "CONSOLE" },
     365             : #endif
     366             : #ifdef LOG_CRON
     367             :                 { LOG_CRON,             "CRON" },
     368             : #endif
     369             : #ifdef LOG_DAEMON
     370             :                 { LOG_DAEMON,           "DAEMON" },
     371             : #endif
     372             : #ifdef LOG_FTP
     373             :                 { LOG_FTP,              "FTP" },
     374             : #endif
     375             : #ifdef LOG_INSTALL
     376             :                 { LOG_INSTALL,          "INSTALL" },
     377             : #endif
     378             : #ifdef LOG_KERN
     379             :                 { LOG_KERN,             "KERN" },
     380             : #endif
     381             : #ifdef LOG_LAUNCHD
     382             :                 { LOG_LAUNCHD,          "LAUNCHD" },
     383             : #endif
     384             : #ifdef LOG_LFMT
     385             :                 { LOG_LFMT,             "LFMT" },
     386             : #endif
     387             : #ifdef LOG_LPR
     388             :                 { LOG_LPR,              "LPR" },
     389             : #endif
     390             : #ifdef LOG_MAIL
     391             :                 { LOG_MAIL,             "MAIL" },
     392             : #endif
     393             : #ifdef LOG_MEGASAFE
     394             :                 { LOG_MEGASAFE,         "MEGASAFE" },
     395             : #endif
     396             : #ifdef LOG_NETINFO
     397             :                 { LOG_NETINFO,          "NETINFO" },
     398             : #endif
     399             : #ifdef LOG_NEWS
     400             :                 { LOG_NEWS,             "NEWS" },
     401             : #endif
     402             : #ifdef LOG_NFACILITIES
     403             :                 { LOG_NFACILITIES,      "NFACILITIES" },
     404             : #endif
     405             : #ifdef LOG_NTP
     406             :                 { LOG_NTP,              "NTP" },
     407             : #endif
     408             : #ifdef LOG_RAS
     409             :                 { LOG_RAS,              "RAS" },
     410             : #endif
     411             : #ifdef LOG_REMOTEAUTH
     412             :                 { LOG_REMOTEAUTH,       "REMOTEAUTH" },
     413             : #endif
     414             : #ifdef LOG_SECURITY
     415             :                 { LOG_SECURITY,         "SECURITY" },
     416             : #endif
     417             : #ifdef LOG_SYSLOG
     418             :                 { LOG_SYSLOG,           "SYSLOG" },
     419             : #endif
     420             : #ifdef LOG_USER
     421             :                 { LOG_USER,             "USER" },
     422             : #endif
     423             : #ifdef LOG_UUCP
     424             :                 { LOG_UUCP,             "UUCP" },
     425             : #endif
     426             :                 { LOG_LOCAL0,           "LOCAL0" },
     427             :                 { LOG_LOCAL1,           "LOCAL1" },
     428             :                 { LOG_LOCAL2,           "LOCAL2" },
     429             :                 { LOG_LOCAL3,           "LOCAL3" },
     430             :                 { LOG_LOCAL4,           "LOCAL4" },
     431             :                 { LOG_LOCAL5,           "LOCAL5" },
     432             :                 { LOG_LOCAL6,           "LOCAL6" },
     433             :                 { LOG_LOCAL7,           "LOCAL7" },
     434             :                 { -1,                   NULL }
     435             :         };
     436             : 
     437             :         int facility;
     438             : 
     439        2579 :         facility = lp_parm_enum(SNUM(handle->conn), "full_audit", "facility", enum_log_facilities, LOG_USER);
     440             : 
     441        2579 :         return facility;
     442             : }
     443             : 
     444        2579 : static int audit_syslog_priority(vfs_handle_struct *handle)
     445             : {
     446             :         static const struct enum_list enum_log_priorities[] = {
     447             :                 { LOG_EMERG, "EMERG" },
     448             :                 { LOG_ALERT, "ALERT" },
     449             :                 { LOG_CRIT, "CRIT" },
     450             :                 { LOG_ERR, "ERR" },
     451             :                 { LOG_WARNING, "WARNING" },
     452             :                 { LOG_NOTICE, "NOTICE" },
     453             :                 { LOG_INFO, "INFO" },
     454             :                 { LOG_DEBUG, "DEBUG" },
     455             :                 { -1, NULL }
     456             :         };
     457             : 
     458             :         int priority;
     459             : 
     460        2579 :         priority = lp_parm_enum(SNUM(handle->conn), "full_audit", "priority",
     461             :                                 enum_log_priorities, LOG_NOTICE);
     462        2579 :         if (priority == -1) {
     463           0 :                 priority = LOG_WARNING;
     464             :         }
     465             : 
     466        2579 :         return priority;
     467             : }
     468             : 
     469           0 : static char *audit_prefix(TALLOC_CTX *ctx, connection_struct *conn)
     470             : {
     471             :         const struct loadparm_substitution *lp_sub =
     472           0 :                 loadparm_s3_global_substitution();
     473           0 :         char *prefix = NULL;
     474             :         char *result;
     475             : 
     476           0 :         prefix = talloc_strdup(ctx,
     477           0 :                         lp_parm_const_string(SNUM(conn), "full_audit",
     478             :                                              "prefix", "%u|%I"));
     479           0 :         if (!prefix) {
     480           0 :                 return NULL;
     481             :         }
     482           0 :         result = talloc_sub_full(ctx,
     483           0 :                         lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
     484           0 :                         conn->session_info->unix_info->unix_name,
     485           0 :                         conn->connectpath,
     486           0 :                         conn->session_info->unix_token->gid,
     487           0 :                         conn->session_info->unix_info->sanitized_username,
     488           0 :                         conn->session_info->info->domain_name,
     489             :                         prefix);
     490           0 :         TALLOC_FREE(prefix);
     491           0 :         return result;
     492             : }
     493             : 
     494      828079 : static bool log_success(struct vfs_full_audit_private_data *pd, vfs_op_type op)
     495             : {
     496      828079 :         if (pd->success_ops == NULL) {
     497           0 :                 return True;
     498             :         }
     499             : 
     500      828079 :         return bitmap_query(pd->success_ops, op);
     501             : }
     502             : 
     503       75611 : static bool log_failure(struct vfs_full_audit_private_data *pd, vfs_op_type op)
     504             : {
     505       75611 :         if (pd->failure_ops == NULL)
     506           0 :                 return True;
     507             : 
     508       75611 :         return bitmap_query(pd->failure_ops, op);
     509             : }
     510             : 
     511        5158 : static struct bitmap *init_bitmap(TALLOC_CTX *mem_ctx, const char **ops)
     512             : {
     513             :         struct bitmap *bm;
     514             : 
     515        5158 :         if (ops == NULL) {
     516           0 :                 DBG_ERR("init_bitmap, ops list is empty (logic error)\n");
     517           0 :                 return NULL;
     518             :         }
     519             : 
     520        5158 :         bm = bitmap_talloc(mem_ctx, SMB_VFS_OP_LAST);
     521        5158 :         if (bm == NULL) {
     522           0 :                 DBG_ERR("Could not alloc bitmap\n");
     523           0 :                 return NULL;
     524             :         }
     525             : 
     526        5158 :         for (; *ops != NULL; ops += 1) {
     527             :                 int i;
     528        5158 :                 bool neg = false;
     529             :                 const char *op;
     530             : 
     531        5158 :                 if (strequal(*ops, "all")) {
     532           0 :                         for (i=0; i<SMB_VFS_OP_LAST; i++) {
     533           0 :                                 bitmap_set(bm, i);
     534             :                         }
     535           0 :                         continue;
     536             :                 }
     537             : 
     538        5158 :                 if (strequal(*ops, "none")) {
     539        5158 :                         break;
     540             :                 }
     541             : 
     542           0 :                 op = ops[0];
     543           0 :                 if (op[0] == '!') {
     544           0 :                         neg = true;
     545           0 :                         op += 1;
     546             :                 }
     547             : 
     548           0 :                 for (i=0; i<SMB_VFS_OP_LAST; i++) {
     549           0 :                         if ((vfs_op_names[i].name == NULL)
     550           0 :                          || (vfs_op_names[i].type != i)) {
     551           0 :                                 smb_panic("vfs_full_audit.c: name table not "
     552             :                                           "in sync with vfs_op_type enums\n");
     553             :                         }
     554           0 :                         if (strequal(op, vfs_op_names[i].name)) {
     555           0 :                                 if (neg) {
     556           0 :                                         bitmap_clear(bm, i);
     557             :                                 } else {
     558           0 :                                         bitmap_set(bm, i);
     559             :                                 }
     560           0 :                                 break;
     561             :                         }
     562             :                 }
     563           0 :                 if (i == SMB_VFS_OP_LAST) {
     564           0 :                         DBG_ERR("Could not find opname %s\n", *ops);
     565           0 :                         TALLOC_FREE(bm);
     566           0 :                         return NULL;
     567             :                 }
     568             :         }
     569        5158 :         return bm;
     570             : }
     571             : 
     572           0 : static const char *audit_opname(vfs_op_type op)
     573             : {
     574           0 :         if (op >= SMB_VFS_OP_LAST)
     575           0 :                 return "INVALID VFS OP";
     576           0 :         return vfs_op_names[op].name;
     577             : }
     578             : 
     579             : static TALLOC_CTX *tmp_do_log_ctx;
     580             : /*
     581             :  * Get us a temporary talloc context usable just for DEBUG arguments
     582             :  */
     583     1625597 : static TALLOC_CTX *do_log_ctx(void)
     584             : {
     585     1625597 :         if (tmp_do_log_ctx == NULL) {
     586      580111 :                 tmp_do_log_ctx = talloc_named_const(NULL, 0, "do_log_ctx");
     587             :         }
     588     1625597 :         return tmp_do_log_ctx;
     589             : }
     590             : 
     591             : static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
     592             :                    const char *format, ...) PRINTF_ATTRIBUTE(4, 5);
     593             : 
     594      903690 : static void do_log(vfs_op_type op, bool success, vfs_handle_struct *handle,
     595             :                    const char *format, ...)
     596             : {
     597             :         struct vfs_full_audit_private_data *pd;
     598             :         fstring err_msg;
     599      903690 :         char *audit_pre = NULL;
     600             :         va_list ap;
     601      903690 :         char *op_msg = NULL;
     602             : 
     603      903690 :         SMB_VFS_HANDLE_GET_DATA(handle, pd,
     604             :                                 struct vfs_full_audit_private_data,
     605             :                                 return;);
     606             : 
     607      903690 :         if (success && (!log_success(pd, op)))
     608      828079 :                 goto out;
     609             : 
     610       75611 :         if (!success && (!log_failure(pd, op)))
     611       75611 :                 goto out;
     612             : 
     613           0 :         if (success)
     614           0 :                 fstrcpy(err_msg, "ok");
     615             :         else
     616           0 :                 fstr_sprintf(err_msg, "fail (%s)", strerror(errno));
     617             : 
     618           0 :         va_start(ap, format);
     619           0 :         op_msg = talloc_vasprintf(talloc_tos(), format, ap);
     620           0 :         va_end(ap);
     621             : 
     622           0 :         if (!op_msg) {
     623           0 :                 goto out;
     624             :         }
     625             : 
     626           0 :         audit_pre = audit_prefix(talloc_tos(), handle->conn);
     627             : 
     628           0 :         if (pd->do_syslog) {
     629             :                 int priority;
     630             : 
     631             :                 /*
     632             :                  * Specify the facility to interoperate with other syslog
     633             :                  * callers (smbd for example).
     634             :                  */
     635           0 :                 priority = pd->syslog_priority | pd->syslog_facility;
     636             : 
     637           0 :                 syslog(priority, "%s|%s|%s|%s\n",
     638             :                        audit_pre ? audit_pre : "",
     639             :                        audit_opname(op), err_msg, op_msg);
     640             :         } else {
     641           0 :                 DEBUG(1, ("%s|%s|%s|%s\n",
     642             :                           audit_pre ? audit_pre : "",
     643             :                           audit_opname(op), err_msg, op_msg));
     644             :         }
     645      903690 :  out:
     646      903690 :         TALLOC_FREE(audit_pre);
     647      903690 :         TALLOC_FREE(op_msg);
     648      903690 :         TALLOC_FREE(tmp_do_log_ctx);
     649             : }
     650             : 
     651             : /**
     652             :  * Return a string using the do_log_ctx()
     653             :  */
     654      580255 : static const char *smb_fname_str_do_log(struct connection_struct *conn,
     655             :                                 const struct smb_filename *smb_fname)
     656             : {
     657      580255 :         char *fname = NULL;
     658             :         NTSTATUS status;
     659             : 
     660      580255 :         if (smb_fname == NULL) {
     661           0 :                 return "";
     662             :         }
     663             : 
     664      580255 :         if (smb_fname->base_name[0] != '/') {
     665      522671 :                 char *abs_name = NULL;
     666      522671 :                 struct smb_filename *fname_copy = cp_smb_filename(
     667             :                                                         do_log_ctx(),
     668             :                                                         smb_fname);
     669      522671 :                 if (fname_copy == NULL) {
     670           0 :                         return "";
     671             :                 }
     672             : 
     673      522671 :                 if (!ISDOT(smb_fname->base_name)) {
     674      213312 :                         abs_name = talloc_asprintf(do_log_ctx(),
     675             :                                         "%s/%s",
     676      213312 :                                         conn->cwd_fsp->fsp_name->base_name,
     677      213312 :                                         smb_fname->base_name);
     678             :                 } else {
     679      309359 :                         abs_name = talloc_strdup(do_log_ctx(),
     680      309359 :                                         conn->cwd_fsp->fsp_name->base_name);
     681             :                 }
     682      522671 :                 if (abs_name == NULL) {
     683           0 :                         return "";
     684             :                 }
     685      522671 :                 fname_copy->base_name = abs_name;
     686      522671 :                 smb_fname = fname_copy;
     687             :         }
     688             : 
     689      580255 :         status = get_full_smb_filename(do_log_ctx(), smb_fname, &fname);
     690      580255 :         if (!NT_STATUS_IS_OK(status)) {
     691           0 :                 return "";
     692             :         }
     693      580255 :         return fname;
     694             : }
     695             : 
     696             : /**
     697             :  * Return an fsp debug string using the do_log_ctx()
     698             :  */
     699      346665 : static const char *fsp_str_do_log(const struct files_struct *fsp)
     700             : {
     701      346665 :         return smb_fname_str_do_log(fsp->conn, fsp->fsp_name);
     702             : }
     703             : 
     704             : /* Implementation of vfs_ops.  Pass everything on to the default
     705             :    operation but log event first. */
     706             : 
     707        2579 : static int smb_full_audit_connect(vfs_handle_struct *handle,
     708             :                          const char *svc, const char *user)
     709             : {
     710             :         int result;
     711        2579 :         const char *none[] = { "none" };
     712        2579 :         struct vfs_full_audit_private_data *pd = NULL;
     713             : 
     714        2579 :         result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
     715        2579 :         if (result < 0) {
     716           0 :                 return result;
     717             :         }
     718             : 
     719        2579 :         pd = talloc_zero(handle, struct vfs_full_audit_private_data);
     720        2579 :         if (!pd) {
     721           0 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     722           0 :                 return -1;
     723             :         }
     724             : 
     725        2579 :         pd->syslog_facility = audit_syslog_facility(handle);
     726        2579 :         if (pd->syslog_facility == -1) {
     727           0 :                 DEBUG(1, ("%s: Unknown facility %s\n", __func__,
     728             :                           lp_parm_const_string(SNUM(handle->conn),
     729             :                                                "full_audit", "facility",
     730             :                                                "USER")));
     731           0 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     732           0 :                 return -1;
     733             :         }
     734             : 
     735        2579 :         pd->syslog_priority = audit_syslog_priority(handle);
     736             : 
     737        2579 :         pd->log_secdesc = lp_parm_bool(SNUM(handle->conn),
     738             :                                        "full_audit", "log_secdesc", false);
     739             : 
     740        2579 :         pd->do_syslog = lp_parm_bool(SNUM(handle->conn),
     741             :                                      "full_audit", "syslog", true);
     742             : 
     743             : #ifdef WITH_SYSLOG
     744        2579 :         if (pd->do_syslog) {
     745           0 :                 openlog("smbd_audit", 0, pd->syslog_facility);
     746             :         }
     747             : #endif
     748             : 
     749        2579 :         pd->success_ops = init_bitmap(
     750        2579 :                 pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
     751             :                                         "success", none));
     752        2579 :         if (pd->success_ops == NULL) {
     753           0 :                 DBG_ERR("Invalid success operations list. Failing connect\n");
     754           0 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     755           0 :                 return -1;
     756             :         }
     757        2579 :         pd->failure_ops = init_bitmap(
     758        2579 :                 pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
     759             :                                         "failure", none));
     760        2579 :         if (pd->failure_ops == NULL) {
     761           0 :                 DBG_ERR("Invalid failure operations list. Failing connect\n");
     762           0 :                 SMB_VFS_NEXT_DISCONNECT(handle);
     763           0 :                 return -1;
     764             :         }
     765             : 
     766             :         /* Store the private data. */
     767        2579 :         SMB_VFS_HANDLE_SET_DATA(handle, pd, NULL,
     768             :                                 struct vfs_full_audit_private_data, return -1);
     769             : 
     770        2579 :         do_log(SMB_VFS_OP_CONNECT, True, handle,
     771             :                "%s", svc);
     772             : 
     773        2579 :         return 0;
     774             : }
     775             : 
     776        2579 : static void smb_full_audit_disconnect(vfs_handle_struct *handle)
     777             : {
     778             :         const struct loadparm_substitution *lp_sub =
     779        2579 :                 loadparm_s3_global_substitution();
     780             : 
     781        2579 :         SMB_VFS_NEXT_DISCONNECT(handle);
     782             : 
     783        2579 :         do_log(SMB_VFS_OP_DISCONNECT, True, handle,
     784        2579 :                "%s", lp_servicename(talloc_tos(), lp_sub, SNUM(handle->conn)));
     785             : 
     786             :         /* The bitmaps will be disconnected when the private
     787             :            data is deleted. */
     788        2579 : }
     789             : 
     790         183 : static uint64_t smb_full_audit_disk_free(vfs_handle_struct *handle,
     791             :                                 const struct smb_filename *smb_fname,
     792             :                                 uint64_t *bsize,
     793             :                                 uint64_t *dfree,
     794             :                                 uint64_t *dsize)
     795             : {
     796             :         uint64_t result;
     797             : 
     798         183 :         result = SMB_VFS_NEXT_DISK_FREE(handle, smb_fname, bsize, dfree, dsize);
     799             : 
     800             :         /* Don't have a reasonable notion of failure here */
     801             : 
     802         183 :         do_log(SMB_VFS_OP_DISK_FREE,
     803             :                True,
     804             :                handle,
     805             :                "%s",
     806             :                smb_fname_str_do_log(handle->conn, smb_fname));
     807             : 
     808         183 :         return result;
     809             : }
     810             : 
     811         366 : static int smb_full_audit_get_quota(struct vfs_handle_struct *handle,
     812             :                                 const struct smb_filename *smb_fname,
     813             :                                 enum SMB_QUOTA_TYPE qtype,
     814             :                                 unid_t id,
     815             :                                 SMB_DISK_QUOTA *qt)
     816             : {
     817             :         int result;
     818             : 
     819         366 :         result = SMB_VFS_NEXT_GET_QUOTA(handle, smb_fname, qtype, id, qt);
     820             : 
     821         366 :         do_log(SMB_VFS_OP_GET_QUOTA,
     822             :                (result >= 0),
     823             :                handle,
     824             :                "%s",
     825             :                smb_fname_str_do_log(handle->conn, smb_fname));
     826             : 
     827         366 :         return result;
     828             : }
     829             : 
     830           0 : static int smb_full_audit_set_quota(struct vfs_handle_struct *handle,
     831             :                            enum SMB_QUOTA_TYPE qtype, unid_t id,
     832             :                            SMB_DISK_QUOTA *qt)
     833             : {
     834             :         int result;
     835             : 
     836           0 :         result = SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, qt);
     837             : 
     838           0 :         do_log(SMB_VFS_OP_SET_QUOTA, (result >= 0), handle, "");
     839             : 
     840           0 :         return result;
     841             : }
     842             : 
     843          44 : static int smb_full_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
     844             :                                 struct files_struct *fsp,
     845             :                                 struct shadow_copy_data *shadow_copy_data,
     846             :                                 bool labels)
     847             : {
     848             :         int result;
     849             : 
     850          44 :         result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp, shadow_copy_data, labels);
     851             : 
     852          44 :         do_log(SMB_VFS_OP_GET_SHADOW_COPY_DATA, (result >= 0), handle, "");
     853             : 
     854          44 :         return result;
     855             : }
     856             : 
     857        1745 : static int smb_full_audit_statvfs(struct vfs_handle_struct *handle,
     858             :                                 const struct smb_filename *smb_fname,
     859             :                                 struct vfs_statvfs_struct *statbuf)
     860             : {
     861             :         int result;
     862             : 
     863        1745 :         result = SMB_VFS_NEXT_STATVFS(handle, smb_fname, statbuf);
     864             : 
     865        1745 :         do_log(SMB_VFS_OP_STATVFS, (result >= 0), handle, "");
     866             : 
     867        1745 :         return result;
     868             : }
     869             : 
     870        1745 : static uint32_t smb_full_audit_fs_capabilities(struct vfs_handle_struct *handle, enum timestamp_set_resolution *p_ts_res)
     871             : {
     872             :         int result;
     873             : 
     874        1745 :         result = SMB_VFS_NEXT_FS_CAPABILITIES(handle, p_ts_res);
     875             : 
     876        1745 :         do_log(SMB_VFS_OP_FS_CAPABILITIES, true, handle, "");
     877             : 
     878        1745 :         return result;
     879             : }
     880             : 
     881        1463 : static NTSTATUS smb_full_audit_get_dfs_referrals(
     882             :                                 struct vfs_handle_struct *handle,
     883             :                                 struct dfs_GetDFSReferral *r)
     884             : {
     885             :         NTSTATUS status;
     886             : 
     887        1463 :         status = SMB_VFS_NEXT_GET_DFS_REFERRALS(handle, r);
     888             : 
     889        1463 :         do_log(SMB_VFS_OP_GET_DFS_REFERRALS, NT_STATUS_IS_OK(status),
     890             :                handle, "");
     891             : 
     892        1463 :         return status;
     893             : }
     894             : 
     895           0 : static NTSTATUS smb_full_audit_create_dfs_pathat(struct vfs_handle_struct *handle,
     896             :                                 struct files_struct *dirfsp,
     897             :                                 const struct smb_filename *smb_fname,
     898             :                                 const struct referral *reflist,
     899             :                                 size_t referral_count)
     900             : {
     901             :         NTSTATUS status;
     902           0 :         struct smb_filename *full_fname = NULL;
     903             : 
     904           0 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
     905             :                                                   dirfsp,
     906             :                                                   smb_fname);
     907           0 :         if (full_fname == NULL) {
     908           0 :                 return NT_STATUS_NO_MEMORY;
     909             :         }
     910             : 
     911           0 :         status = SMB_VFS_NEXT_CREATE_DFS_PATHAT(handle,
     912             :                         dirfsp,
     913             :                         smb_fname,
     914             :                         reflist,
     915             :                         referral_count);
     916             : 
     917           0 :         do_log(SMB_VFS_OP_CREATE_DFS_PATHAT,
     918           0 :                 NT_STATUS_IS_OK(status),
     919             :                 handle,
     920             :                 "%s",
     921             :                 smb_fname_str_do_log(handle->conn, full_fname));
     922             : 
     923           0 :         TALLOC_FREE(full_fname);
     924           0 :         return status;
     925             : }
     926             : 
     927       11234 : static NTSTATUS smb_full_audit_read_dfs_pathat(struct vfs_handle_struct *handle,
     928             :                         TALLOC_CTX *mem_ctx,
     929             :                         struct files_struct *dirfsp,
     930             :                         struct smb_filename *smb_fname,
     931             :                         struct referral **ppreflist,
     932             :                         size_t *preferral_count)
     933             : {
     934       11234 :         struct smb_filename *full_fname = NULL;
     935             :         NTSTATUS status;
     936             : 
     937       11234 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
     938             :                                                   dirfsp,
     939             :                                                   smb_fname);
     940       11234 :         if (full_fname == NULL) {
     941           0 :                 return NT_STATUS_NO_MEMORY;
     942             :         }
     943             : 
     944       11234 :         status = SMB_VFS_NEXT_READ_DFS_PATHAT(handle,
     945             :                         mem_ctx,
     946             :                         dirfsp,
     947             :                         smb_fname,
     948             :                         ppreflist,
     949             :                         preferral_count);
     950             : 
     951       11234 :         do_log(SMB_VFS_OP_READ_DFS_PATHAT,
     952       11234 :                 NT_STATUS_IS_OK(status),
     953             :                 handle,
     954             :                 "%s",
     955             :                 smb_fname_str_do_log(handle->conn, full_fname));
     956             : 
     957       11234 :         TALLOC_FREE(full_fname);
     958       11234 :         return status;
     959             : }
     960             : 
     961           0 : static NTSTATUS smb_full_audit_snap_check_path(struct vfs_handle_struct *handle,
     962             :                                                TALLOC_CTX *mem_ctx,
     963             :                                                const char *service_path,
     964             :                                                char **base_volume)
     965             : {
     966             :         NTSTATUS status;
     967             : 
     968           0 :         status = SMB_VFS_NEXT_SNAP_CHECK_PATH(handle, mem_ctx, service_path,
     969             :                                               base_volume);
     970           0 :         do_log(SMB_VFS_OP_SNAP_CHECK_PATH, NT_STATUS_IS_OK(status),
     971             :                handle, "");
     972             : 
     973           0 :         return status;
     974             : }
     975             : 
     976           0 : static NTSTATUS smb_full_audit_snap_create(struct vfs_handle_struct *handle,
     977             :                                            TALLOC_CTX *mem_ctx,
     978             :                                            const char *base_volume,
     979             :                                            time_t *tstamp,
     980             :                                            bool rw,
     981             :                                            char **base_path,
     982             :                                            char **snap_path)
     983             : {
     984             :         NTSTATUS status;
     985             : 
     986           0 :         status = SMB_VFS_NEXT_SNAP_CREATE(handle, mem_ctx, base_volume, tstamp,
     987             :                                           rw, base_path, snap_path);
     988           0 :         do_log(SMB_VFS_OP_SNAP_CREATE, NT_STATUS_IS_OK(status), handle, "");
     989             : 
     990           0 :         return status;
     991             : }
     992             : 
     993           0 : static NTSTATUS smb_full_audit_snap_delete(struct vfs_handle_struct *handle,
     994             :                                            TALLOC_CTX *mem_ctx,
     995             :                                            char *base_path,
     996             :                                            char *snap_path)
     997             : {
     998             :         NTSTATUS status;
     999             : 
    1000           0 :         status = SMB_VFS_NEXT_SNAP_DELETE(handle, mem_ctx, base_path,
    1001             :                                           snap_path);
    1002           0 :         do_log(SMB_VFS_OP_SNAP_DELETE, NT_STATUS_IS_OK(status), handle, "");
    1003             : 
    1004           0 :         return status;
    1005             : }
    1006             : 
    1007        2302 : static DIR *smb_full_audit_fdopendir(vfs_handle_struct *handle,
    1008             :                           files_struct *fsp, const char *mask, uint32_t attr)
    1009             : {
    1010             :         DIR *result;
    1011             : 
    1012        2302 :         result = SMB_VFS_NEXT_FDOPENDIR(handle, fsp, mask, attr);
    1013             : 
    1014        2302 :         do_log(SMB_VFS_OP_FDOPENDIR, (result != NULL), handle, "%s",
    1015             :                         fsp_str_do_log(fsp));
    1016             : 
    1017        2302 :         return result;
    1018             : }
    1019             : 
    1020       19120 : static struct dirent *smb_full_audit_readdir(vfs_handle_struct *handle,
    1021             :                                              struct files_struct *dirfsp,
    1022             :                                              DIR *dirp,
    1023             :                                              SMB_STRUCT_STAT *sbuf)
    1024             : {
    1025             :         struct dirent *result;
    1026             : 
    1027       19120 :         result = SMB_VFS_NEXT_READDIR(handle, dirfsp, dirp, sbuf);
    1028             : 
    1029             :         /* This operation has no reasonable error condition
    1030             :          * (End of dir is also failure), so always succeed.
    1031             :          */
    1032       19120 :         do_log(SMB_VFS_OP_READDIR, True, handle, "");
    1033             : 
    1034       19120 :         return result;
    1035             : }
    1036             : 
    1037           0 : static void smb_full_audit_seekdir(vfs_handle_struct *handle,
    1038             :                         DIR *dirp, long offset)
    1039             : {
    1040           0 :         SMB_VFS_NEXT_SEEKDIR(handle, dirp, offset);
    1041             : 
    1042           0 :         do_log(SMB_VFS_OP_SEEKDIR, True, handle, "");
    1043           0 : }
    1044             : 
    1045       15061 : static long smb_full_audit_telldir(vfs_handle_struct *handle,
    1046             :                         DIR *dirp)
    1047             : {
    1048             :         long result;
    1049             : 
    1050       15061 :         result = SMB_VFS_NEXT_TELLDIR(handle, dirp);
    1051             : 
    1052       15061 :         do_log(SMB_VFS_OP_TELLDIR, True, handle, "");
    1053             : 
    1054       15061 :         return result;
    1055             : }
    1056             : 
    1057           0 : static void smb_full_audit_rewinddir(vfs_handle_struct *handle,
    1058             :                         DIR *dirp)
    1059             : {
    1060           0 :         SMB_VFS_NEXT_REWINDDIR(handle, dirp);
    1061             : 
    1062           0 :         do_log(SMB_VFS_OP_REWINDDIR, True, handle, "");
    1063           0 : }
    1064             : 
    1065         176 : static int smb_full_audit_mkdirat(vfs_handle_struct *handle,
    1066             :                         struct files_struct *dirfsp,
    1067             :                         const struct smb_filename *smb_fname,
    1068             :                         mode_t mode)
    1069             : {
    1070         176 :         struct smb_filename *full_fname = NULL;
    1071             :         int result;
    1072             : 
    1073         176 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1074             :                                                   dirfsp,
    1075             :                                                   smb_fname);
    1076         176 :         if (full_fname == NULL) {
    1077           0 :                 errno = ENOMEM;
    1078           0 :                 return -1;
    1079             :         }
    1080             : 
    1081         176 :         result = SMB_VFS_NEXT_MKDIRAT(handle,
    1082             :                         dirfsp,
    1083             :                         smb_fname,
    1084             :                         mode);
    1085             : 
    1086         176 :         do_log(SMB_VFS_OP_MKDIRAT,
    1087             :                (result >= 0),
    1088             :                handle,
    1089             :                "%s",
    1090             :                smb_fname_str_do_log(handle->conn, full_fname));
    1091             : 
    1092         176 :         TALLOC_FREE(full_fname);
    1093             : 
    1094         176 :         return result;
    1095             : }
    1096             : 
    1097        2302 : static int smb_full_audit_closedir(vfs_handle_struct *handle,
    1098             :                           DIR *dirp)
    1099             : {
    1100             :         int result;
    1101             : 
    1102        2302 :         result = SMB_VFS_NEXT_CLOSEDIR(handle, dirp);
    1103             : 
    1104        2302 :         do_log(SMB_VFS_OP_CLOSEDIR, (result >= 0), handle, "");
    1105             : 
    1106        2302 :         return result;
    1107             : }
    1108             : 
    1109       73127 : static int smb_full_audit_openat(vfs_handle_struct *handle,
    1110             :                                  const struct files_struct *dirfsp,
    1111             :                                  const struct smb_filename *smb_fname,
    1112             :                                  struct files_struct *fsp,
    1113             :                                  const struct vfs_open_how *how)
    1114             : {
    1115             :         int result;
    1116             : 
    1117       73127 :         result = SMB_VFS_NEXT_OPENAT(handle, dirfsp, smb_fname, fsp, how);
    1118             : 
    1119      146254 :         do_log(SMB_VFS_OP_OPENAT, (result >= 0), handle, "%s|%s",
    1120       73127 :                ((how->flags & O_WRONLY) || (how->flags & O_RDWR))?"w":"r",
    1121             :                fsp_str_do_log(fsp));
    1122             : 
    1123       73127 :         return result;
    1124             : }
    1125             : 
    1126        7397 : static NTSTATUS smb_full_audit_create_file(vfs_handle_struct *handle,
    1127             :                                       struct smb_request *req,
    1128             :                                       struct files_struct *dirfsp,
    1129             :                                       struct smb_filename *smb_fname,
    1130             :                                       uint32_t access_mask,
    1131             :                                       uint32_t share_access,
    1132             :                                       uint32_t create_disposition,
    1133             :                                       uint32_t create_options,
    1134             :                                       uint32_t file_attributes,
    1135             :                                       uint32_t oplock_request,
    1136             :                                       const struct smb2_lease *lease,
    1137             :                                       uint64_t allocation_size,
    1138             :                                       uint32_t private_flags,
    1139             :                                       struct security_descriptor *sd,
    1140             :                                       struct ea_list *ea_list,
    1141             :                                       files_struct **result_fsp,
    1142             :                                       int *pinfo,
    1143             :                                       const struct smb2_create_blobs *in_context_blobs,
    1144             :                                       struct smb2_create_blobs *out_context_blobs)
    1145             : {
    1146             :         NTSTATUS result;
    1147             :         const char* str_create_disposition;
    1148             : 
    1149        7397 :         switch (create_disposition) {
    1150           2 :         case FILE_SUPERSEDE:
    1151           2 :                 str_create_disposition = "supersede";
    1152           2 :                 break;
    1153          93 :         case FILE_OVERWRITE_IF:
    1154          93 :                 str_create_disposition = "overwrite_if";
    1155          93 :                 break;
    1156        7005 :         case FILE_OPEN:
    1157        7005 :                 str_create_disposition = "open";
    1158        7005 :                 break;
    1159           2 :         case FILE_OVERWRITE:
    1160           2 :                 str_create_disposition = "overwrite";
    1161           2 :                 break;
    1162         139 :         case FILE_CREATE:
    1163         139 :                 str_create_disposition = "create";
    1164         139 :                 break;
    1165         154 :         case FILE_OPEN_IF:
    1166         154 :                 str_create_disposition = "open_if";
    1167         154 :                 break;
    1168           2 :         default:
    1169           2 :                 str_create_disposition = "unknown";
    1170             :         }
    1171             : 
    1172        7397 :         result = SMB_VFS_NEXT_CREATE_FILE(
    1173             :                 handle,                                 /* handle */
    1174             :                 req,                                    /* req */
    1175             :                 dirfsp,                                 /* dirfsp */
    1176             :                 smb_fname,                              /* fname */
    1177             :                 access_mask,                            /* access_mask */
    1178             :                 share_access,                           /* share_access */
    1179             :                 create_disposition,                     /* create_disposition*/
    1180             :                 create_options,                         /* create_options */
    1181             :                 file_attributes,                        /* file_attributes */
    1182             :                 oplock_request,                         /* oplock_request */
    1183             :                 lease,                                  /* lease */
    1184             :                 allocation_size,                        /* allocation_size */
    1185             :                 private_flags,
    1186             :                 sd,                                     /* sd */
    1187             :                 ea_list,                                /* ea_list */
    1188             :                 result_fsp,                             /* result */
    1189             :                 pinfo,                                  /* pinfo */
    1190             :                 in_context_blobs, out_context_blobs);   /* create context */
    1191             : 
    1192       14794 :         do_log(SMB_VFS_OP_CREATE_FILE, (NT_STATUS_IS_OK(result)), handle,
    1193             :                "0x%x|%s|%s|%s", access_mask,
    1194        7397 :                create_options & FILE_DIRECTORY_FILE ? "dir" : "file",
    1195             :                str_create_disposition,
    1196             :                 smb_fname_str_do_log(handle->conn, smb_fname));
    1197             : 
    1198        7397 :         return result;
    1199             : }
    1200             : 
    1201       37787 : static int smb_full_audit_close(vfs_handle_struct *handle, files_struct *fsp)
    1202             : {
    1203             :         int result;
    1204             : 
    1205       37787 :         result = SMB_VFS_NEXT_CLOSE(handle, fsp);
    1206             : 
    1207       37787 :         do_log(SMB_VFS_OP_CLOSE, (result >= 0), handle, "%s",
    1208             :                fsp_str_do_log(fsp));
    1209             : 
    1210       37787 :         return result;
    1211             : }
    1212             : 
    1213           0 : static ssize_t smb_full_audit_pread(vfs_handle_struct *handle, files_struct *fsp,
    1214             :                            void *data, size_t n, off_t offset)
    1215             : {
    1216             :         ssize_t result;
    1217             : 
    1218           0 :         result = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
    1219             : 
    1220           0 :         do_log(SMB_VFS_OP_PREAD, (result >= 0), handle, "%s",
    1221             :                fsp_str_do_log(fsp));
    1222             : 
    1223           0 :         return result;
    1224             : }
    1225             : 
    1226             : struct smb_full_audit_pread_state {
    1227             :         vfs_handle_struct *handle;
    1228             :         files_struct *fsp;
    1229             :         ssize_t ret;
    1230             :         struct vfs_aio_state vfs_aio_state;
    1231             : };
    1232             : 
    1233             : static void smb_full_audit_pread_done(struct tevent_req *subreq);
    1234             : 
    1235          19 : static struct tevent_req *smb_full_audit_pread_send(
    1236             :         struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
    1237             :         struct tevent_context *ev, struct files_struct *fsp,
    1238             :         void *data, size_t n, off_t offset)
    1239             : {
    1240             :         struct tevent_req *req, *subreq;
    1241             :         struct smb_full_audit_pread_state *state;
    1242             : 
    1243          19 :         req = tevent_req_create(mem_ctx, &state,
    1244             :                                 struct smb_full_audit_pread_state);
    1245          19 :         if (req == NULL) {
    1246           0 :                 do_log(SMB_VFS_OP_PREAD_SEND, false, handle, "%s",
    1247             :                        fsp_str_do_log(fsp));
    1248           0 :                 return NULL;
    1249             :         }
    1250          19 :         state->handle = handle;
    1251          19 :         state->fsp = fsp;
    1252             : 
    1253          19 :         subreq = SMB_VFS_NEXT_PREAD_SEND(state, ev, handle, fsp, data,
    1254             :                                          n, offset);
    1255          19 :         if (tevent_req_nomem(subreq, req)) {
    1256           0 :                 do_log(SMB_VFS_OP_PREAD_SEND, false, handle, "%s",
    1257             :                        fsp_str_do_log(fsp));
    1258           0 :                 return tevent_req_post(req, ev);
    1259             :         }
    1260          19 :         tevent_req_set_callback(subreq, smb_full_audit_pread_done, req);
    1261             : 
    1262          19 :         do_log(SMB_VFS_OP_PREAD_SEND, true, handle, "%s", fsp_str_do_log(fsp));
    1263          19 :         return req;
    1264             : }
    1265             : 
    1266          19 : static void smb_full_audit_pread_done(struct tevent_req *subreq)
    1267             : {
    1268          19 :         struct tevent_req *req = tevent_req_callback_data(
    1269             :                 subreq, struct tevent_req);
    1270          19 :         struct smb_full_audit_pread_state *state = tevent_req_data(
    1271             :                 req, struct smb_full_audit_pread_state);
    1272             : 
    1273          19 :         state->ret = SMB_VFS_PREAD_RECV(subreq, &state->vfs_aio_state);
    1274          19 :         TALLOC_FREE(subreq);
    1275          19 :         tevent_req_done(req);
    1276          19 : }
    1277             : 
    1278          19 : static ssize_t smb_full_audit_pread_recv(struct tevent_req *req,
    1279             :                                          struct vfs_aio_state *vfs_aio_state)
    1280             : {
    1281          19 :         struct smb_full_audit_pread_state *state = tevent_req_data(
    1282             :                 req, struct smb_full_audit_pread_state);
    1283             : 
    1284          19 :         if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
    1285           0 :                 do_log(SMB_VFS_OP_PREAD_RECV, false, state->handle, "%s",
    1286           0 :                        fsp_str_do_log(state->fsp));
    1287           0 :                 return -1;
    1288             :         }
    1289             : 
    1290          19 :         do_log(SMB_VFS_OP_PREAD_RECV, (state->ret >= 0), state->handle, "%s",
    1291          19 :                fsp_str_do_log(state->fsp));
    1292             : 
    1293          19 :         *vfs_aio_state = state->vfs_aio_state;
    1294          19 :         return state->ret;
    1295             : }
    1296             : 
    1297          20 : static ssize_t smb_full_audit_pwrite(vfs_handle_struct *handle, files_struct *fsp,
    1298             :                             const void *data, size_t n,
    1299             :                             off_t offset)
    1300             : {
    1301             :         ssize_t result;
    1302             : 
    1303          20 :         result = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
    1304             : 
    1305          20 :         do_log(SMB_VFS_OP_PWRITE, (result >= 0), handle, "%s",
    1306             :                fsp_str_do_log(fsp));
    1307             : 
    1308          20 :         return result;
    1309             : }
    1310             : 
    1311             : struct smb_full_audit_pwrite_state {
    1312             :         vfs_handle_struct *handle;
    1313             :         files_struct *fsp;
    1314             :         ssize_t ret;
    1315             :         struct vfs_aio_state vfs_aio_state;
    1316             : };
    1317             : 
    1318             : static void smb_full_audit_pwrite_done(struct tevent_req *subreq);
    1319             : 
    1320          49 : static struct tevent_req *smb_full_audit_pwrite_send(
    1321             :         struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
    1322             :         struct tevent_context *ev, struct files_struct *fsp,
    1323             :         const void *data, size_t n, off_t offset)
    1324             : {
    1325             :         struct tevent_req *req, *subreq;
    1326             :         struct smb_full_audit_pwrite_state *state;
    1327             : 
    1328          49 :         req = tevent_req_create(mem_ctx, &state,
    1329             :                                 struct smb_full_audit_pwrite_state);
    1330          49 :         if (req == NULL) {
    1331           0 :                 do_log(SMB_VFS_OP_PWRITE_SEND, false, handle, "%s",
    1332             :                        fsp_str_do_log(fsp));
    1333           0 :                 return NULL;
    1334             :         }
    1335          49 :         state->handle = handle;
    1336          49 :         state->fsp = fsp;
    1337             : 
    1338          49 :         subreq = SMB_VFS_NEXT_PWRITE_SEND(state, ev, handle, fsp, data,
    1339             :                                          n, offset);
    1340          49 :         if (tevent_req_nomem(subreq, req)) {
    1341           0 :                 do_log(SMB_VFS_OP_PWRITE_SEND, false, handle, "%s",
    1342             :                        fsp_str_do_log(fsp));
    1343           0 :                 return tevent_req_post(req, ev);
    1344             :         }
    1345          49 :         tevent_req_set_callback(subreq, smb_full_audit_pwrite_done, req);
    1346             : 
    1347          49 :         do_log(SMB_VFS_OP_PWRITE_SEND, true, handle, "%s",
    1348             :                fsp_str_do_log(fsp));
    1349          49 :         return req;
    1350             : }
    1351             : 
    1352          49 : static void smb_full_audit_pwrite_done(struct tevent_req *subreq)
    1353             : {
    1354          49 :         struct tevent_req *req = tevent_req_callback_data(
    1355             :                 subreq, struct tevent_req);
    1356          49 :         struct smb_full_audit_pwrite_state *state = tevent_req_data(
    1357             :                 req, struct smb_full_audit_pwrite_state);
    1358             : 
    1359          49 :         state->ret = SMB_VFS_PWRITE_RECV(subreq, &state->vfs_aio_state);
    1360          49 :         TALLOC_FREE(subreq);
    1361          49 :         tevent_req_done(req);
    1362          49 : }
    1363             : 
    1364          49 : static ssize_t smb_full_audit_pwrite_recv(struct tevent_req *req,
    1365             :                                           struct vfs_aio_state *vfs_aio_state)
    1366             : {
    1367          49 :         struct smb_full_audit_pwrite_state *state = tevent_req_data(
    1368             :                 req, struct smb_full_audit_pwrite_state);
    1369             : 
    1370          49 :         if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
    1371           0 :                 do_log(SMB_VFS_OP_PWRITE_RECV, false, state->handle, "%s",
    1372           0 :                        fsp_str_do_log(state->fsp));
    1373           0 :                 return -1;
    1374             :         }
    1375             : 
    1376          49 :         do_log(SMB_VFS_OP_PWRITE_RECV, (state->ret >= 0), state->handle, "%s",
    1377          49 :                fsp_str_do_log(state->fsp));
    1378             : 
    1379          49 :         *vfs_aio_state = state->vfs_aio_state;
    1380          49 :         return state->ret;
    1381             : }
    1382             : 
    1383           0 : static off_t smb_full_audit_lseek(vfs_handle_struct *handle, files_struct *fsp,
    1384             :                              off_t offset, int whence)
    1385             : {
    1386             :         ssize_t result;
    1387             : 
    1388           0 :         result = SMB_VFS_NEXT_LSEEK(handle, fsp, offset, whence);
    1389             : 
    1390           0 :         do_log(SMB_VFS_OP_LSEEK, (result != (ssize_t)-1), handle,
    1391             :                "%s", fsp_str_do_log(fsp));
    1392             : 
    1393           0 :         return result;
    1394             : }
    1395             : 
    1396           0 : static ssize_t smb_full_audit_sendfile(vfs_handle_struct *handle, int tofd,
    1397             :                               files_struct *fromfsp,
    1398             :                               const DATA_BLOB *hdr, off_t offset,
    1399             :                               size_t n)
    1400             : {
    1401             :         ssize_t result;
    1402             : 
    1403           0 :         result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fromfsp, hdr, offset, n);
    1404             : 
    1405           0 :         do_log(SMB_VFS_OP_SENDFILE, (result >= 0), handle,
    1406             :                "%s", fsp_str_do_log(fromfsp));
    1407             : 
    1408           0 :         return result;
    1409             : }
    1410             : 
    1411           0 : static ssize_t smb_full_audit_recvfile(vfs_handle_struct *handle, int fromfd,
    1412             :                       files_struct *tofsp,
    1413             :                               off_t offset,
    1414             :                               size_t n)
    1415             : {
    1416             :         ssize_t result;
    1417             : 
    1418           0 :         result = SMB_VFS_NEXT_RECVFILE(handle, fromfd, tofsp, offset, n);
    1419             : 
    1420           0 :         do_log(SMB_VFS_OP_RECVFILE, (result >= 0), handle,
    1421             :                "%s", fsp_str_do_log(tofsp));
    1422             : 
    1423           0 :         return result;
    1424             : }
    1425             : 
    1426          20 : static int smb_full_audit_renameat(vfs_handle_struct *handle,
    1427             :                                 files_struct *srcfsp,
    1428             :                                 const struct smb_filename *smb_fname_src,
    1429             :                                 files_struct *dstfsp,
    1430             :                                 const struct smb_filename *smb_fname_dst)
    1431             : {
    1432             :         int result;
    1433             :         int saved_errno;
    1434          20 :         struct smb_filename *full_fname_src = NULL;
    1435          20 :         struct smb_filename *full_fname_dst = NULL;
    1436             : 
    1437          20 :         full_fname_src = full_path_from_dirfsp_atname(talloc_tos(),
    1438             :                                                       srcfsp,
    1439             :                                                       smb_fname_src);
    1440          20 :         if (full_fname_src == NULL) {
    1441           0 :                 errno = ENOMEM;
    1442           0 :                 return -1;
    1443             :         }
    1444          20 :         full_fname_dst = full_path_from_dirfsp_atname(talloc_tos(),
    1445             :                                                       dstfsp,
    1446             :                                                       smb_fname_dst);
    1447          20 :         if (full_fname_dst == NULL) {
    1448           0 :                 TALLOC_FREE(full_fname_src);
    1449           0 :                 errno = ENOMEM;
    1450           0 :                 return -1;
    1451             :         }
    1452             : 
    1453          20 :         result = SMB_VFS_NEXT_RENAMEAT(handle,
    1454             :                                 srcfsp,
    1455             :                                 smb_fname_src,
    1456             :                                 dstfsp,
    1457             :                                 smb_fname_dst);
    1458             : 
    1459          20 :         if (result == -1) {
    1460           0 :                 saved_errno = errno;
    1461             :         }
    1462          20 :         do_log(SMB_VFS_OP_RENAMEAT, (result >= 0), handle, "%s|%s",
    1463             :                smb_fname_str_do_log(handle->conn, full_fname_src),
    1464             :                smb_fname_str_do_log(handle->conn, full_fname_dst));
    1465             : 
    1466          20 :         TALLOC_FREE(full_fname_src);
    1467          20 :         TALLOC_FREE(full_fname_dst);
    1468             : 
    1469          20 :         if (result == -1) {
    1470           0 :                 errno = saved_errno;
    1471             :         }
    1472          20 :         return result;
    1473             : }
    1474             : 
    1475             : struct smb_full_audit_fsync_state {
    1476             :         vfs_handle_struct *handle;
    1477             :         files_struct *fsp;
    1478             :         int ret;
    1479             :         struct vfs_aio_state vfs_aio_state;
    1480             : };
    1481             : 
    1482             : static void smb_full_audit_fsync_done(struct tevent_req *subreq);
    1483             : 
    1484           0 : static struct tevent_req *smb_full_audit_fsync_send(
    1485             :         struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx,
    1486             :         struct tevent_context *ev, struct files_struct *fsp)
    1487             : {
    1488             :         struct tevent_req *req, *subreq;
    1489             :         struct smb_full_audit_fsync_state *state;
    1490             : 
    1491           0 :         req = tevent_req_create(mem_ctx, &state,
    1492             :                                 struct smb_full_audit_fsync_state);
    1493           0 :         if (req == NULL) {
    1494           0 :                 do_log(SMB_VFS_OP_FSYNC_SEND, false, handle, "%s",
    1495             :                        fsp_str_do_log(fsp));
    1496           0 :                 return NULL;
    1497             :         }
    1498           0 :         state->handle = handle;
    1499           0 :         state->fsp = fsp;
    1500             : 
    1501           0 :         subreq = SMB_VFS_NEXT_FSYNC_SEND(state, ev, handle, fsp);
    1502           0 :         if (tevent_req_nomem(subreq, req)) {
    1503           0 :                 do_log(SMB_VFS_OP_FSYNC_SEND, false, handle, "%s",
    1504             :                        fsp_str_do_log(fsp));
    1505           0 :                 return tevent_req_post(req, ev);
    1506             :         }
    1507           0 :         tevent_req_set_callback(subreq, smb_full_audit_fsync_done, req);
    1508             : 
    1509           0 :         do_log(SMB_VFS_OP_FSYNC_SEND, true, handle, "%s", fsp_str_do_log(fsp));
    1510           0 :         return req;
    1511             : }
    1512             : 
    1513           0 : static void smb_full_audit_fsync_done(struct tevent_req *subreq)
    1514             : {
    1515           0 :         struct tevent_req *req = tevent_req_callback_data(
    1516             :                 subreq, struct tevent_req);
    1517           0 :         struct smb_full_audit_fsync_state *state = tevent_req_data(
    1518             :                 req, struct smb_full_audit_fsync_state);
    1519             : 
    1520           0 :         state->ret = SMB_VFS_FSYNC_RECV(subreq, &state->vfs_aio_state);
    1521           0 :         TALLOC_FREE(subreq);
    1522           0 :         tevent_req_done(req);
    1523           0 : }
    1524             : 
    1525           0 : static int smb_full_audit_fsync_recv(struct tevent_req *req,
    1526             :                                      struct vfs_aio_state *vfs_aio_state)
    1527             : {
    1528           0 :         struct smb_full_audit_fsync_state *state = tevent_req_data(
    1529             :                 req, struct smb_full_audit_fsync_state);
    1530             : 
    1531           0 :         if (tevent_req_is_unix_error(req, &vfs_aio_state->error)) {
    1532           0 :                 do_log(SMB_VFS_OP_FSYNC_RECV, false, state->handle, "%s",
    1533           0 :                        fsp_str_do_log(state->fsp));
    1534           0 :                 return -1;
    1535             :         }
    1536             : 
    1537           0 :         do_log(SMB_VFS_OP_FSYNC_RECV, (state->ret >= 0), state->handle, "%s",
    1538           0 :                fsp_str_do_log(state->fsp));
    1539             : 
    1540           0 :         *vfs_aio_state = state->vfs_aio_state;
    1541           0 :         return state->ret;
    1542             : }
    1543             : 
    1544       48668 : static int smb_full_audit_stat(vfs_handle_struct *handle,
    1545             :                                struct smb_filename *smb_fname)
    1546             : {
    1547             :         int result;
    1548             : 
    1549       48668 :         result = SMB_VFS_NEXT_STAT(handle, smb_fname);
    1550             : 
    1551       48668 :         do_log(SMB_VFS_OP_STAT, (result >= 0), handle, "%s",
    1552             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1553             : 
    1554       48668 :         return result;
    1555             : }
    1556             : 
    1557      205783 : static int smb_full_audit_fstat(vfs_handle_struct *handle, files_struct *fsp,
    1558             :                        SMB_STRUCT_STAT *sbuf)
    1559             : {
    1560             :         int result;
    1561             : 
    1562      205783 :         result = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf);
    1563             : 
    1564      205783 :         do_log(SMB_VFS_OP_FSTAT, (result >= 0), handle, "%s",
    1565             :                fsp_str_do_log(fsp));
    1566             : 
    1567      205783 :         return result;
    1568             : }
    1569             : 
    1570         103 : static int smb_full_audit_lstat(vfs_handle_struct *handle,
    1571             :                                 struct smb_filename *smb_fname)
    1572             : {
    1573             :         int result;
    1574             : 
    1575         103 :         result = SMB_VFS_NEXT_LSTAT(handle, smb_fname);
    1576             : 
    1577         103 :         do_log(SMB_VFS_OP_LSTAT, (result >= 0), handle, "%s",
    1578             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1579             : 
    1580         103 :         return result;
    1581             : }
    1582             : 
    1583         120 : static int smb_full_audit_fstatat(
    1584             :         struct vfs_handle_struct *handle,
    1585             :         const struct files_struct *dirfsp,
    1586             :         const struct smb_filename *smb_fname,
    1587             :         SMB_STRUCT_STAT *sbuf,
    1588             :         int flags)
    1589             : {
    1590             :         int result;
    1591             : 
    1592         120 :         result = SMB_VFS_NEXT_FSTATAT(handle, dirfsp, smb_fname, sbuf, flags);
    1593             : 
    1594         120 :         do_log(SMB_VFS_OP_FSTATAT,
    1595             :                (result >= 0),
    1596             :                handle,
    1597             :                "%s/%s",
    1598             :                fsp_str_do_log(dirfsp),
    1599             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1600             : 
    1601         120 :         return result;
    1602             : }
    1603       13487 : static uint64_t smb_full_audit_get_alloc_size(vfs_handle_struct *handle,
    1604             :                        files_struct *fsp, const SMB_STRUCT_STAT *sbuf)
    1605             : {
    1606             :         uint64_t result;
    1607             : 
    1608       13487 :         result = SMB_VFS_NEXT_GET_ALLOC_SIZE(handle, fsp, sbuf);
    1609             : 
    1610       13487 :         do_log(SMB_VFS_OP_GET_ALLOC_SIZE, (result != (uint64_t)-1), handle,
    1611             :                         "%llu", (unsigned long long)result);
    1612             : 
    1613       13487 :         return result;
    1614             : }
    1615             : 
    1616         333 : static int smb_full_audit_unlinkat(vfs_handle_struct *handle,
    1617             :                         struct files_struct *dirfsp,
    1618             :                         const struct smb_filename *smb_fname,
    1619             :                         int flags)
    1620             : {
    1621         333 :         struct smb_filename *full_fname = NULL;
    1622             :         int result;
    1623             : 
    1624         333 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1625             :                                                   dirfsp,
    1626             :                                                   smb_fname);
    1627         333 :         if (full_fname == NULL) {
    1628           0 :                 return -1;
    1629             :         }
    1630             : 
    1631         333 :         result = SMB_VFS_NEXT_UNLINKAT(handle,
    1632             :                         dirfsp,
    1633             :                         smb_fname,
    1634             :                         flags);
    1635             : 
    1636         333 :         do_log(SMB_VFS_OP_UNLINKAT, (result >= 0), handle, "%s",
    1637             :                smb_fname_str_do_log(handle->conn, full_fname));
    1638             : 
    1639         333 :         TALLOC_FREE(full_fname);
    1640         333 :         return result;
    1641             : }
    1642             : 
    1643           0 : static int smb_full_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp,
    1644             :                         mode_t mode)
    1645             : {
    1646             :         int result;
    1647             : 
    1648           0 :         result = SMB_VFS_NEXT_FCHMOD(handle, fsp, mode);
    1649             : 
    1650           0 :         do_log(SMB_VFS_OP_FCHMOD, (result >= 0), handle,
    1651             :                "%s|%o", fsp_str_do_log(fsp), mode);
    1652             : 
    1653           0 :         return result;
    1654             : }
    1655             : 
    1656           0 : static int smb_full_audit_fchown(vfs_handle_struct *handle, files_struct *fsp,
    1657             :                         uid_t uid, gid_t gid)
    1658             : {
    1659             :         int result;
    1660             : 
    1661           0 :         result = SMB_VFS_NEXT_FCHOWN(handle, fsp, uid, gid);
    1662             : 
    1663           0 :         do_log(SMB_VFS_OP_FCHOWN, (result >= 0), handle, "%s|%ld|%ld",
    1664             :                fsp_str_do_log(fsp), (long int)uid, (long int)gid);
    1665             : 
    1666           0 :         return result;
    1667             : }
    1668             : 
    1669           0 : static int smb_full_audit_lchown(vfs_handle_struct *handle,
    1670             :                         const struct smb_filename *smb_fname,
    1671             :                         uid_t uid,
    1672             :                         gid_t gid)
    1673             : {
    1674             :         int result;
    1675             : 
    1676           0 :         result = SMB_VFS_NEXT_LCHOWN(handle, smb_fname, uid, gid);
    1677             : 
    1678           0 :         do_log(SMB_VFS_OP_LCHOWN, (result >= 0), handle, "%s|%ld|%ld",
    1679           0 :                smb_fname->base_name, (long int)uid, (long int)gid);
    1680             : 
    1681           0 :         return result;
    1682             : }
    1683             : 
    1684       17538 : static int smb_full_audit_chdir(vfs_handle_struct *handle,
    1685             :                         const struct smb_filename *smb_fname)
    1686             : {
    1687             :         int result;
    1688             : 
    1689       17538 :         result = SMB_VFS_NEXT_CHDIR(handle, smb_fname);
    1690             : 
    1691       17538 :         do_log(SMB_VFS_OP_CHDIR,
    1692             :                (result >= 0),
    1693             :                handle,
    1694             :                "chdir|%s",
    1695             :                smb_fname_str_do_log(handle->conn, smb_fname));
    1696             : 
    1697       17538 :         return result;
    1698             : }
    1699             : 
    1700        3267 : static struct smb_filename *smb_full_audit_getwd(vfs_handle_struct *handle,
    1701             :                                 TALLOC_CTX *ctx)
    1702             : {
    1703             :         struct smb_filename *result;
    1704             : 
    1705        3267 :         result = SMB_VFS_NEXT_GETWD(handle, ctx);
    1706             : 
    1707        3267 :         do_log(SMB_VFS_OP_GETWD, (result != NULL), handle, "%s",
    1708             :                 result == NULL? "" : result->base_name);
    1709             : 
    1710        3267 :         return result;
    1711             : }
    1712             : 
    1713         113 : static int smb_full_audit_fntimes(vfs_handle_struct *handle,
    1714             :                                   files_struct *fsp,
    1715             :                                   struct smb_file_time *ft)
    1716             : {
    1717             :         int result;
    1718         113 :         time_t create_time = convert_timespec_to_time_t(ft->create_time);
    1719         113 :         time_t atime = convert_timespec_to_time_t(ft->atime);
    1720         113 :         time_t mtime = convert_timespec_to_time_t(ft->mtime);
    1721         113 :         time_t ctime = convert_timespec_to_time_t(ft->ctime);
    1722         113 :         const char *create_time_str = "";
    1723         113 :         const char *atime_str = "";
    1724         113 :         const char *mtime_str = "";
    1725         113 :         const char *ctime_str = "";
    1726         113 :         TALLOC_CTX *frame = talloc_stackframe();
    1727             : 
    1728         113 :         if (frame == NULL) {
    1729           0 :                 errno = ENOMEM;
    1730           0 :                 return -1;
    1731             :         }
    1732             : 
    1733         113 :         result = SMB_VFS_NEXT_FNTIMES(handle, fsp, ft);
    1734             : 
    1735         113 :         if (create_time > 0) {
    1736         113 :                 create_time_str = timestring(frame, create_time);
    1737             :         }
    1738         113 :         if (atime > 0) {
    1739         113 :                 atime_str = timestring(frame, atime);
    1740             :         }
    1741         113 :         if (mtime > 0) {
    1742         113 :                 mtime_str = timestring(frame, mtime);
    1743             :         }
    1744         113 :         if (ctime > 0) {
    1745         113 :                 ctime_str = timestring(frame, ctime);
    1746             :         }
    1747             : 
    1748         113 :         do_log(SMB_VFS_OP_FNTIMES,
    1749             :                (result >= 0),
    1750             :                handle,
    1751             :                "%s|%s|%s|%s|%s",
    1752             :                fsp_str_do_log(fsp),
    1753             :                create_time_str,
    1754             :                atime_str,
    1755             :                mtime_str,
    1756             :                ctime_str);
    1757             : 
    1758         113 :         TALLOC_FREE(frame);
    1759             : 
    1760         113 :         return result;
    1761             : }
    1762             : 
    1763          14 : static int smb_full_audit_ftruncate(vfs_handle_struct *handle, files_struct *fsp,
    1764             :                            off_t len)
    1765             : {
    1766             :         int result;
    1767             : 
    1768          14 :         result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len);
    1769             : 
    1770          14 :         do_log(SMB_VFS_OP_FTRUNCATE, (result >= 0), handle,
    1771             :                "%s", fsp_str_do_log(fsp));
    1772             : 
    1773          14 :         return result;
    1774             : }
    1775             : 
    1776           0 : static int smb_full_audit_fallocate(vfs_handle_struct *handle, files_struct *fsp,
    1777             :                            uint32_t mode,
    1778             :                            off_t offset,
    1779             :                            off_t len)
    1780             : {
    1781             :         int result;
    1782             : 
    1783           0 :         result = SMB_VFS_NEXT_FALLOCATE(handle, fsp, mode, offset, len);
    1784             : 
    1785           0 :         do_log(SMB_VFS_OP_FALLOCATE, (result >= 0), handle,
    1786             :                "%s", fsp_str_do_log(fsp));
    1787             : 
    1788           0 :         return result;
    1789             : }
    1790             : 
    1791          10 : static bool smb_full_audit_lock(vfs_handle_struct *handle, files_struct *fsp,
    1792             :                        int op, off_t offset, off_t count, int type)
    1793             : {
    1794             :         bool result;
    1795             : 
    1796          10 :         result = SMB_VFS_NEXT_LOCK(handle, fsp, op, offset, count, type);
    1797             : 
    1798          10 :         do_log(SMB_VFS_OP_LOCK, result, handle, "%s", fsp_str_do_log(fsp));
    1799             : 
    1800          10 :         return result;
    1801             : }
    1802             : 
    1803           0 : static int smb_full_audit_filesystem_sharemode(struct vfs_handle_struct *handle,
    1804             :                                                struct files_struct *fsp,
    1805             :                                                uint32_t share_access,
    1806             :                                                uint32_t access_mask)
    1807             : {
    1808             :         int result;
    1809             : 
    1810           0 :         result = SMB_VFS_NEXT_FILESYSTEM_SHAREMODE(handle,
    1811             :                                                    fsp,
    1812             :                                                    share_access,
    1813             :                                                    access_mask);
    1814             : 
    1815           0 :         do_log(SMB_VFS_OP_FILESYSTEM_SHAREMODE, (result >= 0), handle, "%s",
    1816             :                fsp_str_do_log(fsp));
    1817             : 
    1818           0 :         return result;
    1819             : }
    1820             : 
    1821         620 : static int smb_full_audit_fcntl(struct vfs_handle_struct *handle,
    1822             :                                 struct files_struct *fsp,
    1823             :                                 int cmd, va_list cmd_arg)
    1824             : {
    1825             :         void *arg;
    1826             :         va_list dup_cmd_arg;
    1827             :         int result;
    1828             : 
    1829         620 :         va_copy(dup_cmd_arg, cmd_arg);
    1830         620 :         arg = va_arg(dup_cmd_arg, void *);
    1831         620 :         result = SMB_VFS_NEXT_FCNTL(handle, fsp, cmd, arg);
    1832         620 :         va_end(dup_cmd_arg);
    1833             : 
    1834         620 :         do_log(SMB_VFS_OP_FCNTL, (result >= 0), handle, "%s",
    1835             :                fsp_str_do_log(fsp));
    1836             : 
    1837         620 :         return result;
    1838             : }
    1839             : 
    1840           0 : static int smb_full_audit_linux_setlease(vfs_handle_struct *handle, files_struct *fsp,
    1841             :                                  int leasetype)
    1842             : {
    1843             :         int result;
    1844             : 
    1845           0 :         result = SMB_VFS_NEXT_LINUX_SETLEASE(handle, fsp, leasetype);
    1846             : 
    1847           0 :         do_log(SMB_VFS_OP_LINUX_SETLEASE, (result >= 0), handle, "%s",
    1848             :                fsp_str_do_log(fsp));
    1849             : 
    1850           0 :         return result;
    1851             : }
    1852             : 
    1853          88 : static bool smb_full_audit_getlock(vfs_handle_struct *handle, files_struct *fsp,
    1854             :                        off_t *poffset, off_t *pcount, int *ptype, pid_t *ppid)
    1855             : {
    1856             :         bool result;
    1857             : 
    1858          88 :         result = SMB_VFS_NEXT_GETLOCK(handle, fsp, poffset, pcount, ptype, ppid);
    1859             : 
    1860          88 :         do_log(SMB_VFS_OP_GETLOCK, result, handle, "%s", fsp_str_do_log(fsp));
    1861             : 
    1862          88 :         return result;
    1863             : }
    1864             : 
    1865           0 : static int smb_full_audit_symlinkat(vfs_handle_struct *handle,
    1866             :                         const struct smb_filename *link_contents,
    1867             :                         struct files_struct *dirfsp,
    1868             :                         const struct smb_filename *new_smb_fname)
    1869             : {
    1870           0 :         struct smb_filename *full_fname = NULL;
    1871             :         int result;
    1872             : 
    1873           0 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1874             :                                                 dirfsp,
    1875             :                                                 new_smb_fname);
    1876           0 :         if (full_fname == NULL) {
    1877           0 :                 return -1;
    1878             :         }
    1879             : 
    1880           0 :         result = SMB_VFS_NEXT_SYMLINKAT(handle,
    1881             :                                 link_contents,
    1882             :                                 dirfsp,
    1883             :                                 new_smb_fname);
    1884             : 
    1885           0 :         do_log(SMB_VFS_OP_SYMLINKAT,
    1886             :                (result >= 0),
    1887             :                handle,
    1888             :                "%s|%s",
    1889           0 :                link_contents->base_name,
    1890             :                smb_fname_str_do_log(handle->conn, full_fname));
    1891             : 
    1892           0 :         TALLOC_FREE(full_fname);
    1893             : 
    1894           0 :         return result;
    1895             : }
    1896             : 
    1897       14786 : static int smb_full_audit_readlinkat(vfs_handle_struct *handle,
    1898             :                         const struct files_struct *dirfsp,
    1899             :                         const struct smb_filename *smb_fname,
    1900             :                         char *buf,
    1901             :                         size_t bufsiz)
    1902             : {
    1903       14786 :         struct smb_filename *full_fname = NULL;
    1904             :         int result;
    1905             : 
    1906       14786 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1907             :                                                 dirfsp,
    1908             :                                                 smb_fname);
    1909       14786 :         if (full_fname == NULL) {
    1910           0 :                 return -1;
    1911             :         }
    1912             : 
    1913       14786 :         result = SMB_VFS_NEXT_READLINKAT(handle,
    1914             :                         dirfsp,
    1915             :                         smb_fname,
    1916             :                         buf,
    1917             :                         bufsiz);
    1918             : 
    1919       14786 :         do_log(SMB_VFS_OP_READLINKAT,
    1920             :                (result >= 0),
    1921             :                handle,
    1922             :                "%s",
    1923             :                smb_fname_str_do_log(handle->conn, full_fname));
    1924             : 
    1925       14786 :         TALLOC_FREE(full_fname);
    1926             : 
    1927       14786 :         return result;
    1928             : }
    1929             : 
    1930           4 : static int smb_full_audit_linkat(vfs_handle_struct *handle,
    1931             :                         files_struct *srcfsp,
    1932             :                         const struct smb_filename *old_smb_fname,
    1933             :                         files_struct *dstfsp,
    1934             :                         const struct smb_filename *new_smb_fname,
    1935             :                         int flags)
    1936             : {
    1937           4 :         struct smb_filename *old_full_fname = NULL;
    1938           4 :         struct smb_filename *new_full_fname = NULL;
    1939             :         int result;
    1940             : 
    1941           4 :         old_full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1942             :                                                 srcfsp,
    1943             :                                                 old_smb_fname);
    1944           4 :         if (old_full_fname == NULL) {
    1945           0 :                 return -1;
    1946             :         }
    1947           4 :         new_full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1948             :                                                 dstfsp,
    1949             :                                                 new_smb_fname);
    1950           4 :         if (new_full_fname == NULL) {
    1951           0 :                 TALLOC_FREE(old_full_fname);
    1952           0 :                 return -1;
    1953             :         }
    1954           4 :         result = SMB_VFS_NEXT_LINKAT(handle,
    1955             :                         srcfsp,
    1956             :                         old_smb_fname,
    1957             :                         dstfsp,
    1958             :                         new_smb_fname,
    1959             :                         flags);
    1960             : 
    1961           4 :         do_log(SMB_VFS_OP_LINKAT,
    1962             :                (result >= 0),
    1963             :                handle,
    1964             :                "%s|%s",
    1965             :                smb_fname_str_do_log(handle->conn, old_full_fname),
    1966             :                smb_fname_str_do_log(handle->conn, new_full_fname));
    1967             : 
    1968           4 :         TALLOC_FREE(old_full_fname);
    1969           4 :         TALLOC_FREE(new_full_fname);
    1970             : 
    1971           4 :         return result;
    1972             : }
    1973             : 
    1974           0 : static int smb_full_audit_mknodat(vfs_handle_struct *handle,
    1975             :                         files_struct *dirfsp,
    1976             :                         const struct smb_filename *smb_fname,
    1977             :                         mode_t mode,
    1978             :                         SMB_DEV_T dev)
    1979             : {
    1980           0 :         struct smb_filename *full_fname = NULL;
    1981             :         int result;
    1982             : 
    1983           0 :         full_fname = full_path_from_dirfsp_atname(talloc_tos(),
    1984             :                                                 dirfsp,
    1985             :                                                 smb_fname);
    1986           0 :         if (full_fname == NULL) {
    1987           0 :                 return -1;
    1988             :         }
    1989             : 
    1990           0 :         result = SMB_VFS_NEXT_MKNODAT(handle,
    1991             :                                 dirfsp,
    1992             :                                 smb_fname,
    1993             :                                 mode,
    1994             :                                 dev);
    1995             : 
    1996           0 :         do_log(SMB_VFS_OP_MKNODAT,
    1997             :                (result >= 0),
    1998             :                handle,
    1999             :                "%s",
    2000             :                smb_fname_str_do_log(handle->conn, full_fname));
    2001             : 
    2002           0 :         TALLOC_FREE(full_fname);
    2003             : 
    2004           0 :         return result;
    2005             : }
    2006             : 
    2007       39081 : static struct smb_filename *smb_full_audit_realpath(vfs_handle_struct *handle,
    2008             :                                 TALLOC_CTX *ctx,
    2009             :                                 const struct smb_filename *smb_fname)
    2010             : {
    2011       39081 :         struct smb_filename *result_fname = NULL;
    2012             : 
    2013       39081 :         result_fname = SMB_VFS_NEXT_REALPATH(handle, ctx, smb_fname);
    2014             : 
    2015       39081 :         do_log(SMB_VFS_OP_REALPATH,
    2016             :                (result_fname != NULL),
    2017             :                handle,
    2018             :                "%s",
    2019             :                smb_fname_str_do_log(handle->conn, smb_fname));
    2020             : 
    2021       39081 :         return result_fname;
    2022             : }
    2023             : 
    2024           0 : static int smb_full_audit_fchflags(vfs_handle_struct *handle,
    2025             :                         struct files_struct *fsp,
    2026             :                         unsigned int flags)
    2027             : {
    2028             :         int result;
    2029             : 
    2030           0 :         result = SMB_VFS_NEXT_FCHFLAGS(handle, fsp, flags);
    2031             : 
    2032           0 :         do_log(SMB_VFS_OP_FCHFLAGS,
    2033             :                (result != 0),
    2034             :                handle,
    2035             :                "%s",
    2036           0 :                smb_fname_str_do_log(handle->conn, fsp->fsp_name));
    2037             : 
    2038           0 :         return result;
    2039             : }
    2040             : 
    2041      235151 : static struct file_id smb_full_audit_file_id_create(struct vfs_handle_struct *handle,
    2042             :                                                     const SMB_STRUCT_STAT *sbuf)
    2043             : {
    2044      235151 :         struct file_id id_zero = { 0 };
    2045             :         struct file_id result;
    2046             :         struct file_id_buf idbuf;
    2047             : 
    2048      235151 :         result = SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
    2049             : 
    2050      235151 :         do_log(SMB_VFS_OP_FILE_ID_CREATE,
    2051      235151 :                !file_id_equal(&id_zero, &result),
    2052             :                handle,
    2053             :                "%s",
    2054      235151 :                file_id_str_buf(result, &idbuf));
    2055             : 
    2056      235151 :         return result;
    2057             : }
    2058             : 
    2059        5775 : static uint64_t smb_full_audit_fs_file_id(struct vfs_handle_struct *handle,
    2060             :                                           const SMB_STRUCT_STAT *sbuf)
    2061             : {
    2062             :         uint64_t result;
    2063             : 
    2064        5775 :         result = SMB_VFS_NEXT_FS_FILE_ID(handle, sbuf);
    2065             : 
    2066        5775 :         do_log(SMB_VFS_OP_FS_FILE_ID,
    2067             :                result != 0,
    2068             :                handle, "%" PRIu64, result);
    2069             : 
    2070        5775 :         return result;
    2071             : }
    2072             : 
    2073         635 : static NTSTATUS smb_full_audit_fstreaminfo(vfs_handle_struct *handle,
    2074             :                                           struct files_struct *fsp,
    2075             :                                           TALLOC_CTX *mem_ctx,
    2076             :                                           unsigned int *pnum_streams,
    2077             :                                           struct stream_struct **pstreams)
    2078             : {
    2079             :         NTSTATUS result;
    2080             : 
    2081         635 :         result = SMB_VFS_NEXT_FSTREAMINFO(handle, fsp, mem_ctx,
    2082             :                                          pnum_streams, pstreams);
    2083             : 
    2084        1270 :         do_log(SMB_VFS_OP_FSTREAMINFO,
    2085         635 :                NT_STATUS_IS_OK(result),
    2086             :                handle,
    2087             :                "%s",
    2088         635 :                smb_fname_str_do_log(handle->conn, fsp->fsp_name));
    2089             : 
    2090         635 :         return result;
    2091             : }
    2092             : 
    2093        1438 : static NTSTATUS smb_full_audit_get_real_filename_at(
    2094             :         struct vfs_handle_struct *handle,
    2095             :         struct files_struct *dirfsp,
    2096             :         const char *name,
    2097             :         TALLOC_CTX *mem_ctx,
    2098             :         char **found_name)
    2099             : {
    2100             :         NTSTATUS result;
    2101             : 
    2102        1438 :         result = SMB_VFS_NEXT_GET_REAL_FILENAME_AT(
    2103             :                 handle, dirfsp, name, mem_ctx, found_name);
    2104             : 
    2105        1438 :         do_log(SMB_VFS_OP_GET_REAL_FILENAME_AT,
    2106        1438 :                NT_STATUS_IS_OK(result),
    2107             :                handle,
    2108             :                "%s/%s->%s",
    2109             :                fsp_str_dbg(dirfsp),
    2110             :                name,
    2111        1438 :                NT_STATUS_IS_OK(result) ? *found_name : "");
    2112             : 
    2113        1438 :         return result;
    2114             : }
    2115             : 
    2116       49711 : static const char *smb_full_audit_connectpath(
    2117             :         vfs_handle_struct *handle,
    2118             :         const struct files_struct *dirfsp,
    2119             :         const struct smb_filename *smb_fname)
    2120             : {
    2121             :         const char *result;
    2122             : 
    2123       49711 :         result = SMB_VFS_NEXT_CONNECTPATH(handle, dirfsp, smb_fname);
    2124             : 
    2125       49711 :         do_log(SMB_VFS_OP_CONNECTPATH,
    2126             :                result != NULL,
    2127             :                handle,
    2128             :                "%s",
    2129             :                smb_fname_str_do_log(handle->conn, smb_fname));
    2130             : 
    2131       49711 :         return result;
    2132             : }
    2133             : 
    2134           5 : static NTSTATUS smb_full_audit_brl_lock_windows(struct vfs_handle_struct *handle,
    2135             :                                                 struct byte_range_lock *br_lck,
    2136             :                                                 struct lock_struct *plock)
    2137             : {
    2138             :         NTSTATUS result;
    2139             : 
    2140           5 :         result = SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock);
    2141             : 
    2142           5 :         do_log(SMB_VFS_OP_BRL_LOCK_WINDOWS, NT_STATUS_IS_OK(result), handle,
    2143             :             "%s:%llu-%llu. type=%d.",
    2144           5 :                fsp_str_do_log(brl_fsp(br_lck)),
    2145           5 :                (unsigned long long)plock->start,
    2146           5 :                (unsigned long long)plock->size,
    2147           5 :                plock->lock_type);
    2148             : 
    2149           5 :         return result;
    2150             : }
    2151             : 
    2152           9 : static bool smb_full_audit_brl_unlock_windows(struct vfs_handle_struct *handle,
    2153             :                                               struct byte_range_lock *br_lck,
    2154             :                                               const struct lock_struct *plock)
    2155             : {
    2156             :         bool result;
    2157             : 
    2158           9 :         result = SMB_VFS_NEXT_BRL_UNLOCK_WINDOWS(handle, br_lck, plock);
    2159             : 
    2160           9 :         do_log(SMB_VFS_OP_BRL_UNLOCK_WINDOWS, (result == 0), handle,
    2161           9 :                "%s:%llu-%llu:%d", fsp_str_do_log(brl_fsp(br_lck)),
    2162           9 :                (unsigned long long)plock->start,
    2163           9 :                (unsigned long long)plock->size,
    2164          18 :                plock->lock_type);
    2165             : 
    2166           9 :         return result;
    2167             : }
    2168             : 
    2169          88 : static bool smb_full_audit_strict_lock_check(struct vfs_handle_struct *handle,
    2170             :                                              struct files_struct *fsp,
    2171             :                                              struct lock_struct *plock)
    2172             : {
    2173             :         bool result;
    2174             : 
    2175          88 :         result = SMB_VFS_NEXT_STRICT_LOCK_CHECK(handle, fsp, plock);
    2176             : 
    2177          88 :         do_log(SMB_VFS_OP_STRICT_LOCK_CHECK, result, handle,
    2178             :                "%s:%llu-%llu:%d", fsp_str_do_log(fsp),
    2179          88 :                (unsigned long long)plock->start,
    2180          88 :                (unsigned long long)plock->size,
    2181          88 :                plock->lock_type);
    2182             : 
    2183          88 :         return result;
    2184             : }
    2185             : 
    2186       17775 : static NTSTATUS smb_full_audit_translate_name(struct vfs_handle_struct *handle,
    2187             :                                               const char *name,
    2188             :                                               enum vfs_translate_direction direction,
    2189             :                                               TALLOC_CTX *mem_ctx,
    2190             :                                               char **mapped_name)
    2191             : {
    2192             :         NTSTATUS result;
    2193             : 
    2194       17775 :         result = SMB_VFS_NEXT_TRANSLATE_NAME(handle, name, direction, mem_ctx,
    2195             :                                              mapped_name);
    2196             : 
    2197       17775 :         do_log(SMB_VFS_OP_TRANSLATE_NAME, NT_STATUS_IS_OK(result), handle, "");
    2198             : 
    2199       17775 :         return result;
    2200             : }
    2201             : 
    2202       43211 : static NTSTATUS smb_full_audit_parent_pathname(struct vfs_handle_struct *handle,
    2203             :                                                TALLOC_CTX *mem_ctx,
    2204             :                                                const struct smb_filename *smb_fname_in,
    2205             :                                                struct smb_filename **parent_dir_out,
    2206             :                                                struct smb_filename **atname_out)
    2207             : {
    2208             :         NTSTATUS result;
    2209             : 
    2210       43211 :         result = SMB_VFS_NEXT_PARENT_PATHNAME(handle,
    2211             :                                               mem_ctx,
    2212             :                                               smb_fname_in,
    2213             :                                               parent_dir_out,
    2214             :                                               atname_out);
    2215       43211 :         do_log(SMB_VFS_OP_CONNECTPATH,
    2216       43211 :                NT_STATUS_IS_OK(result),
    2217             :                handle,
    2218             :                "%s",
    2219             :                smb_fname_str_do_log(handle->conn, smb_fname_in));
    2220             : 
    2221       43211 :         return result;
    2222             : }
    2223             : 
    2224          48 : static NTSTATUS smb_full_audit_fsctl(struct vfs_handle_struct *handle,
    2225             :                                 struct files_struct *fsp,
    2226             :                                 TALLOC_CTX *ctx,
    2227             :                                 uint32_t function,
    2228             :                                 uint16_t req_flags,
    2229             :                                 const uint8_t *_in_data,
    2230             :                                 uint32_t in_len,
    2231             :                                 uint8_t **_out_data,
    2232             :                                 uint32_t max_out_len,
    2233             :                                 uint32_t *out_len)
    2234             : {
    2235             :         NTSTATUS result;
    2236             : 
    2237          48 :         result = SMB_VFS_NEXT_FSCTL(handle,
    2238             :                                 fsp,
    2239             :                                 ctx,
    2240             :                                 function,
    2241             :                                 req_flags,
    2242             :                                 _in_data,
    2243             :                                 in_len,
    2244             :                                 _out_data,
    2245             :                                 max_out_len,
    2246             :                                 out_len);
    2247             : 
    2248          48 :         do_log(SMB_VFS_OP_FSCTL, NT_STATUS_IS_OK(result), handle, "");
    2249             : 
    2250          48 :         return result;
    2251             : }
    2252             : 
    2253           0 : static struct tevent_req *smb_full_audit_offload_read_send(
    2254             :         TALLOC_CTX *mem_ctx,
    2255             :         struct tevent_context *ev,
    2256             :         struct vfs_handle_struct *handle,
    2257             :         struct files_struct *fsp,
    2258             :         uint32_t fsctl,
    2259             :         uint32_t ttl,
    2260             :         off_t offset,
    2261             :         size_t to_copy)
    2262             : {
    2263           0 :         struct tevent_req *req = NULL;
    2264             : 
    2265           0 :         req = SMB_VFS_NEXT_OFFLOAD_READ_SEND(mem_ctx, ev, handle, fsp,
    2266             :                                              fsctl, ttl, offset, to_copy);
    2267             : 
    2268           0 :         do_log(SMB_VFS_OP_OFFLOAD_READ_SEND, req, handle, "");
    2269             : 
    2270           0 :         return req;
    2271             : }
    2272             : 
    2273           0 : static NTSTATUS smb_full_audit_offload_read_recv(
    2274             :         struct tevent_req *req,
    2275             :         struct vfs_handle_struct *handle,
    2276             :         TALLOC_CTX *mem_ctx,
    2277             :         uint32_t *flags,
    2278             :         uint64_t *xferlen,
    2279             :         DATA_BLOB *_token_blob)
    2280             : {
    2281             :         NTSTATUS status;
    2282             : 
    2283           0 :         status = SMB_VFS_NEXT_OFFLOAD_READ_RECV(req, handle, mem_ctx,
    2284             :                                                 flags, xferlen, _token_blob);
    2285             : 
    2286           0 :         do_log(SMB_VFS_OP_OFFLOAD_READ_RECV, NT_STATUS_IS_OK(status), handle, "");
    2287             : 
    2288           0 :         return status;
    2289             : }
    2290             : 
    2291           0 : static struct tevent_req *smb_full_audit_offload_write_send(struct vfs_handle_struct *handle,
    2292             :                                                          TALLOC_CTX *mem_ctx,
    2293             :                                                          struct tevent_context *ev,
    2294             :                                                          uint32_t fsctl,
    2295             :                                                          DATA_BLOB *token,
    2296             :                                                          off_t transfer_offset,
    2297             :                                                          struct files_struct *dest_fsp,
    2298             :                                                          off_t dest_off,
    2299             :                                                             off_t num)
    2300             : {
    2301             :         struct tevent_req *req;
    2302             : 
    2303           0 :         req = SMB_VFS_NEXT_OFFLOAD_WRITE_SEND(handle, mem_ctx, ev,
    2304             :                                            fsctl, token, transfer_offset,
    2305             :                                            dest_fsp, dest_off, num);
    2306             : 
    2307           0 :         do_log(SMB_VFS_OP_OFFLOAD_WRITE_SEND, req, handle, "");
    2308             : 
    2309           0 :         return req;
    2310             : }
    2311             : 
    2312           0 : static NTSTATUS smb_full_audit_offload_write_recv(struct vfs_handle_struct *handle,
    2313             :                                                struct tevent_req *req,
    2314             :                                                off_t *copied)
    2315             : {
    2316             :         NTSTATUS result;
    2317             : 
    2318           0 :         result = SMB_VFS_NEXT_OFFLOAD_WRITE_RECV(handle, req, copied);
    2319             : 
    2320           0 :         do_log(SMB_VFS_OP_OFFLOAD_WRITE_RECV, NT_STATUS_IS_OK(result), handle, "");
    2321             : 
    2322           0 :         return result;
    2323             : }
    2324             : 
    2325           0 : static NTSTATUS smb_full_audit_fget_compression(vfs_handle_struct *handle,
    2326             :                                                TALLOC_CTX *mem_ctx,
    2327             :                                                struct files_struct *fsp,
    2328             :                                                uint16_t *_compression_fmt)
    2329             : {
    2330             :         NTSTATUS result;
    2331             : 
    2332           0 :         result = SMB_VFS_NEXT_FGET_COMPRESSION(handle, mem_ctx, fsp,
    2333             :                                               _compression_fmt);
    2334             : 
    2335           0 :         do_log(SMB_VFS_OP_FGET_COMPRESSION, NT_STATUS_IS_OK(result), handle,
    2336             :                "%s",
    2337             :                fsp_str_do_log(fsp));
    2338             : 
    2339           0 :         return result;
    2340             : }
    2341             : 
    2342           0 : static NTSTATUS smb_full_audit_set_compression(vfs_handle_struct *handle,
    2343             :                                                TALLOC_CTX *mem_ctx,
    2344             :                                                struct files_struct *fsp,
    2345             :                                                uint16_t compression_fmt)
    2346             : {
    2347             :         NTSTATUS result;
    2348             : 
    2349           0 :         result = SMB_VFS_NEXT_SET_COMPRESSION(handle, mem_ctx, fsp,
    2350             :                                               compression_fmt);
    2351             : 
    2352           0 :         do_log(SMB_VFS_OP_SET_COMPRESSION, NT_STATUS_IS_OK(result), handle,
    2353             :                "%s", fsp_str_do_log(fsp));
    2354             : 
    2355           0 :         return result;
    2356             : }
    2357             : 
    2358        5017 : static NTSTATUS smb_full_audit_freaddir_attr(struct vfs_handle_struct *handle,
    2359             :                                         struct files_struct *fsp,
    2360             :                                         TALLOC_CTX *mem_ctx,
    2361             :                                         struct readdir_attr_data **pattr_data)
    2362             : {
    2363             :         NTSTATUS status;
    2364             : 
    2365        5017 :         status = SMB_VFS_NEXT_FREADDIR_ATTR(handle, fsp, mem_ctx, pattr_data);
    2366             : 
    2367        5017 :         do_log(SMB_VFS_OP_FREADDIR_ATTR,
    2368        5017 :                NT_STATUS_IS_OK(status),
    2369             :                handle,
    2370             :                "%s",
    2371             :                fsp_str_do_log(fsp));
    2372             : 
    2373        5017 :         return status;
    2374             : }
    2375             : 
    2376             : struct smb_full_audit_get_dos_attributes_state {
    2377             :         struct vfs_aio_state aio_state;
    2378             :         vfs_handle_struct *handle;
    2379             :         files_struct *dir_fsp;
    2380             :         const struct smb_filename *smb_fname;
    2381             :         uint32_t dosmode;
    2382             : };
    2383             : 
    2384             : static void smb_full_audit_get_dos_attributes_done(struct tevent_req *subreq);
    2385             : 
    2386           0 : static struct tevent_req *smb_full_audit_get_dos_attributes_send(
    2387             :                 TALLOC_CTX *mem_ctx,
    2388             :                 struct tevent_context *ev,
    2389             :                 struct vfs_handle_struct *handle,
    2390             :                 files_struct *dir_fsp,
    2391             :                 struct smb_filename *smb_fname)
    2392             : {
    2393           0 :         struct tevent_req *req = NULL;
    2394           0 :         struct smb_full_audit_get_dos_attributes_state *state = NULL;
    2395           0 :         struct tevent_req *subreq = NULL;
    2396             : 
    2397           0 :         req = tevent_req_create(mem_ctx, &state,
    2398             :                                 struct smb_full_audit_get_dos_attributes_state);
    2399           0 :         if (req == NULL) {
    2400           0 :                 do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
    2401             :                        false,
    2402             :                        handle,
    2403             :                        "%s/%s",
    2404             :                        fsp_str_do_log(dir_fsp),
    2405             :                        smb_fname->base_name);
    2406           0 :                 return NULL;
    2407             :         }
    2408           0 :         *state = (struct smb_full_audit_get_dos_attributes_state) {
    2409             :                 .handle = handle,
    2410             :                 .dir_fsp = dir_fsp,
    2411             :                 .smb_fname = smb_fname,
    2412             :         };
    2413             : 
    2414           0 :         subreq = SMB_VFS_NEXT_GET_DOS_ATTRIBUTES_SEND(mem_ctx,
    2415             :                                                       ev,
    2416             :                                                       handle,
    2417             :                                                       dir_fsp,
    2418             :                                                       smb_fname);
    2419           0 :         if (tevent_req_nomem(subreq, req)) {
    2420           0 :                 do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
    2421             :                        false,
    2422             :                        handle,
    2423             :                        "%s/%s",
    2424             :                        fsp_str_do_log(dir_fsp),
    2425             :                        smb_fname->base_name);
    2426           0 :                 return tevent_req_post(req, ev);
    2427             :         }
    2428           0 :         tevent_req_set_callback(subreq,
    2429             :                                 smb_full_audit_get_dos_attributes_done,
    2430             :                                 req);
    2431             : 
    2432           0 :         do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_SEND,
    2433             :                true,
    2434             :                handle,
    2435             :                "%s/%s",
    2436             :                fsp_str_do_log(dir_fsp),
    2437             :                smb_fname->base_name);
    2438             : 
    2439           0 :         return req;
    2440             : }
    2441             : 
    2442           0 : static void smb_full_audit_get_dos_attributes_done(struct tevent_req *subreq)
    2443             : {
    2444             :         struct tevent_req *req =
    2445           0 :                 tevent_req_callback_data(subreq,
    2446             :                 struct tevent_req);
    2447             :         struct smb_full_audit_get_dos_attributes_state *state =
    2448           0 :                 tevent_req_data(req,
    2449             :                 struct smb_full_audit_get_dos_attributes_state);
    2450             :         NTSTATUS status;
    2451             : 
    2452           0 :         status = SMB_VFS_NEXT_GET_DOS_ATTRIBUTES_RECV(subreq,
    2453             :                                                       &state->aio_state,
    2454             :                                                       &state->dosmode);
    2455           0 :         TALLOC_FREE(subreq);
    2456           0 :         if (tevent_req_nterror(req, status)) {
    2457           0 :                 return;
    2458             :         }
    2459             : 
    2460           0 :         tevent_req_done(req);
    2461           0 :         return;
    2462             : }
    2463             : 
    2464           0 : static NTSTATUS smb_full_audit_get_dos_attributes_recv(struct tevent_req *req,
    2465             :                                                 struct vfs_aio_state *aio_state,
    2466             :                                                 uint32_t *dosmode)
    2467             : {
    2468             :         struct smb_full_audit_get_dos_attributes_state *state =
    2469           0 :                 tevent_req_data(req,
    2470             :                 struct smb_full_audit_get_dos_attributes_state);
    2471             :         NTSTATUS status;
    2472             : 
    2473           0 :         if (tevent_req_is_nterror(req, &status)) {
    2474           0 :                 do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
    2475             :                        false,
    2476             :                        state->handle,
    2477             :                        "%s/%s",
    2478           0 :                        fsp_str_do_log(state->dir_fsp),
    2479           0 :                        state->smb_fname->base_name);
    2480           0 :                 tevent_req_received(req);
    2481           0 :                 return status;
    2482             :         }
    2483             : 
    2484           0 :         do_log(SMB_VFS_OP_GET_DOS_ATTRIBUTES_RECV,
    2485             :                true,
    2486             :                state->handle,
    2487             :                "%s/%s",
    2488           0 :                fsp_str_do_log(state->dir_fsp),
    2489           0 :                state->smb_fname->base_name);
    2490             : 
    2491           0 :         *aio_state = state->aio_state;
    2492           0 :         *dosmode = state->dosmode;
    2493           0 :         tevent_req_received(req);
    2494           0 :         return NT_STATUS_OK;
    2495             : }
    2496             : 
    2497       18473 : static NTSTATUS smb_full_audit_fget_dos_attributes(
    2498             :                                 struct vfs_handle_struct *handle,
    2499             :                                 struct files_struct *fsp,
    2500             :                                 uint32_t *dosmode)
    2501             : {
    2502             :         NTSTATUS status;
    2503             : 
    2504       18473 :         status = SMB_VFS_NEXT_FGET_DOS_ATTRIBUTES(handle,
    2505             :                                 fsp,
    2506             :                                 dosmode);
    2507             : 
    2508       18473 :         do_log(SMB_VFS_OP_FGET_DOS_ATTRIBUTES,
    2509       18473 :                 NT_STATUS_IS_OK(status),
    2510             :                 handle,
    2511             :                 "%s",
    2512             :                 fsp_str_do_log(fsp));
    2513             : 
    2514       18473 :         return status;
    2515             : }
    2516             : 
    2517         417 : static NTSTATUS smb_full_audit_fset_dos_attributes(
    2518             :                                 struct vfs_handle_struct *handle,
    2519             :                                 struct files_struct *fsp,
    2520             :                                 uint32_t dosmode)
    2521             : {
    2522             :         NTSTATUS status;
    2523             : 
    2524         417 :         status = SMB_VFS_NEXT_FSET_DOS_ATTRIBUTES(handle,
    2525             :                                 fsp,
    2526             :                                 dosmode);
    2527             : 
    2528         417 :         do_log(SMB_VFS_OP_FSET_DOS_ATTRIBUTES,
    2529         417 :                 NT_STATUS_IS_OK(status),
    2530             :                 handle,
    2531             :                 "%s",
    2532             :                 fsp_str_do_log(fsp));
    2533             : 
    2534         417 :         return status;
    2535             : }
    2536             : 
    2537        2186 : static NTSTATUS smb_full_audit_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
    2538             :                                            uint32_t security_info,
    2539             :                                            TALLOC_CTX *mem_ctx,
    2540             :                                            struct security_descriptor **ppdesc)
    2541             : {
    2542             :         NTSTATUS result;
    2543             : 
    2544        2186 :         result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, security_info,
    2545             :                                           mem_ctx, ppdesc);
    2546             : 
    2547        2186 :         do_log(SMB_VFS_OP_FGET_NT_ACL, NT_STATUS_IS_OK(result), handle,
    2548             :                "%s", fsp_str_do_log(fsp));
    2549             : 
    2550        2186 :         return result;
    2551             : }
    2552             : 
    2553         350 : static NTSTATUS smb_full_audit_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
    2554             :                               uint32_t security_info_sent,
    2555             :                               const struct security_descriptor *psd)
    2556             : {
    2557             :         struct vfs_full_audit_private_data *pd;
    2558             :         NTSTATUS result;
    2559         350 :         char *sd = NULL;
    2560             : 
    2561         350 :         SMB_VFS_HANDLE_GET_DATA(handle, pd,
    2562             :                                 struct vfs_full_audit_private_data,
    2563             :                                 return NT_STATUS_INTERNAL_ERROR);
    2564             : 
    2565         350 :         if (pd->log_secdesc) {
    2566           0 :                 sd = sddl_encode(talloc_tos(), psd, get_global_sam_sid());
    2567             :         }
    2568             : 
    2569         350 :         result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, security_info_sent, psd);
    2570             : 
    2571         350 :         do_log(SMB_VFS_OP_FSET_NT_ACL, NT_STATUS_IS_OK(result), handle,
    2572             :                "%s [%s]", fsp_str_do_log(fsp), sd ? sd : "");
    2573             : 
    2574         350 :         TALLOC_FREE(sd);
    2575             : 
    2576         350 :         return result;
    2577             : }
    2578             : 
    2579           0 : static NTSTATUS smb_full_audit_audit_file(struct vfs_handle_struct *handle,
    2580             :                                 struct smb_filename *file,
    2581             :                                 struct security_acl *sacl,
    2582             :                                 uint32_t access_requested,
    2583             :                                 uint32_t access_denied)
    2584             : {
    2585             :         NTSTATUS result;
    2586             : 
    2587           0 :         result = SMB_VFS_NEXT_AUDIT_FILE(handle,
    2588             :                                         file,
    2589             :                                         sacl,
    2590             :                                         access_requested,
    2591             :                                         access_denied);
    2592             : 
    2593           0 :         do_log(SMB_VFS_OP_AUDIT_FILE, NT_STATUS_IS_OK(result), handle,
    2594             :                         "%s",
    2595             :                         smb_fname_str_do_log(handle->conn, file));
    2596             : 
    2597           0 :         return result;
    2598             : }
    2599             : 
    2600           0 : static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
    2601             :                                                files_struct *fsp,
    2602             :                                                SMB_ACL_TYPE_T type,
    2603             :                                                TALLOC_CTX *mem_ctx)
    2604             : {
    2605             :         SMB_ACL_T result;
    2606             : 
    2607           0 :         result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle,
    2608             :                                              fsp,
    2609             :                                              type,
    2610             :                                              mem_ctx);
    2611             : 
    2612           0 :         do_log(SMB_VFS_OP_SYS_ACL_GET_FD, (result != NULL), handle,
    2613             :                "%s", fsp_str_do_log(fsp));
    2614             : 
    2615           0 :         return result;
    2616             : }
    2617             : 
    2618           0 : static int smb_full_audit_sys_acl_blob_get_fd(vfs_handle_struct *handle,
    2619             :                                               files_struct *fsp,
    2620             :                                               TALLOC_CTX *mem_ctx,
    2621             :                                               char **blob_description,
    2622             :                                               DATA_BLOB *blob)
    2623             : {
    2624             :         int result;
    2625             : 
    2626           0 :         result = SMB_VFS_NEXT_SYS_ACL_BLOB_GET_FD(handle, fsp, mem_ctx, blob_description, blob);
    2627             : 
    2628           0 :         do_log(SMB_VFS_OP_SYS_ACL_BLOB_GET_FD, (result >= 0), handle,
    2629             :                "%s", fsp_str_do_log(fsp));
    2630             : 
    2631           0 :         return result;
    2632             : }
    2633             : 
    2634           0 : static int smb_full_audit_sys_acl_set_fd(vfs_handle_struct *handle,
    2635             :                                          struct files_struct *fsp,
    2636             :                                          SMB_ACL_TYPE_T type,
    2637             :                                          SMB_ACL_T theacl)
    2638             : {
    2639             :         int result;
    2640             : 
    2641           0 :         result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, type, theacl);
    2642             : 
    2643           0 :         do_log(SMB_VFS_OP_SYS_ACL_SET_FD, (result >= 0), handle,
    2644             :                "%s", fsp_str_do_log(fsp));
    2645             : 
    2646           0 :         return result;
    2647             : }
    2648             : 
    2649           0 : static int smb_full_audit_sys_acl_delete_def_fd(vfs_handle_struct *handle,
    2650             :                                 struct files_struct *fsp)
    2651             : {
    2652             :         int result;
    2653             : 
    2654           0 :         result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FD(handle, fsp);
    2655             : 
    2656           0 :         do_log(SMB_VFS_OP_SYS_ACL_DELETE_DEF_FD,
    2657             :                (result >= 0),
    2658             :                handle,
    2659             :                "%s",
    2660             :                fsp_str_do_log(fsp));
    2661             : 
    2662           0 :         return result;
    2663             : }
    2664             : 
    2665             : struct smb_full_audit_getxattrat_state {
    2666             :         struct vfs_aio_state aio_state;
    2667             :         vfs_handle_struct *handle;
    2668             :         files_struct *dir_fsp;
    2669             :         const struct smb_filename *smb_fname;
    2670             :         const char *xattr_name;
    2671             :         ssize_t xattr_size;
    2672             :         uint8_t *xattr_value;
    2673             : };
    2674             : 
    2675             : static void smb_full_audit_getxattrat_done(struct tevent_req *subreq);
    2676             : 
    2677           0 : static struct tevent_req *smb_full_audit_getxattrat_send(
    2678             :                         TALLOC_CTX *mem_ctx,
    2679             :                         struct tevent_context *ev,
    2680             :                         struct vfs_handle_struct *handle,
    2681             :                         files_struct *dir_fsp,
    2682             :                         const struct smb_filename *smb_fname,
    2683             :                         const char *xattr_name,
    2684             :                         size_t alloc_hint)
    2685             : {
    2686           0 :         struct tevent_req *req = NULL;
    2687           0 :         struct tevent_req *subreq = NULL;
    2688           0 :         struct smb_full_audit_getxattrat_state *state = NULL;
    2689             : 
    2690           0 :         req = tevent_req_create(mem_ctx, &state,
    2691             :                                 struct smb_full_audit_getxattrat_state);
    2692           0 :         if (req == NULL) {
    2693           0 :                 do_log(SMB_VFS_OP_GETXATTRAT_SEND,
    2694             :                        false,
    2695             :                        handle,
    2696             :                        "%s/%s|%s",
    2697             :                        fsp_str_do_log(dir_fsp),
    2698           0 :                        smb_fname->base_name,
    2699             :                        xattr_name);
    2700           0 :                 return NULL;
    2701             :         }
    2702           0 :         *state = (struct smb_full_audit_getxattrat_state) {
    2703             :                 .handle = handle,
    2704             :                 .dir_fsp = dir_fsp,
    2705             :                 .smb_fname = smb_fname,
    2706             :                 .xattr_name = xattr_name,
    2707             :         };
    2708             : 
    2709           0 :         subreq = SMB_VFS_NEXT_GETXATTRAT_SEND(state,
    2710             :                                               ev,
    2711             :                                               handle,
    2712             :                                               dir_fsp,
    2713             :                                               smb_fname,
    2714             :                                               xattr_name,
    2715             :                                               alloc_hint);
    2716           0 :         if (tevent_req_nomem(subreq, req)) {
    2717           0 :                 do_log(SMB_VFS_OP_GETXATTRAT_SEND,
    2718             :                        false,
    2719             :                        handle,
    2720             :                        "%s/%s|%s",
    2721             :                        fsp_str_do_log(dir_fsp),
    2722           0 :                        smb_fname->base_name,
    2723             :                        xattr_name);
    2724           0 :                 return tevent_req_post(req, ev);
    2725             :         }
    2726           0 :         tevent_req_set_callback(subreq, smb_full_audit_getxattrat_done, req);
    2727             : 
    2728           0 :         do_log(SMB_VFS_OP_GETXATTRAT_SEND,
    2729             :                true,
    2730             :                handle,
    2731             :                "%s/%s|%s",
    2732             :                fsp_str_do_log(dir_fsp),
    2733           0 :                smb_fname->base_name,
    2734             :                xattr_name);
    2735             : 
    2736           0 :         return req;
    2737             : }
    2738             : 
    2739           0 : static void smb_full_audit_getxattrat_done(struct tevent_req *subreq)
    2740             : {
    2741           0 :         struct tevent_req *req = tevent_req_callback_data(
    2742             :                 subreq, struct tevent_req);
    2743           0 :         struct smb_full_audit_getxattrat_state *state = tevent_req_data(
    2744             :                 req, struct smb_full_audit_getxattrat_state);
    2745             : 
    2746           0 :         state->xattr_size = SMB_VFS_NEXT_GETXATTRAT_RECV(subreq,
    2747             :                                                          &state->aio_state,
    2748             :                                                          state,
    2749             :                                                          &state->xattr_value);
    2750           0 :         TALLOC_FREE(subreq);
    2751           0 :         if (state->xattr_size == -1) {
    2752           0 :                 tevent_req_error(req, state->aio_state.error);
    2753           0 :                 return;
    2754             :         }
    2755             : 
    2756           0 :         tevent_req_done(req);
    2757             : }
    2758             : 
    2759           0 : static ssize_t smb_full_audit_getxattrat_recv(struct tevent_req *req,
    2760             :                                               struct vfs_aio_state *aio_state,
    2761             :                                               TALLOC_CTX *mem_ctx,
    2762             :                                               uint8_t **xattr_value)
    2763             : {
    2764           0 :         struct smb_full_audit_getxattrat_state *state = tevent_req_data(
    2765             :                 req, struct smb_full_audit_getxattrat_state);
    2766             :         ssize_t xattr_size;
    2767             : 
    2768           0 :         if (tevent_req_is_unix_error(req, &aio_state->error)) {
    2769           0 :                 do_log(SMB_VFS_OP_GETXATTRAT_RECV,
    2770             :                        false,
    2771             :                        state->handle,
    2772             :                        "%s/%s|%s",
    2773           0 :                        fsp_str_do_log(state->dir_fsp),
    2774           0 :                        state->smb_fname->base_name,
    2775             :                        state->xattr_name);
    2776           0 :                 tevent_req_received(req);
    2777           0 :                 return -1;
    2778             :         }
    2779             : 
    2780           0 :         do_log(SMB_VFS_OP_GETXATTRAT_RECV,
    2781             :                true,
    2782             :                state->handle,
    2783             :                "%s/%s|%s",
    2784           0 :                fsp_str_do_log(state->dir_fsp),
    2785           0 :                state->smb_fname->base_name,
    2786             :                state->xattr_name);
    2787             : 
    2788           0 :         *aio_state = state->aio_state;
    2789           0 :         xattr_size = state->xattr_size;
    2790           0 :         if (xattr_value != NULL) {
    2791           0 :                 *xattr_value = talloc_move(mem_ctx, &state->xattr_value);
    2792             :         }
    2793             : 
    2794           0 :         tevent_req_received(req);
    2795           0 :         return xattr_size;
    2796             : }
    2797             : 
    2798           0 : static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
    2799             :                                struct files_struct *fsp,
    2800             :                                const char *name, void *value, size_t size)
    2801             : {
    2802             :         ssize_t result;
    2803             : 
    2804           0 :         result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size);
    2805             : 
    2806           0 :         do_log(SMB_VFS_OP_FGETXATTR, (result >= 0), handle,
    2807             :                "%s|%s", fsp_str_do_log(fsp), name);
    2808             : 
    2809           0 :         return result;
    2810             : }
    2811             : 
    2812           0 : static ssize_t smb_full_audit_flistxattr(struct vfs_handle_struct *handle,
    2813             :                                 struct files_struct *fsp, char *list,
    2814             :                                 size_t size)
    2815             : {
    2816             :         ssize_t result;
    2817             : 
    2818           0 :         result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, list, size);
    2819             : 
    2820           0 :         do_log(SMB_VFS_OP_FLISTXATTR, (result >= 0), handle,
    2821             :                "%s", fsp_str_do_log(fsp));
    2822             : 
    2823           0 :         return result;
    2824             : }
    2825             : 
    2826           0 : static int smb_full_audit_fremovexattr(struct vfs_handle_struct *handle,
    2827             :                               struct files_struct *fsp,
    2828             :                               const char *name)
    2829             : {
    2830             :         int result;
    2831             : 
    2832           0 :         result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, name);
    2833             : 
    2834           0 :         do_log(SMB_VFS_OP_FREMOVEXATTR, (result >= 0), handle,
    2835             :                "%s|%s", fsp_str_do_log(fsp), name);
    2836             : 
    2837           0 :         return result;
    2838             : }
    2839             : 
    2840           0 : static int smb_full_audit_fsetxattr(struct vfs_handle_struct *handle,
    2841             :                            struct files_struct *fsp, const char *name,
    2842             :                            const void *value, size_t size, int flags)
    2843             : {
    2844             :         int result;
    2845             : 
    2846           0 :         result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, name, value, size, flags);
    2847             : 
    2848           0 :         do_log(SMB_VFS_OP_FSETXATTR, (result >= 0), handle,
    2849             :                "%s|%s", fsp_str_do_log(fsp), name);
    2850             : 
    2851           0 :         return result;
    2852             : }
    2853             : 
    2854           0 : static bool smb_full_audit_aio_force(struct vfs_handle_struct *handle,
    2855             :                                      struct files_struct *fsp)
    2856             : {
    2857             :         bool result;
    2858             : 
    2859           0 :         result = SMB_VFS_NEXT_AIO_FORCE(handle, fsp);
    2860           0 :         do_log(SMB_VFS_OP_AIO_FORCE, result, handle,
    2861             :                 "%s", fsp_str_do_log(fsp));
    2862             : 
    2863           0 :         return result;
    2864             : }
    2865             : 
    2866           0 : static NTSTATUS smb_full_audit_durable_cookie(struct vfs_handle_struct *handle,
    2867             :                                 struct files_struct *fsp,
    2868             :                                 TALLOC_CTX *mem_ctx,
    2869             :                                 DATA_BLOB *cookie)
    2870             : {
    2871             :         NTSTATUS result;
    2872             : 
    2873           0 :         result = SMB_VFS_NEXT_DURABLE_COOKIE(handle,
    2874             :                                         fsp,
    2875             :                                         mem_ctx,
    2876             :                                         cookie);
    2877             : 
    2878           0 :         do_log(SMB_VFS_OP_DURABLE_COOKIE, NT_STATUS_IS_OK(result), handle,
    2879             :                         "%s", fsp_str_do_log(fsp));
    2880             : 
    2881           0 :         return result;
    2882             : }
    2883             : 
    2884           0 : static NTSTATUS smb_full_audit_durable_disconnect(
    2885             :                                 struct vfs_handle_struct *handle,
    2886             :                                 struct files_struct *fsp,
    2887             :                                 const DATA_BLOB old_cookie,
    2888             :                                 TALLOC_CTX *mem_ctx,
    2889             :                                 DATA_BLOB *new_cookie)
    2890             : {
    2891             :         NTSTATUS result;
    2892             : 
    2893           0 :         result = SMB_VFS_NEXT_DURABLE_DISCONNECT(handle,
    2894             :                                         fsp,
    2895             :                                         old_cookie,
    2896             :                                         mem_ctx,
    2897             :                                         new_cookie);
    2898             : 
    2899           0 :         do_log(SMB_VFS_OP_DURABLE_DISCONNECT, NT_STATUS_IS_OK(result), handle,
    2900             :                         "%s", fsp_str_do_log(fsp));
    2901             : 
    2902           0 :         return result;
    2903             : }
    2904             : 
    2905           0 : static NTSTATUS smb_full_audit_durable_reconnect(
    2906             :                                 struct vfs_handle_struct *handle,
    2907             :                                 struct smb_request *smb1req,
    2908             :                                 struct smbXsrv_open *op,
    2909             :                                 const DATA_BLOB old_cookie,
    2910             :                                 TALLOC_CTX *mem_ctx,
    2911             :                                 struct files_struct **fsp,
    2912             :                                 DATA_BLOB *new_cookie)
    2913             : {
    2914             :         NTSTATUS result;
    2915             : 
    2916           0 :         result = SMB_VFS_NEXT_DURABLE_RECONNECT(handle,
    2917             :                                         smb1req,
    2918             :                                         op,
    2919             :                                         old_cookie,
    2920             :                                         mem_ctx,
    2921             :                                         fsp,
    2922             :                                         new_cookie);
    2923             : 
    2924           0 :         do_log(SMB_VFS_OP_DURABLE_RECONNECT,
    2925           0 :                         NT_STATUS_IS_OK(result),
    2926             :                         handle,
    2927             :                         "");
    2928             : 
    2929           0 :         return result;
    2930             : }
    2931             : 
    2932             : static struct vfs_fn_pointers vfs_full_audit_fns = {
    2933             : 
    2934             :         /* Disk operations */
    2935             : 
    2936             :         .connect_fn = smb_full_audit_connect,
    2937             :         .disconnect_fn = smb_full_audit_disconnect,
    2938             :         .disk_free_fn = smb_full_audit_disk_free,
    2939             :         .get_quota_fn = smb_full_audit_get_quota,
    2940             :         .set_quota_fn = smb_full_audit_set_quota,
    2941             :         .get_shadow_copy_data_fn = smb_full_audit_get_shadow_copy_data,
    2942             :         .statvfs_fn = smb_full_audit_statvfs,
    2943             :         .fs_capabilities_fn = smb_full_audit_fs_capabilities,
    2944             :         .get_dfs_referrals_fn = smb_full_audit_get_dfs_referrals,
    2945             :         .create_dfs_pathat_fn = smb_full_audit_create_dfs_pathat,
    2946             :         .read_dfs_pathat_fn = smb_full_audit_read_dfs_pathat,
    2947             :         .fdopendir_fn = smb_full_audit_fdopendir,
    2948             :         .readdir_fn = smb_full_audit_readdir,
    2949             :         .seekdir_fn = smb_full_audit_seekdir,
    2950             :         .telldir_fn = smb_full_audit_telldir,
    2951             :         .rewind_dir_fn = smb_full_audit_rewinddir,
    2952             :         .mkdirat_fn = smb_full_audit_mkdirat,
    2953             :         .closedir_fn = smb_full_audit_closedir,
    2954             :         .openat_fn = smb_full_audit_openat,
    2955             :         .create_file_fn = smb_full_audit_create_file,
    2956             :         .close_fn = smb_full_audit_close,
    2957             :         .pread_fn = smb_full_audit_pread,
    2958             :         .pread_send_fn = smb_full_audit_pread_send,
    2959             :         .pread_recv_fn = smb_full_audit_pread_recv,
    2960             :         .pwrite_fn = smb_full_audit_pwrite,
    2961             :         .pwrite_send_fn = smb_full_audit_pwrite_send,
    2962             :         .pwrite_recv_fn = smb_full_audit_pwrite_recv,
    2963             :         .lseek_fn = smb_full_audit_lseek,
    2964             :         .sendfile_fn = smb_full_audit_sendfile,
    2965             :         .recvfile_fn = smb_full_audit_recvfile,
    2966             :         .renameat_fn = smb_full_audit_renameat,
    2967             :         .fsync_send_fn = smb_full_audit_fsync_send,
    2968             :         .fsync_recv_fn = smb_full_audit_fsync_recv,
    2969             :         .stat_fn = smb_full_audit_stat,
    2970             :         .fstat_fn = smb_full_audit_fstat,
    2971             :         .lstat_fn = smb_full_audit_lstat,
    2972             :         .fstatat_fn = smb_full_audit_fstatat,
    2973             :         .get_alloc_size_fn = smb_full_audit_get_alloc_size,
    2974             :         .unlinkat_fn = smb_full_audit_unlinkat,
    2975             :         .fchmod_fn = smb_full_audit_fchmod,
    2976             :         .fchown_fn = smb_full_audit_fchown,
    2977             :         .lchown_fn = smb_full_audit_lchown,
    2978             :         .chdir_fn = smb_full_audit_chdir,
    2979             :         .getwd_fn = smb_full_audit_getwd,
    2980             :         .fntimes_fn = smb_full_audit_fntimes,
    2981             :         .ftruncate_fn = smb_full_audit_ftruncate,
    2982             :         .fallocate_fn = smb_full_audit_fallocate,
    2983             :         .lock_fn = smb_full_audit_lock,
    2984             :         .filesystem_sharemode_fn = smb_full_audit_filesystem_sharemode,
    2985             :         .fcntl_fn = smb_full_audit_fcntl,
    2986             :         .linux_setlease_fn = smb_full_audit_linux_setlease,
    2987             :         .getlock_fn = smb_full_audit_getlock,
    2988             :         .symlinkat_fn = smb_full_audit_symlinkat,
    2989             :         .readlinkat_fn = smb_full_audit_readlinkat,
    2990             :         .linkat_fn = smb_full_audit_linkat,
    2991             :         .mknodat_fn = smb_full_audit_mknodat,
    2992             :         .realpath_fn = smb_full_audit_realpath,
    2993             :         .fchflags_fn = smb_full_audit_fchflags,
    2994             :         .file_id_create_fn = smb_full_audit_file_id_create,
    2995             :         .fs_file_id_fn = smb_full_audit_fs_file_id,
    2996             :         .offload_read_send_fn = smb_full_audit_offload_read_send,
    2997             :         .offload_read_recv_fn = smb_full_audit_offload_read_recv,
    2998             :         .offload_write_send_fn = smb_full_audit_offload_write_send,
    2999             :         .offload_write_recv_fn = smb_full_audit_offload_write_recv,
    3000             :         .fget_compression_fn = smb_full_audit_fget_compression,
    3001             :         .set_compression_fn = smb_full_audit_set_compression,
    3002             :         .snap_check_path_fn =  smb_full_audit_snap_check_path,
    3003             :         .snap_create_fn = smb_full_audit_snap_create,
    3004             :         .snap_delete_fn = smb_full_audit_snap_delete,
    3005             :         .fstreaminfo_fn = smb_full_audit_fstreaminfo,
    3006             :         .get_real_filename_at_fn = smb_full_audit_get_real_filename_at,
    3007             :         .connectpath_fn = smb_full_audit_connectpath,
    3008             :         .brl_lock_windows_fn = smb_full_audit_brl_lock_windows,
    3009             :         .brl_unlock_windows_fn = smb_full_audit_brl_unlock_windows,
    3010             :         .strict_lock_check_fn = smb_full_audit_strict_lock_check,
    3011             :         .translate_name_fn = smb_full_audit_translate_name,
    3012             :         .parent_pathname_fn = smb_full_audit_parent_pathname,
    3013             :         .fsctl_fn = smb_full_audit_fsctl,
    3014             :         .get_dos_attributes_send_fn = smb_full_audit_get_dos_attributes_send,
    3015             :         .get_dos_attributes_recv_fn = smb_full_audit_get_dos_attributes_recv,
    3016             :         .fget_dos_attributes_fn = smb_full_audit_fget_dos_attributes,
    3017             :         .fset_dos_attributes_fn = smb_full_audit_fset_dos_attributes,
    3018             :         .fget_nt_acl_fn = smb_full_audit_fget_nt_acl,
    3019             :         .fset_nt_acl_fn = smb_full_audit_fset_nt_acl,
    3020             :         .audit_file_fn = smb_full_audit_audit_file,
    3021             :         .sys_acl_get_fd_fn = smb_full_audit_sys_acl_get_fd,
    3022             :         .sys_acl_blob_get_fd_fn = smb_full_audit_sys_acl_blob_get_fd,
    3023             :         .sys_acl_set_fd_fn = smb_full_audit_sys_acl_set_fd,
    3024             :         .sys_acl_delete_def_fd_fn = smb_full_audit_sys_acl_delete_def_fd,
    3025             :         .getxattrat_send_fn = smb_full_audit_getxattrat_send,
    3026             :         .getxattrat_recv_fn = smb_full_audit_getxattrat_recv,
    3027             :         .fgetxattr_fn = smb_full_audit_fgetxattr,
    3028             :         .flistxattr_fn = smb_full_audit_flistxattr,
    3029             :         .fremovexattr_fn = smb_full_audit_fremovexattr,
    3030             :         .fsetxattr_fn = smb_full_audit_fsetxattr,
    3031             :         .aio_force_fn = smb_full_audit_aio_force,
    3032             :         .durable_cookie_fn = smb_full_audit_durable_cookie,
    3033             :         .durable_disconnect_fn = smb_full_audit_durable_disconnect,
    3034             :         .durable_reconnect_fn = smb_full_audit_durable_reconnect,
    3035             :         .freaddir_attr_fn = smb_full_audit_freaddir_attr,
    3036             : };
    3037             : 
    3038             : static_decl_vfs;
    3039        1122 : NTSTATUS vfs_full_audit_init(TALLOC_CTX *ctx)
    3040             : {
    3041             :         NTSTATUS ret;
    3042             : 
    3043        1122 :         smb_vfs_assert_all_fns(&vfs_full_audit_fns, "full_audit");
    3044             : 
    3045        1122 :         ret = smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "full_audit",
    3046             :                                &vfs_full_audit_fns);
    3047             : 
    3048        1122 :         if (!NT_STATUS_IS_OK(ret))
    3049           0 :                 return ret;
    3050             : 
    3051        1122 :         vfs_full_audit_debug_level = debug_add_class("full_audit");
    3052        1122 :         if (vfs_full_audit_debug_level == -1) {
    3053           0 :                 vfs_full_audit_debug_level = DBGC_VFS;
    3054           0 :                 DEBUG(0, ("vfs_full_audit: Couldn't register custom debugging "
    3055             :                           "class!\n"));
    3056             :         } else {
    3057        1122 :                 DEBUG(10, ("vfs_full_audit: Debug class number of "
    3058             :                            "'full_audit': %d\n", vfs_full_audit_debug_level));
    3059             :         }
    3060             : 
    3061        1122 :         return ret;
    3062             : }

Generated by: LCOV version 1.14