r6349: Update cifs umount utility
[Samba.git] / source3 / modules / vfs_full_audit.c
blob430ec8278a0b4f7e3ebf00791c5fe9cd42f393d5
1 /*
2 * Auditing VFS module for samba. Log selected file operations to syslog
3 * facility.
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
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 2 of the License, or
14 * (at your option) any later version.
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.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 * This module implements parseable logging for all Samba VFS operations.
29 * You use it as follows:
31 * [tmp]
32 * path = /tmp
33 * vfs objects = full_audit
34 * full_audit:prefix = %u|%I
35 * full_audit:success = open opendir
36 * full_audit:failure = all
38 * This leads to syslog entries of the form:
39 * smbd_audit: nobody|192.168.234.1|opendir|ok|.
40 * smbd_audit: nobody|192.168.234.1|open|fail (File not found)|r|x.txt
42 * where "nobody" is the connected username and "192.168.234.1" is the
43 * client's IP address.
45 * Options:
47 * prefix: A macro expansion template prepended to the syslog entry.
49 * success: A list of VFS operations for which a successful completion should
50 * be logged. Defaults to no logging at all. The special operation "all" logs
51 * - you guessed it - everything.
53 * failure: A list of VFS operations for which failure to complete should be
54 * logged. Defaults to logging everything.
58 #include "includes.h"
60 extern struct current_user current_user;
62 static int vfs_full_audit_debug_level = DBGC_VFS;
64 #undef DBGC_CLASS
65 #define DBGC_CLASS vfs_full_audit_debug_level
67 /* Function prototypes */
69 static int smb_full_audit_connect(vfs_handle_struct *handle, connection_struct *conn,
70 const char *svc, const char *user);
71 static void smb_full_audit_disconnect(vfs_handle_struct *handle,
72 connection_struct *conn);
73 static SMB_BIG_UINT smb_full_audit_disk_free(vfs_handle_struct *handle,
74 connection_struct *conn, const char *path,
75 BOOL small_query, SMB_BIG_UINT *bsize,
76 SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize);
77 static int smb_full_audit_get_quota(struct vfs_handle_struct *handle,
78 struct connection_struct *conn,
79 enum SMB_QUOTA_TYPE qtype, unid_t id,
80 SMB_DISK_QUOTA *qt);
81 static int smb_full_audit_set_quota(struct vfs_handle_struct *handle,
82 struct connection_struct *conn,
83 enum SMB_QUOTA_TYPE qtype, unid_t id,
84 SMB_DISK_QUOTA *qt);
85 static int smb_full_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
86 struct files_struct *fsp,
87 SHADOW_COPY_DATA *shadow_copy_data, BOOL labels);
89 static DIR *smb_full_audit_opendir(vfs_handle_struct *handle, connection_struct *conn,
90 const char *fname);
91 static SMB_STRUCT_DIRENT *smb_full_audit_readdir(vfs_handle_struct *handle,
92 connection_struct *conn, DIR *dirp);
93 static void smb_full_audit_seekdir(vfs_handle_struct *handle, connection_struct *conn,
94 DIR *dirp, long offset);
95 static long smb_full_audit_telldir(vfs_handle_struct *handle, connection_struct *conn,
96 DIR *dirp);
97 static void smb_full_audit_rewinddir(vfs_handle_struct *handle, connection_struct *conn,
98 DIR *dirp);
99 static int smb_full_audit_mkdir(vfs_handle_struct *handle, connection_struct *conn,
100 const char *path, mode_t mode);
101 static int smb_full_audit_rmdir(vfs_handle_struct *handle, connection_struct *conn,
102 const char *path);
103 static int smb_full_audit_closedir(vfs_handle_struct *handle, connection_struct *conn,
104 DIR *dirp);
105 static int smb_full_audit_open(vfs_handle_struct *handle, connection_struct *conn,
106 const char *fname, int flags, mode_t mode);
107 static int smb_full_audit_close(vfs_handle_struct *handle, files_struct *fsp, int fd);
108 static ssize_t smb_full_audit_read(vfs_handle_struct *handle, files_struct *fsp,
109 int fd, void *data, size_t n);
110 static ssize_t smb_full_audit_pread(vfs_handle_struct *handle, files_struct *fsp,
111 int fd, void *data, size_t n, SMB_OFF_T offset);
112 static ssize_t smb_full_audit_write(vfs_handle_struct *handle, files_struct *fsp,
113 int fd, const void *data, size_t n);
114 static ssize_t smb_full_audit_pwrite(vfs_handle_struct *handle, files_struct *fsp,
115 int fd, const void *data, size_t n,
116 SMB_OFF_T offset);
117 static SMB_OFF_T smb_full_audit_lseek(vfs_handle_struct *handle, files_struct *fsp,
118 int filedes, SMB_OFF_T offset, int whence);
119 static ssize_t smb_full_audit_sendfile(vfs_handle_struct *handle, int tofd,
120 files_struct *fsp, int fromfd,
121 const DATA_BLOB *hdr, SMB_OFF_T offset,
122 size_t n);
123 static int smb_full_audit_rename(vfs_handle_struct *handle, connection_struct *conn,
124 const char *old, const char *new);
125 static int smb_full_audit_fsync(vfs_handle_struct *handle, files_struct *fsp, int fd);
126 static int smb_full_audit_stat(vfs_handle_struct *handle, connection_struct *conn,
127 const char *fname, SMB_STRUCT_STAT *sbuf);
128 static int smb_full_audit_fstat(vfs_handle_struct *handle, files_struct *fsp, int fd,
129 SMB_STRUCT_STAT *sbuf);
130 static int smb_full_audit_lstat(vfs_handle_struct *handle, connection_struct *conn,
131 const char *path, SMB_STRUCT_STAT *sbuf);
132 static int smb_full_audit_unlink(vfs_handle_struct *handle, connection_struct *conn,
133 const char *path);
134 static int smb_full_audit_chmod(vfs_handle_struct *handle, connection_struct *conn,
135 const char *path, mode_t mode);
136 static int smb_full_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp, int fd,
137 mode_t mode);
138 static int smb_full_audit_chown(vfs_handle_struct *handle, connection_struct *conn,
139 const char *path, uid_t uid, gid_t gid);
140 static int smb_full_audit_fchown(vfs_handle_struct *handle, files_struct *fsp, int fd,
141 uid_t uid, gid_t gid);
142 static int smb_full_audit_chdir(vfs_handle_struct *handle, connection_struct *conn,
143 const char *path);
144 static char *smb_full_audit_getwd(vfs_handle_struct *handle, connection_struct *conn,
145 char *path);
146 static int smb_full_audit_utime(vfs_handle_struct *handle, connection_struct *conn,
147 const char *path, struct utimbuf *times);
148 static int smb_full_audit_ftruncate(vfs_handle_struct *handle, files_struct *fsp,
149 int fd, SMB_OFF_T len);
150 static BOOL smb_full_audit_lock(vfs_handle_struct *handle, files_struct *fsp, int fd,
151 int op, SMB_OFF_T offset, SMB_OFF_T count, int type);
152 static int smb_full_audit_symlink(vfs_handle_struct *handle, connection_struct *conn,
153 const char *oldpath, const char *newpath);
154 static int smb_full_audit_readlink(vfs_handle_struct *handle, connection_struct *conn,
155 const char *path, char *buf, size_t bufsiz);
156 static int smb_full_audit_link(vfs_handle_struct *handle, connection_struct *conn,
157 const char *oldpath, const char *newpath);
158 static int smb_full_audit_mknod(vfs_handle_struct *handle, connection_struct *conn,
159 const char *pathname, mode_t mode, SMB_DEV_T dev);
160 static char *smb_full_audit_realpath(vfs_handle_struct *handle, connection_struct *conn,
161 const char *path, char *resolved_path);
162 static size_t smb_full_audit_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
163 int fd, uint32 security_info,
164 SEC_DESC **ppdesc);
165 static size_t smb_full_audit_get_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
166 const char *name, uint32 security_info,
167 SEC_DESC **ppdesc);
168 static BOOL smb_full_audit_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
169 int fd, uint32 security_info_sent,
170 SEC_DESC *psd);
171 static BOOL smb_full_audit_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
172 const char *name, uint32 security_info_sent,
173 SEC_DESC *psd);
174 static int smb_full_audit_chmod_acl(vfs_handle_struct *handle, connection_struct *conn,
175 const char *path, mode_t mode);
176 static int smb_full_audit_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp,
177 int fd, mode_t mode);
178 static int smb_full_audit_sys_acl_get_entry(vfs_handle_struct *handle,
179 connection_struct *conn,
180 SMB_ACL_T theacl, int entry_id,
181 SMB_ACL_ENTRY_T *entry_p);
182 static int smb_full_audit_sys_acl_get_tag_type(vfs_handle_struct *handle,
183 connection_struct *conn,
184 SMB_ACL_ENTRY_T entry_d,
185 SMB_ACL_TAG_T *tag_type_p);
186 static int smb_full_audit_sys_acl_get_permset(vfs_handle_struct *handle,
187 connection_struct *conn,
188 SMB_ACL_ENTRY_T entry_d,
189 SMB_ACL_PERMSET_T *permset_p);
190 static void * smb_full_audit_sys_acl_get_qualifier(vfs_handle_struct *handle,
191 connection_struct *conn,
192 SMB_ACL_ENTRY_T entry_d);
193 static SMB_ACL_T smb_full_audit_sys_acl_get_file(vfs_handle_struct *handle,
194 connection_struct *conn,
195 const char *path_p,
196 SMB_ACL_TYPE_T type);
197 static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
198 files_struct *fsp,
199 int fd);
200 static int smb_full_audit_sys_acl_clear_perms(vfs_handle_struct *handle,
201 connection_struct *conn,
202 SMB_ACL_PERMSET_T permset);
203 static int smb_full_audit_sys_acl_add_perm(vfs_handle_struct *handle,
204 connection_struct *conn,
205 SMB_ACL_PERMSET_T permset,
206 SMB_ACL_PERM_T perm);
207 static char * smb_full_audit_sys_acl_to_text(vfs_handle_struct *handle,
208 connection_struct *conn, SMB_ACL_T theacl,
209 ssize_t *plen);
210 static SMB_ACL_T smb_full_audit_sys_acl_init(vfs_handle_struct *handle,
211 connection_struct *conn,
212 int count);
213 static int smb_full_audit_sys_acl_create_entry(vfs_handle_struct *handle,
214 connection_struct *conn, SMB_ACL_T *pacl,
215 SMB_ACL_ENTRY_T *pentry);
216 static int smb_full_audit_sys_acl_set_tag_type(vfs_handle_struct *handle,
217 connection_struct *conn,
218 SMB_ACL_ENTRY_T entry,
219 SMB_ACL_TAG_T tagtype);
220 static int smb_full_audit_sys_acl_set_qualifier(vfs_handle_struct *handle,
221 connection_struct *conn,
222 SMB_ACL_ENTRY_T entry,
223 void *qual);
224 static int smb_full_audit_sys_acl_set_permset(vfs_handle_struct *handle,
225 connection_struct *conn,
226 SMB_ACL_ENTRY_T entry,
227 SMB_ACL_PERMSET_T permset);
228 static int smb_full_audit_sys_acl_valid(vfs_handle_struct *handle,
229 connection_struct *conn,
230 SMB_ACL_T theacl );
231 static int smb_full_audit_sys_acl_set_file(vfs_handle_struct *handle,
232 connection_struct *conn,
233 const char *name, SMB_ACL_TYPE_T acltype,
234 SMB_ACL_T theacl);
235 static int smb_full_audit_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp,
236 int fd, SMB_ACL_T theacl);
237 static int smb_full_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
238 connection_struct *conn,
239 const char *path);
240 static int smb_full_audit_sys_acl_get_perm(vfs_handle_struct *handle,
241 connection_struct *conn,
242 SMB_ACL_PERMSET_T permset,
243 SMB_ACL_PERM_T perm);
244 static int smb_full_audit_sys_acl_free_text(vfs_handle_struct *handle,
245 connection_struct *conn,
246 char *text);
247 static int smb_full_audit_sys_acl_free_acl(vfs_handle_struct *handle,
248 connection_struct *conn,
249 SMB_ACL_T posix_acl);
250 static int smb_full_audit_sys_acl_free_qualifier(vfs_handle_struct *handle,
251 connection_struct *conn,
252 void *qualifier,
253 SMB_ACL_TAG_T tagtype);
254 static ssize_t smb_full_audit_getxattr(struct vfs_handle_struct *handle,
255 struct connection_struct *conn, const char *path,
256 const char *name, void *value, size_t size);
257 static ssize_t smb_full_audit_lgetxattr(struct vfs_handle_struct *handle,
258 struct connection_struct *conn,
259 const char *path, const char *name,
260 void *value, size_t size);
261 static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
262 struct files_struct *fsp, int fd,
263 const char *name, void *value, size_t size);
264 static ssize_t smb_full_audit_listxattr(struct vfs_handle_struct *handle,
265 struct connection_struct *conn,
266 const char *path, char *list, size_t size);
267 static ssize_t smb_full_audit_llistxattr(struct vfs_handle_struct *handle,
268 struct connection_struct *conn,
269 const char *path, char *list, size_t size);
270 static ssize_t smb_full_audit_flistxattr(struct vfs_handle_struct *handle,
271 struct files_struct *fsp, int fd, char *list,
272 size_t size);
273 static int smb_full_audit_removexattr(struct vfs_handle_struct *handle,
274 struct connection_struct *conn, const char *path,
275 const char *name);
276 static int smb_full_audit_lremovexattr(struct vfs_handle_struct *handle,
277 struct connection_struct *conn, const char *path,
278 const char *name);
279 static int smb_full_audit_fremovexattr(struct vfs_handle_struct *handle,
280 struct files_struct *fsp, int fd,
281 const char *name);
282 static int smb_full_audit_setxattr(struct vfs_handle_struct *handle,
283 struct connection_struct *conn, const char *path,
284 const char *name, const void *value, size_t size,
285 int flags);
286 static int smb_full_audit_lsetxattr(struct vfs_handle_struct *handle,
287 struct connection_struct *conn, const char *path,
288 const char *name, const void *value, size_t size,
289 int flags);
290 static int smb_full_audit_fsetxattr(struct vfs_handle_struct *handle,
291 struct files_struct *fsp, int fd, const char *name,
292 const void *value, size_t size, int flags);
294 /* VFS operations */
296 static vfs_op_tuple audit_op_tuples[] = {
298 /* Disk operations */
300 {SMB_VFS_OP(smb_full_audit_connect), SMB_VFS_OP_CONNECT,
301 SMB_VFS_LAYER_LOGGER},
302 {SMB_VFS_OP(smb_full_audit_disconnect), SMB_VFS_OP_DISCONNECT,
303 SMB_VFS_LAYER_LOGGER},
304 {SMB_VFS_OP(smb_full_audit_disk_free), SMB_VFS_OP_DISK_FREE,
305 SMB_VFS_LAYER_LOGGER},
306 {SMB_VFS_OP(smb_full_audit_get_quota), SMB_VFS_OP_GET_QUOTA,
307 SMB_VFS_LAYER_LOGGER},
308 {SMB_VFS_OP(smb_full_audit_set_quota), SMB_VFS_OP_SET_QUOTA,
309 SMB_VFS_LAYER_LOGGER},
310 {SMB_VFS_OP(smb_full_audit_get_shadow_copy_data), SMB_VFS_OP_GET_SHADOW_COPY_DATA,
311 SMB_VFS_LAYER_LOGGER},
313 /* Directory operations */
315 {SMB_VFS_OP(smb_full_audit_opendir), SMB_VFS_OP_OPENDIR,
316 SMB_VFS_LAYER_LOGGER},
317 {SMB_VFS_OP(smb_full_audit_readdir), SMB_VFS_OP_READDIR,
318 SMB_VFS_LAYER_LOGGER},
319 {SMB_VFS_OP(smb_full_audit_seekdir), SMB_VFS_OP_SEEKDIR,
320 SMB_VFS_LAYER_LOGGER},
321 {SMB_VFS_OP(smb_full_audit_telldir), SMB_VFS_OP_TELLDIR,
322 SMB_VFS_LAYER_LOGGER},
323 {SMB_VFS_OP(smb_full_audit_rewinddir), SMB_VFS_OP_REWINDDIR,
324 SMB_VFS_LAYER_LOGGER},
325 {SMB_VFS_OP(smb_full_audit_mkdir), SMB_VFS_OP_MKDIR,
326 SMB_VFS_LAYER_LOGGER},
327 {SMB_VFS_OP(smb_full_audit_rmdir), SMB_VFS_OP_RMDIR,
328 SMB_VFS_LAYER_LOGGER},
329 {SMB_VFS_OP(smb_full_audit_closedir), SMB_VFS_OP_CLOSEDIR,
330 SMB_VFS_LAYER_LOGGER},
332 /* File operations */
334 {SMB_VFS_OP(smb_full_audit_open), SMB_VFS_OP_OPEN,
335 SMB_VFS_LAYER_LOGGER},
336 {SMB_VFS_OP(smb_full_audit_close), SMB_VFS_OP_CLOSE,
337 SMB_VFS_LAYER_LOGGER},
338 {SMB_VFS_OP(smb_full_audit_read), SMB_VFS_OP_READ,
339 SMB_VFS_LAYER_LOGGER},
340 {SMB_VFS_OP(smb_full_audit_pread), SMB_VFS_OP_PREAD,
341 SMB_VFS_LAYER_LOGGER},
342 {SMB_VFS_OP(smb_full_audit_write), SMB_VFS_OP_WRITE,
343 SMB_VFS_LAYER_LOGGER},
344 {SMB_VFS_OP(smb_full_audit_pwrite), SMB_VFS_OP_PWRITE,
345 SMB_VFS_LAYER_LOGGER},
346 {SMB_VFS_OP(smb_full_audit_lseek), SMB_VFS_OP_LSEEK,
347 SMB_VFS_LAYER_LOGGER},
348 {SMB_VFS_OP(smb_full_audit_sendfile), SMB_VFS_OP_SENDFILE,
349 SMB_VFS_LAYER_LOGGER},
350 {SMB_VFS_OP(smb_full_audit_rename), SMB_VFS_OP_RENAME,
351 SMB_VFS_LAYER_LOGGER},
352 {SMB_VFS_OP(smb_full_audit_fsync), SMB_VFS_OP_FSYNC,
353 SMB_VFS_LAYER_LOGGER},
354 {SMB_VFS_OP(smb_full_audit_stat), SMB_VFS_OP_STAT,
355 SMB_VFS_LAYER_LOGGER},
356 {SMB_VFS_OP(smb_full_audit_fstat), SMB_VFS_OP_FSTAT,
357 SMB_VFS_LAYER_LOGGER},
358 {SMB_VFS_OP(smb_full_audit_lstat), SMB_VFS_OP_LSTAT,
359 SMB_VFS_LAYER_LOGGER},
360 {SMB_VFS_OP(smb_full_audit_unlink), SMB_VFS_OP_UNLINK,
361 SMB_VFS_LAYER_LOGGER},
362 {SMB_VFS_OP(smb_full_audit_chmod), SMB_VFS_OP_CHMOD,
363 SMB_VFS_LAYER_LOGGER},
364 {SMB_VFS_OP(smb_full_audit_fchmod), SMB_VFS_OP_FCHMOD,
365 SMB_VFS_LAYER_LOGGER},
366 {SMB_VFS_OP(smb_full_audit_chown), SMB_VFS_OP_CHOWN,
367 SMB_VFS_LAYER_LOGGER},
368 {SMB_VFS_OP(smb_full_audit_fchown), SMB_VFS_OP_FCHOWN,
369 SMB_VFS_LAYER_LOGGER},
370 {SMB_VFS_OP(smb_full_audit_chdir), SMB_VFS_OP_CHDIR,
371 SMB_VFS_LAYER_LOGGER},
372 {SMB_VFS_OP(smb_full_audit_getwd), SMB_VFS_OP_GETWD,
373 SMB_VFS_LAYER_LOGGER},
374 {SMB_VFS_OP(smb_full_audit_utime), SMB_VFS_OP_UTIME,
375 SMB_VFS_LAYER_LOGGER},
376 {SMB_VFS_OP(smb_full_audit_ftruncate), SMB_VFS_OP_FTRUNCATE,
377 SMB_VFS_LAYER_LOGGER},
378 {SMB_VFS_OP(smb_full_audit_lock), SMB_VFS_OP_LOCK,
379 SMB_VFS_LAYER_LOGGER},
380 {SMB_VFS_OP(smb_full_audit_symlink), SMB_VFS_OP_SYMLINK,
381 SMB_VFS_LAYER_LOGGER},
382 {SMB_VFS_OP(smb_full_audit_readlink), SMB_VFS_OP_READLINK,
383 SMB_VFS_LAYER_LOGGER},
384 {SMB_VFS_OP(smb_full_audit_link), SMB_VFS_OP_LINK,
385 SMB_VFS_LAYER_LOGGER},
386 {SMB_VFS_OP(smb_full_audit_mknod), SMB_VFS_OP_MKNOD,
387 SMB_VFS_LAYER_LOGGER},
388 {SMB_VFS_OP(smb_full_audit_realpath), SMB_VFS_OP_REALPATH,
389 SMB_VFS_LAYER_LOGGER},
391 /* NT ACL operations. */
393 {SMB_VFS_OP(smb_full_audit_fget_nt_acl), SMB_VFS_OP_FGET_NT_ACL,
394 SMB_VFS_LAYER_LOGGER},
395 {SMB_VFS_OP(smb_full_audit_get_nt_acl), SMB_VFS_OP_GET_NT_ACL,
396 SMB_VFS_LAYER_LOGGER},
397 {SMB_VFS_OP(smb_full_audit_fset_nt_acl), SMB_VFS_OP_FSET_NT_ACL,
398 SMB_VFS_LAYER_LOGGER},
399 {SMB_VFS_OP(smb_full_audit_set_nt_acl), SMB_VFS_OP_SET_NT_ACL,
400 SMB_VFS_LAYER_LOGGER},
402 /* POSIX ACL operations. */
404 {SMB_VFS_OP(smb_full_audit_chmod_acl), SMB_VFS_OP_CHMOD_ACL,
405 SMB_VFS_LAYER_LOGGER},
406 {SMB_VFS_OP(smb_full_audit_fchmod_acl), SMB_VFS_OP_FCHMOD_ACL,
407 SMB_VFS_LAYER_LOGGER},
408 {SMB_VFS_OP(smb_full_audit_sys_acl_get_entry), SMB_VFS_OP_SYS_ACL_GET_ENTRY,
409 SMB_VFS_LAYER_LOGGER},
410 {SMB_VFS_OP(smb_full_audit_sys_acl_get_tag_type), SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE,
411 SMB_VFS_LAYER_LOGGER},
412 {SMB_VFS_OP(smb_full_audit_sys_acl_get_permset), SMB_VFS_OP_SYS_ACL_GET_PERMSET,
413 SMB_VFS_LAYER_LOGGER},
414 {SMB_VFS_OP(smb_full_audit_sys_acl_get_qualifier), SMB_VFS_OP_SYS_ACL_GET_QUALIFIER,
415 SMB_VFS_LAYER_LOGGER},
416 {SMB_VFS_OP(smb_full_audit_sys_acl_get_file), SMB_VFS_OP_SYS_ACL_GET_FILE,
417 SMB_VFS_LAYER_LOGGER},
418 {SMB_VFS_OP(smb_full_audit_sys_acl_get_fd), SMB_VFS_OP_SYS_ACL_GET_FD,
419 SMB_VFS_LAYER_LOGGER},
420 {SMB_VFS_OP(smb_full_audit_sys_acl_clear_perms), SMB_VFS_OP_SYS_ACL_CLEAR_PERMS,
421 SMB_VFS_LAYER_LOGGER},
422 {SMB_VFS_OP(smb_full_audit_sys_acl_add_perm), SMB_VFS_OP_SYS_ACL_ADD_PERM,
423 SMB_VFS_LAYER_LOGGER},
424 {SMB_VFS_OP(smb_full_audit_sys_acl_to_text), SMB_VFS_OP_SYS_ACL_TO_TEXT,
425 SMB_VFS_LAYER_LOGGER},
426 {SMB_VFS_OP(smb_full_audit_sys_acl_init), SMB_VFS_OP_SYS_ACL_INIT,
427 SMB_VFS_LAYER_LOGGER},
428 {SMB_VFS_OP(smb_full_audit_sys_acl_create_entry), SMB_VFS_OP_SYS_ACL_CREATE_ENTRY,
429 SMB_VFS_LAYER_LOGGER},
430 {SMB_VFS_OP(smb_full_audit_sys_acl_set_tag_type), SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE,
431 SMB_VFS_LAYER_LOGGER},
432 {SMB_VFS_OP(smb_full_audit_sys_acl_set_qualifier), SMB_VFS_OP_SYS_ACL_SET_QUALIFIER,
433 SMB_VFS_LAYER_LOGGER},
434 {SMB_VFS_OP(smb_full_audit_sys_acl_set_permset), SMB_VFS_OP_SYS_ACL_SET_PERMSET,
435 SMB_VFS_LAYER_LOGGER},
436 {SMB_VFS_OP(smb_full_audit_sys_acl_valid), SMB_VFS_OP_SYS_ACL_VALID,
437 SMB_VFS_LAYER_LOGGER},
438 {SMB_VFS_OP(smb_full_audit_sys_acl_set_file), SMB_VFS_OP_SYS_ACL_SET_FILE,
439 SMB_VFS_LAYER_LOGGER},
440 {SMB_VFS_OP(smb_full_audit_sys_acl_set_fd), SMB_VFS_OP_SYS_ACL_SET_FD,
441 SMB_VFS_LAYER_LOGGER},
442 {SMB_VFS_OP(smb_full_audit_sys_acl_delete_def_file), SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE,
443 SMB_VFS_LAYER_LOGGER},
444 {SMB_VFS_OP(smb_full_audit_sys_acl_get_perm), SMB_VFS_OP_SYS_ACL_GET_PERM,
445 SMB_VFS_LAYER_LOGGER},
446 {SMB_VFS_OP(smb_full_audit_sys_acl_free_text), SMB_VFS_OP_SYS_ACL_FREE_TEXT,
447 SMB_VFS_LAYER_LOGGER},
448 {SMB_VFS_OP(smb_full_audit_sys_acl_free_acl), SMB_VFS_OP_SYS_ACL_FREE_ACL,
449 SMB_VFS_LAYER_LOGGER},
450 {SMB_VFS_OP(smb_full_audit_sys_acl_free_qualifier), SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER,
451 SMB_VFS_LAYER_LOGGER},
453 /* EA operations. */
455 {SMB_VFS_OP(smb_full_audit_getxattr), SMB_VFS_OP_GETXATTR,
456 SMB_VFS_LAYER_LOGGER},
457 {SMB_VFS_OP(smb_full_audit_lgetxattr), SMB_VFS_OP_LGETXATTR,
458 SMB_VFS_LAYER_LOGGER},
459 {SMB_VFS_OP(smb_full_audit_fgetxattr), SMB_VFS_OP_FGETXATTR,
460 SMB_VFS_LAYER_LOGGER},
461 {SMB_VFS_OP(smb_full_audit_listxattr), SMB_VFS_OP_LISTXATTR,
462 SMB_VFS_LAYER_LOGGER},
463 {SMB_VFS_OP(smb_full_audit_llistxattr), SMB_VFS_OP_LLISTXATTR,
464 SMB_VFS_LAYER_LOGGER},
465 {SMB_VFS_OP(smb_full_audit_flistxattr), SMB_VFS_OP_FLISTXATTR,
466 SMB_VFS_LAYER_LOGGER},
467 {SMB_VFS_OP(smb_full_audit_removexattr), SMB_VFS_OP_REMOVEXATTR,
468 SMB_VFS_LAYER_LOGGER},
469 {SMB_VFS_OP(smb_full_audit_lremovexattr), SMB_VFS_OP_LREMOVEXATTR,
470 SMB_VFS_LAYER_LOGGER},
471 {SMB_VFS_OP(smb_full_audit_fremovexattr), SMB_VFS_OP_FREMOVEXATTR,
472 SMB_VFS_LAYER_LOGGER},
473 {SMB_VFS_OP(smb_full_audit_setxattr), SMB_VFS_OP_SETXATTR,
474 SMB_VFS_LAYER_LOGGER},
475 {SMB_VFS_OP(smb_full_audit_lsetxattr), SMB_VFS_OP_LSETXATTR,
476 SMB_VFS_LAYER_LOGGER},
477 {SMB_VFS_OP(smb_full_audit_fsetxattr), SMB_VFS_OP_FSETXATTR,
478 SMB_VFS_LAYER_LOGGER},
480 /* Finish VFS operations definition */
482 {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP,
483 SMB_VFS_LAYER_NOOP}
486 /* The following array *must* be in the same order as defined in vfs.h */
488 static struct {
489 vfs_op_type type;
490 const char *name;
491 } vfs_op_names[] = {
492 { SMB_VFS_OP_CONNECT, "connect" },
493 { SMB_VFS_OP_DISCONNECT, "disconnect" },
494 { SMB_VFS_OP_DISK_FREE, "disk_free" },
495 { SMB_VFS_OP_GET_QUOTA, "get_quota" },
496 { SMB_VFS_OP_SET_QUOTA, "set_quota" },
497 { SMB_VFS_OP_GET_SHADOW_COPY_DATA, "get_shadow_copy_data" },
498 { SMB_VFS_OP_OPENDIR, "opendir" },
499 { SMB_VFS_OP_READDIR, "readdir" },
500 { SMB_VFS_OP_MKDIR, "mkdir" },
501 { SMB_VFS_OP_RMDIR, "rmdir" },
502 { SMB_VFS_OP_CLOSEDIR, "closedir" },
503 { SMB_VFS_OP_OPEN, "open" },
504 { SMB_VFS_OP_CLOSE, "close" },
505 { SMB_VFS_OP_READ, "read" },
506 { SMB_VFS_OP_PREAD, "pread" },
507 { SMB_VFS_OP_WRITE, "write" },
508 { SMB_VFS_OP_PWRITE, "pwrite" },
509 { SMB_VFS_OP_LSEEK, "lseek" },
510 { SMB_VFS_OP_SENDFILE, "sendfile" },
511 { SMB_VFS_OP_RENAME, "rename" },
512 { SMB_VFS_OP_FSYNC, "fsync" },
513 { SMB_VFS_OP_STAT, "stat" },
514 { SMB_VFS_OP_FSTAT, "fstat" },
515 { SMB_VFS_OP_LSTAT, "lstat" },
516 { SMB_VFS_OP_UNLINK, "unlink" },
517 { SMB_VFS_OP_CHMOD, "chmod" },
518 { SMB_VFS_OP_FCHMOD, "fchmod" },
519 { SMB_VFS_OP_CHOWN, "chown" },
520 { SMB_VFS_OP_FCHOWN, "fchown" },
521 { SMB_VFS_OP_CHDIR, "chdir" },
522 { SMB_VFS_OP_GETWD, "getwd" },
523 { SMB_VFS_OP_UTIME, "utime" },
524 { SMB_VFS_OP_FTRUNCATE, "ftruncate" },
525 { SMB_VFS_OP_LOCK, "lock" },
526 { SMB_VFS_OP_SYMLINK, "symlink" },
527 { SMB_VFS_OP_READLINK, "readlink" },
528 { SMB_VFS_OP_LINK, "link" },
529 { SMB_VFS_OP_MKNOD, "mknod" },
530 { SMB_VFS_OP_REALPATH, "realpath" },
531 { SMB_VFS_OP_FGET_NT_ACL, "fget_nt_acl" },
532 { SMB_VFS_OP_GET_NT_ACL, "get_nt_acl" },
533 { SMB_VFS_OP_FSET_NT_ACL, "fset_nt_acl" },
534 { SMB_VFS_OP_SET_NT_ACL, "set_nt_acl" },
535 { SMB_VFS_OP_CHMOD_ACL, "chmod_acl" },
536 { SMB_VFS_OP_FCHMOD_ACL, "fchmod_acl" },
537 { SMB_VFS_OP_SYS_ACL_GET_ENTRY, "sys_acl_get_entry" },
538 { SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE, "sys_acl_get_tag_type" },
539 { SMB_VFS_OP_SYS_ACL_GET_PERMSET, "sys_acl_get_permset" },
540 { SMB_VFS_OP_SYS_ACL_GET_QUALIFIER, "sys_acl_get_qualifier" },
541 { SMB_VFS_OP_SYS_ACL_GET_FILE, "sys_acl_get_file" },
542 { SMB_VFS_OP_SYS_ACL_GET_FD, "sys_acl_get_fd" },
543 { SMB_VFS_OP_SYS_ACL_CLEAR_PERMS, "sys_acl_clear_perms" },
544 { SMB_VFS_OP_SYS_ACL_ADD_PERM, "sys_acl_add_perm" },
545 { SMB_VFS_OP_SYS_ACL_TO_TEXT, "sys_acl_to_text" },
546 { SMB_VFS_OP_SYS_ACL_INIT, "sys_acl_init" },
547 { SMB_VFS_OP_SYS_ACL_CREATE_ENTRY, "sys_acl_create_entry" },
548 { SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE, "sys_acl_set_tag_type" },
549 { SMB_VFS_OP_SYS_ACL_SET_QUALIFIER, "sys_acl_set_qualifier" },
550 { SMB_VFS_OP_SYS_ACL_SET_PERMSET, "sys_acl_set_permset" },
551 { SMB_VFS_OP_SYS_ACL_VALID, "sys_acl_valid" },
552 { SMB_VFS_OP_SYS_ACL_SET_FILE, "sys_acl_set_file" },
553 { SMB_VFS_OP_SYS_ACL_SET_FD, "sys_acl_set_fd" },
554 { SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, "sys_acl_delete_def_file" },
555 { SMB_VFS_OP_SYS_ACL_GET_PERM, "sys_acl_get_perm" },
556 { SMB_VFS_OP_SYS_ACL_FREE_TEXT, "sys_acl_free_text" },
557 { SMB_VFS_OP_SYS_ACL_FREE_ACL, "sys_acl_free_acl" },
558 { SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER, "sys_acl_free_qualifier" },
559 { SMB_VFS_OP_GETXATTR, "getxattr" },
560 { SMB_VFS_OP_LGETXATTR, "lgetxattr" },
561 { SMB_VFS_OP_FGETXATTR, "fgetxattr" },
562 { SMB_VFS_OP_LISTXATTR, "listxattr" },
563 { SMB_VFS_OP_LLISTXATTR, "llistxattr" },
564 { SMB_VFS_OP_FLISTXATTR, "flistxattr" },
565 { SMB_VFS_OP_REMOVEXATTR, "removexattr" },
566 { SMB_VFS_OP_LREMOVEXATTR, "lremovexattr" },
567 { SMB_VFS_OP_FREMOVEXATTR, "fremovexattr" },
568 { SMB_VFS_OP_SETXATTR, "setxattr" },
569 { SMB_VFS_OP_LSETXATTR, "lsetxattr" },
570 { SMB_VFS_OP_FSETXATTR, "fsetxattr" },
571 { SMB_VFS_OP_LAST, NULL }
574 static int audit_syslog_facility(vfs_handle_struct *handle)
576 /* fix me: let this be configurable by:
577 * lp_param_enum(SNUM(handle->conn),
578 * (handle->param?handle->param:"full_audit"),
579 * "syslog facility",
580 * audit_enum_facility,LOG_USER);
582 return LOG_USER;
585 static int audit_syslog_priority(vfs_handle_struct *handle)
587 /* fix me: let this be configurable by:
588 * lp_param_enum(SNUM(handle->conn),
589 * (handle->param?handle->param:"full_audit"),
590 * "syslog priority",
591 * audit_enum_priority,LOG_NOTICE);
593 return LOG_NOTICE;
596 static char *audit_prefix(connection_struct *conn)
598 static pstring prefix;
600 pstrcpy(prefix, lp_parm_const_string(SNUM(conn), "full_audit",
601 "prefix", "%u|%I"));
602 standard_sub_snum(SNUM(conn), prefix, sizeof(prefix)-1);
603 return prefix;
606 static struct bitmap *success_ops = NULL;
608 static BOOL log_success(vfs_op_type op)
610 if (success_ops == NULL)
611 return True;
613 return bitmap_query(success_ops, op);
616 static struct bitmap *failure_ops = NULL;
618 static BOOL log_failure(vfs_op_type op)
620 if (failure_ops == NULL)
621 return True;
623 return bitmap_query(failure_ops, op);
626 static void init_bitmap(struct bitmap **bm, const char **ops)
628 BOOL log_all = False;
630 if (*bm != NULL)
631 return;
633 *bm = bitmap_allocate(SMB_VFS_OP_LAST);
635 if (*bm == NULL) {
636 DEBUG(0, ("Could not alloc bitmap -- "
637 "defaulting to logging everything\n"));
638 return;
641 while (*ops != NULL) {
642 int i;
643 BOOL found = False;
645 if (strequal(*ops, "all")) {
646 log_all = True;
647 break;
650 for (i=0; i<SMB_VFS_OP_LAST; i++) {
651 if (strequal(*ops, vfs_op_names[i].name)) {
652 bitmap_set(*bm, i);
653 found = True;
656 if (!found) {
657 DEBUG(0, ("Could not find opname %s, logging all\n",
658 *ops));
659 log_all = True;
660 break;
662 ops += 1;
665 if (log_all) {
666 /* The query functions default to True */
667 bitmap_free(*bm);
668 *bm = NULL;
672 static const char *audit_opname(vfs_op_type op)
674 if (op >= SMB_VFS_OP_LAST)
675 return "INVALID VFS OP";
676 return vfs_op_names[op].name;
679 static void do_log(vfs_op_type op, BOOL success, vfs_handle_struct *handle,
680 const char *format, ...)
682 fstring err_msg;
683 pstring op_msg;
684 va_list ap;
686 if (success && (!log_success(op)))
687 return;
689 if (!success && (!log_failure(op)))
690 return;
692 if (success)
693 fstrcpy(err_msg, "ok");
694 else
695 fstr_sprintf(err_msg, "fail (%s)", strerror(errno));
697 va_start(ap, format);
698 vsnprintf(op_msg, sizeof(op_msg), format, ap);
699 va_end(ap);
701 syslog(audit_syslog_priority(handle), "%s|%s|%s|%s\n",
702 audit_prefix(handle->conn), audit_opname(op), err_msg, op_msg);
704 return;
707 /* Implementation of vfs_ops. Pass everything on to the default
708 operation but log event first. */
710 static int smb_full_audit_connect(vfs_handle_struct *handle, connection_struct *conn,
711 const char *svc, const char *user)
713 int result;
714 const char *none[] = { NULL };
715 const char *all [] = { "all" };
717 openlog("smbd_audit", 0, audit_syslog_facility(handle));
719 init_bitmap(&success_ops,
720 lp_parm_string_list(SNUM(conn), "full_audit", "success",
721 none));
722 init_bitmap(&failure_ops,
723 lp_parm_string_list(SNUM(conn), "full_audit", "failure",
724 all));
726 result = SMB_VFS_NEXT_CONNECT(handle, conn, svc, user);
728 do_log(SMB_VFS_OP_CONNECT, True, handle,
729 "%s", svc);
731 return result;
734 static void smb_full_audit_disconnect(vfs_handle_struct *handle,
735 connection_struct *conn)
737 SMB_VFS_NEXT_DISCONNECT(handle, conn);
739 do_log(SMB_VFS_OP_DISCONNECT, True, handle,
740 "%s", lp_servicename(SNUM(conn)));
742 bitmap_free(success_ops);
743 success_ops = NULL;
745 bitmap_free(failure_ops);
746 failure_ops = NULL;
748 return;
751 static SMB_BIG_UINT smb_full_audit_disk_free(vfs_handle_struct *handle,
752 connection_struct *conn, const char *path,
753 BOOL small_query, SMB_BIG_UINT *bsize,
754 SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
756 SMB_BIG_UINT result;
758 result = SMB_VFS_NEXT_DISK_FREE(handle, conn, path, small_query, bsize,
759 dfree, dsize);
761 /* Don't have a reasonable notion of failure here */
763 do_log(SMB_VFS_OP_DISK_FREE, True, handle, "%s", path);
765 return result;
768 static int smb_full_audit_get_quota(struct vfs_handle_struct *handle,
769 struct connection_struct *conn,
770 enum SMB_QUOTA_TYPE qtype, unid_t id,
771 SMB_DISK_QUOTA *qt)
773 int result;
775 result = SMB_VFS_NEXT_GET_QUOTA(handle, conn, qtype, id, qt);
777 do_log(SMB_VFS_OP_GET_QUOTA, (result >= 0), handle, "");
779 return result;
783 static int smb_full_audit_set_quota(struct vfs_handle_struct *handle,
784 struct connection_struct *conn,
785 enum SMB_QUOTA_TYPE qtype, unid_t id,
786 SMB_DISK_QUOTA *qt)
788 int result;
790 result = SMB_VFS_NEXT_SET_QUOTA(handle, conn, qtype, id, qt);
792 do_log(SMB_VFS_OP_SET_QUOTA, (result >= 0), handle, "");
794 return result;
797 static int smb_full_audit_get_shadow_copy_data(struct vfs_handle_struct *handle,
798 struct files_struct *fsp,
799 SHADOW_COPY_DATA *shadow_copy_data, BOOL labels)
801 int result;
803 result = SMB_VFS_NEXT_GET_SHADOW_COPY_DATA(handle, fsp, shadow_copy_data, labels);
805 do_log(SMB_VFS_OP_GET_SHADOW_COPY_DATA, (result >= 0), handle, "");
807 return result;
810 static DIR *smb_full_audit_opendir(vfs_handle_struct *handle, connection_struct *conn,
811 const char *fname)
813 DIR *result;
815 result = SMB_VFS_NEXT_OPENDIR(handle, conn, fname);
817 do_log(SMB_VFS_OP_OPENDIR, (result != NULL), handle, "%s", fname);
819 return result;
822 static SMB_STRUCT_DIRENT *smb_full_audit_readdir(vfs_handle_struct *handle,
823 connection_struct *conn, DIR *dirp)
825 SMB_STRUCT_DIRENT *result;
827 result = SMB_VFS_NEXT_READDIR(handle, conn, dirp);
829 /* This operation has no reasonable error condition
830 * (End of dir is also failure), so always succeed.
832 do_log(SMB_VFS_OP_READDIR, True, handle, "");
834 return result;
837 static void smb_full_audit_seekdir(vfs_handle_struct *handle, connection_struct *conn,
838 DIR *dirp, long offset)
840 SMB_VFS_NEXT_SEEKDIR(handle, conn, dirp, offset);
842 do_log(SMB_VFS_OP_SEEKDIR, True, handle, "");
843 return;
846 static long smb_full_audit_telldir(vfs_handle_struct *handle, connection_struct *conn,
847 DIR *dirp)
849 long result;
851 result = SMB_VFS_NEXT_TELLDIR(handle, conn, dirp);
853 do_log(SMB_VFS_OP_OPENDIR, True, handle, "");
855 return result;
858 static void smb_full_audit_rewinddir(vfs_handle_struct *handle, connection_struct *conn,
859 DIR *dirp)
861 SMB_VFS_NEXT_REWINDDIR(handle, conn, dirp);
863 do_log(SMB_VFS_OP_REWINDDIR, True, handle, "");
864 return;
867 static int smb_full_audit_mkdir(vfs_handle_struct *handle, connection_struct *conn,
868 const char *path, mode_t mode)
870 int result;
872 result = SMB_VFS_NEXT_MKDIR(handle, conn, path, mode);
874 do_log(SMB_VFS_OP_MKDIR, (result >= 0), handle, "%s", path);
876 return result;
879 static int smb_full_audit_rmdir(vfs_handle_struct *handle, connection_struct *conn,
880 const char *path)
882 int result;
884 result = SMB_VFS_NEXT_RMDIR(handle, conn, path);
886 do_log(SMB_VFS_OP_RMDIR, (result >= 0), handle, "%s", path);
888 return result;
891 static int smb_full_audit_closedir(vfs_handle_struct *handle, connection_struct *conn,
892 DIR *dirp)
894 int result;
896 result = SMB_VFS_NEXT_CLOSEDIR(handle, conn, dirp);
898 do_log(SMB_VFS_OP_CLOSEDIR, (result >= 0), handle, "");
900 return result;
903 static int smb_full_audit_open(vfs_handle_struct *handle, connection_struct *conn,
904 const char *fname, int flags, mode_t mode)
906 int result;
908 result = SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
910 do_log(SMB_VFS_OP_OPEN, (result >= 0), handle, "%s|%s",
911 ((flags & O_WRONLY) || (flags & O_RDWR))?"w":"r",
912 fname);
914 return result;
917 static int smb_full_audit_close(vfs_handle_struct *handle, files_struct *fsp, int fd)
919 int result;
921 result = SMB_VFS_NEXT_CLOSE(handle, fsp, fd);
923 do_log(SMB_VFS_OP_CLOSE, (result >= 0), handle, "%s", fsp->fsp_name);
925 return result;
928 static ssize_t smb_full_audit_read(vfs_handle_struct *handle, files_struct *fsp,
929 int fd, void *data, size_t n)
931 ssize_t result;
933 result = SMB_VFS_NEXT_READ(handle, fsp, fd, data, n);
935 do_log(SMB_VFS_OP_READ, (result >= 0), handle, "%s", fsp->fsp_name);
937 return result;
940 static ssize_t smb_full_audit_pread(vfs_handle_struct *handle, files_struct *fsp,
941 int fd, void *data, size_t n, SMB_OFF_T offset)
943 ssize_t result;
945 result = SMB_VFS_NEXT_PREAD(handle, fsp, fd, data, n, offset);
947 do_log(SMB_VFS_OP_PREAD, (result >= 0), handle, "%s", fsp->fsp_name);
949 return result;
952 static ssize_t smb_full_audit_write(vfs_handle_struct *handle, files_struct *fsp,
953 int fd, const void *data, size_t n)
955 ssize_t result;
957 result = SMB_VFS_NEXT_WRITE(handle, fsp, fd, data, n);
959 do_log(SMB_VFS_OP_WRITE, (result >= 0), handle, "%s", fsp->fsp_name);
961 return result;
964 static ssize_t smb_full_audit_pwrite(vfs_handle_struct *handle, files_struct *fsp,
965 int fd, const void *data, size_t n,
966 SMB_OFF_T offset)
968 ssize_t result;
970 result = SMB_VFS_NEXT_PWRITE(handle, fsp, fd, data, n, offset);
972 do_log(SMB_VFS_OP_PWRITE, (result >= 0), handle, "%s", fsp->fsp_name);
974 return result;
977 static SMB_OFF_T smb_full_audit_lseek(vfs_handle_struct *handle, files_struct *fsp,
978 int filedes, SMB_OFF_T offset, int whence)
980 ssize_t result;
982 result = SMB_VFS_NEXT_LSEEK(handle, fsp, filedes, offset, whence);
984 do_log(SMB_VFS_OP_LSEEK, (result != (ssize_t)-1), handle,
985 "%s", fsp->fsp_name);
987 return result;
990 static ssize_t smb_full_audit_sendfile(vfs_handle_struct *handle, int tofd,
991 files_struct *fsp, int fromfd,
992 const DATA_BLOB *hdr, SMB_OFF_T offset,
993 size_t n)
995 ssize_t result;
997 result = SMB_VFS_NEXT_SENDFILE(handle, tofd, fsp, fromfd, hdr,
998 offset, n);
1000 do_log(SMB_VFS_OP_SENDFILE, (result >= 0), handle,
1001 "%s", fsp->fsp_name);
1003 return result;
1006 static int smb_full_audit_rename(vfs_handle_struct *handle, connection_struct *conn,
1007 const char *old, const char *new)
1009 int result;
1011 result = SMB_VFS_NEXT_RENAME(handle, conn, old, new);
1013 do_log(SMB_VFS_OP_RENAME, (result >= 0), handle, "%s|%s", old, new);
1015 return result;
1018 static int smb_full_audit_fsync(vfs_handle_struct *handle, files_struct *fsp, int fd)
1020 int result;
1022 result = SMB_VFS_NEXT_FSYNC(handle, fsp, fd);
1024 do_log(SMB_VFS_OP_FSYNC, (result >= 0), handle, "%s", fsp->fsp_name);
1026 return result;
1029 static int smb_full_audit_stat(vfs_handle_struct *handle, connection_struct *conn,
1030 const char *fname, SMB_STRUCT_STAT *sbuf)
1032 int result;
1034 result = SMB_VFS_NEXT_STAT(handle, conn, fname, sbuf);
1036 do_log(SMB_VFS_OP_STAT, (result >= 0), handle, "%s", fname);
1038 return result;
1041 static int smb_full_audit_fstat(vfs_handle_struct *handle, files_struct *fsp, int fd,
1042 SMB_STRUCT_STAT *sbuf)
1044 int result;
1046 result = SMB_VFS_NEXT_FSTAT(handle, fsp, fd, sbuf);
1048 do_log(SMB_VFS_OP_FSTAT, (result >= 0), handle, "%s", fsp->fsp_name);
1050 return result;
1053 static int smb_full_audit_lstat(vfs_handle_struct *handle, connection_struct *conn,
1054 const char *path, SMB_STRUCT_STAT *sbuf)
1056 int result;
1058 result = SMB_VFS_NEXT_LSTAT(handle, conn, path, sbuf);
1060 do_log(SMB_VFS_OP_LSTAT, (result >= 0), handle, "%s", path);
1062 return result;
1065 static int smb_full_audit_unlink(vfs_handle_struct *handle, connection_struct *conn,
1066 const char *path)
1068 int result;
1070 result = SMB_VFS_NEXT_UNLINK(handle, conn, path);
1072 do_log(SMB_VFS_OP_UNLINK, (result >= 0), handle, "%s", path);
1074 return result;
1077 static int smb_full_audit_chmod(vfs_handle_struct *handle, connection_struct *conn,
1078 const char *path, mode_t mode)
1080 int result;
1082 result = SMB_VFS_NEXT_CHMOD(handle, conn, path, mode);
1084 do_log(SMB_VFS_OP_CHMOD, (result >= 0), handle, "%s|%o", path, mode);
1086 return result;
1089 static int smb_full_audit_fchmod(vfs_handle_struct *handle, files_struct *fsp, int fd,
1090 mode_t mode)
1092 int result;
1094 result = SMB_VFS_NEXT_FCHMOD(handle, fsp, fd, mode);
1096 do_log(SMB_VFS_OP_FCHMOD, (result >= 0), handle,
1097 "%s|%o", fsp->fsp_name, mode);
1099 return result;
1102 static int smb_full_audit_chown(vfs_handle_struct *handle, connection_struct *conn,
1103 const char *path, uid_t uid, gid_t gid)
1105 int result;
1107 result = SMB_VFS_NEXT_CHOWN(handle, conn, path, uid, gid);
1109 do_log(SMB_VFS_OP_CHOWN, (result >= 0), handle, "%s|%ld|%ld",
1110 path, (long int)uid, (long int)gid);
1112 return result;
1115 static int smb_full_audit_fchown(vfs_handle_struct *handle, files_struct *fsp, int fd,
1116 uid_t uid, gid_t gid)
1118 int result;
1120 result = SMB_VFS_NEXT_FCHOWN(handle, fsp, fd, uid, gid);
1122 do_log(SMB_VFS_OP_FCHOWN, (result >= 0), handle, "%s|%ld|%ld",
1123 fsp->fsp_name, (long int)uid, (long int)gid);
1125 return result;
1128 static int smb_full_audit_chdir(vfs_handle_struct *handle, connection_struct *conn,
1129 const char *path)
1131 int result;
1133 result = SMB_VFS_NEXT_CHDIR(handle, conn, path);
1135 do_log(SMB_VFS_OP_CHDIR, (result >= 0), handle, "chdir|%s", path);
1137 return result;
1140 static char *smb_full_audit_getwd(vfs_handle_struct *handle, connection_struct *conn,
1141 char *path)
1143 char *result;
1145 result = SMB_VFS_NEXT_GETWD(handle, conn, path);
1147 do_log(SMB_VFS_OP_GETWD, (result != NULL), handle, "%s", path);
1149 return result;
1152 static int smb_full_audit_utime(vfs_handle_struct *handle, connection_struct *conn,
1153 const char *path, struct utimbuf *times)
1155 int result;
1157 result = SMB_VFS_NEXT_UTIME(handle, conn, path, times);
1159 do_log(SMB_VFS_OP_UTIME, (result >= 0), handle, "%s", path);
1161 return result;
1164 static int smb_full_audit_ftruncate(vfs_handle_struct *handle, files_struct *fsp,
1165 int fd, SMB_OFF_T len)
1167 int result;
1169 result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, fd, len);
1171 do_log(SMB_VFS_OP_FTRUNCATE, (result >= 0), handle,
1172 "%s", fsp->fsp_name);
1174 return result;
1177 static BOOL smb_full_audit_lock(vfs_handle_struct *handle, files_struct *fsp, int fd,
1178 int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
1180 BOOL result;
1182 result = SMB_VFS_NEXT_LOCK(handle, fsp, fd, op, offset, count, type);
1184 do_log(SMB_VFS_OP_LOCK, (result >= 0), handle, "%s", fsp->fsp_name);
1186 return result;
1189 static int smb_full_audit_symlink(vfs_handle_struct *handle, connection_struct *conn,
1190 const char *oldpath, const char *newpath)
1192 int result;
1194 result = SMB_VFS_NEXT_SYMLINK(handle, conn, oldpath, newpath);
1196 do_log(SMB_VFS_OP_SYMLINK, (result >= 0), handle,
1197 "%s|%s", oldpath, newpath);
1199 return result;
1202 static int smb_full_audit_readlink(vfs_handle_struct *handle, connection_struct *conn,
1203 const char *path, char *buf, size_t bufsiz)
1205 int result;
1207 result = SMB_VFS_NEXT_READLINK(handle, conn, path, buf, bufsiz);
1209 do_log(SMB_VFS_OP_READLINK, (result >= 0), handle, "%s", path);
1211 return result;
1214 static int smb_full_audit_link(vfs_handle_struct *handle, connection_struct *conn,
1215 const char *oldpath, const char *newpath)
1217 int result;
1219 result = SMB_VFS_NEXT_LINK(handle, conn, oldpath, newpath);
1221 do_log(SMB_VFS_OP_LINK, (result >= 0), handle,
1222 "%s|%s", oldpath, newpath);
1224 return result;
1227 static int smb_full_audit_mknod(vfs_handle_struct *handle, connection_struct *conn,
1228 const char *pathname, mode_t mode, SMB_DEV_T dev)
1230 int result;
1232 result = SMB_VFS_NEXT_MKNOD(handle, conn, pathname, mode, dev);
1234 do_log(SMB_VFS_OP_MKNOD, (result >= 0), handle, "%s", pathname);
1236 return result;
1239 static char *smb_full_audit_realpath(vfs_handle_struct *handle, connection_struct *conn,
1240 const char *path, char *resolved_path)
1242 char *result;
1244 result = SMB_VFS_NEXT_REALPATH(handle, conn, path, resolved_path);
1246 do_log(SMB_VFS_OP_REALPATH, (result != NULL), handle, "%s", path);
1248 return result;
1251 static size_t smb_full_audit_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1252 int fd, uint32 security_info,
1253 SEC_DESC **ppdesc)
1255 size_t result;
1257 result = SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, fd, security_info,
1258 ppdesc);
1260 do_log(SMB_VFS_OP_FGET_NT_ACL, (result > 0), handle,
1261 "%s", fsp->fsp_name);
1263 return result;
1266 static size_t smb_full_audit_get_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1267 const char *name, uint32 security_info,
1268 SEC_DESC **ppdesc)
1270 size_t result;
1272 result = SMB_VFS_NEXT_GET_NT_ACL(handle, fsp, name, security_info,
1273 ppdesc);
1275 do_log(SMB_VFS_OP_GET_NT_ACL, (result > 0), handle,
1276 "%s", fsp->fsp_name);
1278 return result;
1281 static BOOL smb_full_audit_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1282 int fd, uint32 security_info_sent,
1283 SEC_DESC *psd)
1285 BOOL result;
1287 result = SMB_VFS_NEXT_FSET_NT_ACL(handle, fsp, fd, security_info_sent,
1288 psd);
1290 do_log(SMB_VFS_OP_FSET_NT_ACL, result, handle, "%s", fsp->fsp_name);
1292 return result;
1295 static BOOL smb_full_audit_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
1296 const char *name, uint32 security_info_sent,
1297 SEC_DESC *psd)
1299 BOOL result;
1301 result = SMB_VFS_NEXT_SET_NT_ACL(handle, fsp, name, security_info_sent,
1302 psd);
1304 do_log(SMB_VFS_OP_SET_NT_ACL, result, handle, "%s", fsp->fsp_name);
1306 return result;
1309 static int smb_full_audit_chmod_acl(vfs_handle_struct *handle, connection_struct *conn,
1310 const char *path, mode_t mode)
1312 int result;
1314 result = SMB_VFS_NEXT_CHMOD_ACL(handle, conn, path, mode);
1316 do_log(SMB_VFS_OP_CHMOD_ACL, (result >= 0), handle,
1317 "%s|%o", path, mode);
1319 return result;
1322 static int smb_full_audit_fchmod_acl(vfs_handle_struct *handle, files_struct *fsp,
1323 int fd, mode_t mode)
1325 int result;
1327 result = SMB_VFS_NEXT_FCHMOD_ACL(handle, fsp, fd, mode);
1329 do_log(SMB_VFS_OP_FCHMOD_ACL, (result >= 0), handle,
1330 "%s|%o", fsp->fsp_name, mode);
1332 return result;
1335 static int smb_full_audit_sys_acl_get_entry(vfs_handle_struct *handle,
1336 connection_struct *conn,
1337 SMB_ACL_T theacl, int entry_id,
1338 SMB_ACL_ENTRY_T *entry_p)
1340 int result;
1342 result = SMB_VFS_NEXT_SYS_ACL_GET_ENTRY(handle, conn, theacl, entry_id,
1343 entry_p);
1345 do_log(SMB_VFS_OP_SYS_ACL_GET_ENTRY, (result >= 0), handle,
1346 "");
1348 return result;
1351 static int smb_full_audit_sys_acl_get_tag_type(vfs_handle_struct *handle,
1352 connection_struct *conn,
1353 SMB_ACL_ENTRY_T entry_d,
1354 SMB_ACL_TAG_T *tag_type_p)
1356 int result;
1358 result = SMB_VFS_NEXT_SYS_ACL_GET_TAG_TYPE(handle, conn, entry_d,
1359 tag_type_p);
1361 do_log(SMB_VFS_OP_SYS_ACL_GET_TAG_TYPE, (result >= 0), handle,
1362 "");
1364 return result;
1367 static int smb_full_audit_sys_acl_get_permset(vfs_handle_struct *handle,
1368 connection_struct *conn,
1369 SMB_ACL_ENTRY_T entry_d,
1370 SMB_ACL_PERMSET_T *permset_p)
1372 int result;
1374 result = SMB_VFS_NEXT_SYS_ACL_GET_PERMSET(handle, conn, entry_d,
1375 permset_p);
1377 do_log(SMB_VFS_OP_SYS_ACL_GET_PERMSET, (result >= 0), handle,
1378 "");
1380 return result;
1383 static void * smb_full_audit_sys_acl_get_qualifier(vfs_handle_struct *handle,
1384 connection_struct *conn,
1385 SMB_ACL_ENTRY_T entry_d)
1387 void *result;
1389 result = SMB_VFS_NEXT_SYS_ACL_GET_QUALIFIER(handle, conn, entry_d);
1391 do_log(SMB_VFS_OP_SYS_ACL_GET_QUALIFIER, (result != NULL), handle,
1392 "");
1394 return result;
1397 static SMB_ACL_T smb_full_audit_sys_acl_get_file(vfs_handle_struct *handle,
1398 connection_struct *conn,
1399 const char *path_p,
1400 SMB_ACL_TYPE_T type)
1402 SMB_ACL_T result;
1404 result = SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, conn, path_p, type);
1406 do_log(SMB_VFS_OP_SYS_ACL_GET_FILE, (result != NULL), handle,
1407 "%s", path_p);
1409 return result;
1412 static SMB_ACL_T smb_full_audit_sys_acl_get_fd(vfs_handle_struct *handle,
1413 files_struct *fsp, int fd)
1415 SMB_ACL_T result;
1417 result = SMB_VFS_NEXT_SYS_ACL_GET_FD(handle, fsp, fd);
1419 do_log(SMB_VFS_OP_SYS_ACL_GET_FD, (result != NULL), handle,
1420 "%s", fsp->fsp_name);
1422 return result;
1425 static int smb_full_audit_sys_acl_clear_perms(vfs_handle_struct *handle,
1426 connection_struct *conn,
1427 SMB_ACL_PERMSET_T permset)
1429 int result;
1431 result = SMB_VFS_NEXT_SYS_ACL_CLEAR_PERMS(handle, conn, permset);
1433 do_log(SMB_VFS_OP_SYS_ACL_CLEAR_PERMS, (result >= 0), handle,
1434 "");
1436 return result;
1439 static int smb_full_audit_sys_acl_add_perm(vfs_handle_struct *handle,
1440 connection_struct *conn,
1441 SMB_ACL_PERMSET_T permset,
1442 SMB_ACL_PERM_T perm)
1444 int result;
1446 result = SMB_VFS_NEXT_SYS_ACL_ADD_PERM(handle, conn, permset, perm);
1448 do_log(SMB_VFS_OP_SYS_ACL_ADD_PERM, (result >= 0), handle,
1449 "");
1451 return result;
1454 static char * smb_full_audit_sys_acl_to_text(vfs_handle_struct *handle,
1455 connection_struct *conn, SMB_ACL_T theacl,
1456 ssize_t *plen)
1458 char * result;
1460 result = SMB_VFS_NEXT_SYS_ACL_TO_TEXT(handle, conn, theacl, plen);
1462 do_log(SMB_VFS_OP_SYS_ACL_TO_TEXT, (result != NULL), handle,
1463 "");
1465 return result;
1468 static SMB_ACL_T smb_full_audit_sys_acl_init(vfs_handle_struct *handle,
1469 connection_struct *conn,
1470 int count)
1472 SMB_ACL_T result;
1474 result = SMB_VFS_NEXT_SYS_ACL_INIT(handle, conn, count);
1476 do_log(SMB_VFS_OP_SYS_ACL_INIT, (result != NULL), handle,
1477 "");
1479 return result;
1482 static int smb_full_audit_sys_acl_create_entry(vfs_handle_struct *handle,
1483 connection_struct *conn, SMB_ACL_T *pacl,
1484 SMB_ACL_ENTRY_T *pentry)
1486 int result;
1488 result = SMB_VFS_NEXT_SYS_ACL_CREATE_ENTRY(handle, conn, pacl, pentry);
1490 do_log(SMB_VFS_OP_SYS_ACL_CREATE_ENTRY, (result >= 0), handle,
1491 "");
1493 return result;
1496 static int smb_full_audit_sys_acl_set_tag_type(vfs_handle_struct *handle,
1497 connection_struct *conn,
1498 SMB_ACL_ENTRY_T entry,
1499 SMB_ACL_TAG_T tagtype)
1501 int result;
1503 result = SMB_VFS_NEXT_SYS_ACL_SET_TAG_TYPE(handle, conn, entry,
1504 tagtype);
1506 do_log(SMB_VFS_OP_SYS_ACL_SET_TAG_TYPE, (result >= 0), handle,
1507 "");
1509 return result;
1512 static int smb_full_audit_sys_acl_set_qualifier(vfs_handle_struct *handle,
1513 connection_struct *conn,
1514 SMB_ACL_ENTRY_T entry,
1515 void *qual)
1517 int result;
1519 result = SMB_VFS_NEXT_SYS_ACL_SET_QUALIFIER(handle, conn, entry, qual);
1521 do_log(SMB_VFS_OP_SYS_ACL_SET_QUALIFIER, (result >= 0), handle,
1522 "");
1524 return result;
1527 static int smb_full_audit_sys_acl_set_permset(vfs_handle_struct *handle,
1528 connection_struct *conn,
1529 SMB_ACL_ENTRY_T entry,
1530 SMB_ACL_PERMSET_T permset)
1532 int result;
1534 result = SMB_VFS_NEXT_SYS_ACL_SET_PERMSET(handle, conn, entry, permset);
1536 do_log(SMB_VFS_OP_SYS_ACL_SET_PERMSET, (result >= 0), handle,
1537 "");
1539 return result;
1542 static int smb_full_audit_sys_acl_valid(vfs_handle_struct *handle,
1543 connection_struct *conn,
1544 SMB_ACL_T theacl )
1546 int result;
1548 result = SMB_VFS_NEXT_SYS_ACL_VALID(handle, conn, theacl);
1550 do_log(SMB_VFS_OP_SYS_ACL_VALID, (result >= 0), handle,
1551 "");
1553 return result;
1556 static int smb_full_audit_sys_acl_set_file(vfs_handle_struct *handle,
1557 connection_struct *conn,
1558 const char *name, SMB_ACL_TYPE_T acltype,
1559 SMB_ACL_T theacl)
1561 int result;
1563 result = SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, conn, name, acltype,
1564 theacl);
1566 do_log(SMB_VFS_OP_SYS_ACL_SET_FILE, (result >= 0), handle,
1567 "%s", name);
1569 return result;
1572 static int smb_full_audit_sys_acl_set_fd(vfs_handle_struct *handle, files_struct *fsp,
1573 int fd, SMB_ACL_T theacl)
1575 int result;
1577 result = SMB_VFS_NEXT_SYS_ACL_SET_FD(handle, fsp, fd, theacl);
1579 do_log(SMB_VFS_OP_SYS_ACL_SET_FD, (result >= 0), handle,
1580 "%s", fsp->fsp_name);
1582 return result;
1585 static int smb_full_audit_sys_acl_delete_def_file(vfs_handle_struct *handle,
1586 connection_struct *conn,
1587 const char *path)
1589 int result;
1591 result = SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, conn, path);
1593 do_log(SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, (result >= 0), handle,
1594 "%s", path);
1596 return result;
1599 static int smb_full_audit_sys_acl_get_perm(vfs_handle_struct *handle,
1600 connection_struct *conn,
1601 SMB_ACL_PERMSET_T permset,
1602 SMB_ACL_PERM_T perm)
1604 int result;
1606 result = SMB_VFS_NEXT_SYS_ACL_GET_PERM(handle, conn, permset, perm);
1608 do_log(SMB_VFS_OP_SYS_ACL_GET_PERM, (result >= 0), handle,
1609 "");
1611 return result;
1614 static int smb_full_audit_sys_acl_free_text(vfs_handle_struct *handle,
1615 connection_struct *conn,
1616 char *text)
1618 int result;
1620 result = SMB_VFS_NEXT_SYS_ACL_FREE_TEXT(handle, conn, text);
1622 do_log(SMB_VFS_OP_SYS_ACL_FREE_TEXT, (result >= 0), handle,
1623 "");
1625 return result;
1628 static int smb_full_audit_sys_acl_free_acl(vfs_handle_struct *handle,
1629 connection_struct *conn,
1630 SMB_ACL_T posix_acl)
1632 int result;
1634 result = SMB_VFS_NEXT_SYS_ACL_FREE_ACL(handle, conn, posix_acl);
1636 do_log(SMB_VFS_OP_SYS_ACL_FREE_ACL, (result >= 0), handle,
1637 "");
1639 return result;
1642 static int smb_full_audit_sys_acl_free_qualifier(vfs_handle_struct *handle,
1643 connection_struct *conn,
1644 void *qualifier,
1645 SMB_ACL_TAG_T tagtype)
1647 int result;
1649 result = SMB_VFS_NEXT_SYS_ACL_FREE_QUALIFIER(handle, conn, qualifier,
1650 tagtype);
1652 do_log(SMB_VFS_OP_SYS_ACL_FREE_QUALIFIER, (result >= 0), handle,
1653 "");
1655 return result;
1658 static ssize_t smb_full_audit_getxattr(struct vfs_handle_struct *handle,
1659 struct connection_struct *conn, const char *path,
1660 const char *name, void *value, size_t size)
1662 ssize_t result;
1664 result = SMB_VFS_NEXT_GETXATTR(handle, conn, path, name, value, size);
1666 do_log(SMB_VFS_OP_GETXATTR, (result >= 0), handle,
1667 "%s|%s", path, name);
1669 return result;
1672 static ssize_t smb_full_audit_lgetxattr(struct vfs_handle_struct *handle,
1673 struct connection_struct *conn,
1674 const char *path, const char *name,
1675 void *value, size_t size)
1677 ssize_t result;
1679 result = SMB_VFS_NEXT_LGETXATTR(handle, conn, path, name, value, size);
1681 do_log(SMB_VFS_OP_LGETXATTR, (result >= 0), handle,
1682 "%s|%s", path, name);
1684 return result;
1687 static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle,
1688 struct files_struct *fsp, int fd,
1689 const char *name, void *value, size_t size)
1691 ssize_t result;
1693 result = SMB_VFS_NEXT_FGETXATTR(handle, fsp, fd, name, value, size);
1695 do_log(SMB_VFS_OP_FGETXATTR, (result >= 0), handle,
1696 "%s|%s", fsp->fsp_name, name);
1698 return result;
1701 static ssize_t smb_full_audit_listxattr(struct vfs_handle_struct *handle,
1702 struct connection_struct *conn,
1703 const char *path, char *list, size_t size)
1705 ssize_t result;
1707 result = SMB_VFS_NEXT_LISTXATTR(handle, conn, path, list, size);
1709 do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s", path);
1711 return result;
1714 static ssize_t smb_full_audit_llistxattr(struct vfs_handle_struct *handle,
1715 struct connection_struct *conn,
1716 const char *path, char *list, size_t size)
1718 ssize_t result;
1720 result = SMB_VFS_NEXT_LLISTXATTR(handle, conn, path, list, size);
1722 do_log(SMB_VFS_OP_LLISTXATTR, (result >= 0), handle, "%s", path);
1724 return result;
1727 static ssize_t smb_full_audit_flistxattr(struct vfs_handle_struct *handle,
1728 struct files_struct *fsp, int fd, char *list,
1729 size_t size)
1731 ssize_t result;
1733 result = SMB_VFS_NEXT_FLISTXATTR(handle, fsp, fd, list, size);
1735 do_log(SMB_VFS_OP_FLISTXATTR, (result >= 0), handle,
1736 "%s", fsp->fsp_name);
1738 return result;
1741 static int smb_full_audit_removexattr(struct vfs_handle_struct *handle,
1742 struct connection_struct *conn, const char *path,
1743 const char *name)
1745 int result;
1747 result = SMB_VFS_NEXT_REMOVEXATTR(handle, conn, path, name);
1749 do_log(SMB_VFS_OP_REMOVEXATTR, (result >= 0), handle,
1750 "%s|%s", path, name);
1752 return result;
1755 static int smb_full_audit_lremovexattr(struct vfs_handle_struct *handle,
1756 struct connection_struct *conn, const char *path,
1757 const char *name)
1759 int result;
1761 result = SMB_VFS_NEXT_LREMOVEXATTR(handle, conn, path, name);
1763 do_log(SMB_VFS_OP_LREMOVEXATTR, (result >= 0), handle,
1764 "%s|%s", path, name);
1766 return result;
1769 static int smb_full_audit_fremovexattr(struct vfs_handle_struct *handle,
1770 struct files_struct *fsp, int fd,
1771 const char *name)
1773 int result;
1775 result = SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, fd, name);
1777 do_log(SMB_VFS_OP_FREMOVEXATTR, (result >= 0), handle,
1778 "%s|%s", fsp->fsp_name, name);
1780 return result;
1783 static int smb_full_audit_setxattr(struct vfs_handle_struct *handle,
1784 struct connection_struct *conn, const char *path,
1785 const char *name, const void *value, size_t size,
1786 int flags)
1788 int result;
1790 result = SMB_VFS_NEXT_SETXATTR(handle, conn, path, name, value, size,
1791 flags);
1793 do_log(SMB_VFS_OP_SETXATTR, (result >= 0), handle,
1794 "%s|%s", path, name);
1796 return result;
1799 static int smb_full_audit_lsetxattr(struct vfs_handle_struct *handle,
1800 struct connection_struct *conn, const char *path,
1801 const char *name, const void *value, size_t size,
1802 int flags)
1804 int result;
1806 result = SMB_VFS_NEXT_LSETXATTR(handle, conn, path, name, value, size,
1807 flags);
1809 do_log(SMB_VFS_OP_LSETXATTR, (result >= 0), handle,
1810 "%s|%s", path, name);
1812 return result;
1815 static int smb_full_audit_fsetxattr(struct vfs_handle_struct *handle,
1816 struct files_struct *fsp, int fd, const char *name,
1817 const void *value, size_t size, int flags)
1819 int result;
1821 result = SMB_VFS_NEXT_FSETXATTR(handle, fsp, fd, name, value, size,
1822 flags);
1824 do_log(SMB_VFS_OP_FSETXATTR, (result >= 0), handle,
1825 "%s|%s", fsp->fsp_name, name);
1827 return result;
1830 NTSTATUS vfs_full_audit_init(void)
1832 NTSTATUS ret = smb_register_vfs(SMB_VFS_INTERFACE_VERSION,
1833 "full_audit", audit_op_tuples);
1835 if (!NT_STATUS_IS_OK(ret))
1836 return ret;
1838 vfs_full_audit_debug_level = debug_add_class("full_audit");
1839 if (vfs_full_audit_debug_level == -1) {
1840 vfs_full_audit_debug_level = DBGC_VFS;
1841 DEBUG(0, ("vfs_full_audit: Couldn't register custom debugging "
1842 "class!\n"));
1843 } else {
1844 DEBUG(10, ("vfs_full_audit: Debug class number of "
1845 "'full_audit': %d\n", vfs_full_audit_debug_level));
1848 return ret;