summaryrefslogtreecommitdiff
path: root/source3/modules
diff options
context:
space:
mode:
authorHolger Hetterich <hhetter@novell.com>2010-02-18 15:13:59 +0100
committerVolker Lendecke <vl@samba.org>2010-02-28 11:35:18 +0100
commit99fc004e409ba5e535f1662e92370952777e55ff (patch)
tree5a376e7f3d91d081440838c9eb02f98fd056b1ba /source3/modules
parenta050c79fabdb73f6437f846777b94f31fe15fc86 (diff)
downloadsamba-99fc004e409ba5e535f1662e92370952777e55ff.tar.gz
samba-99fc004e409ba5e535f1662e92370952777e55ff.tar.bz2
samba-99fc004e409ba5e535f1662e92370952777e55ff.zip
s3: vfs_full_audit.c: implement negated vfs_ops in the success/failure list
Supports negated arguments in configuration like: full_audit:success = all !readdir !telldir !closedir Update the manpage accordingly. Part of BSO#4025
Diffstat (limited to 'source3/modules')
-rw-r--r--source3/modules/vfs_full_audit.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index 19ac7adaed..8a40f6712c 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -433,56 +433,65 @@ static bool log_failure(vfs_handle_struct *handle, vfs_op_type op)
static void init_bitmap(struct bitmap **bm, const char **ops)
{
- bool log_all = False;
+ if (*bm != NULL) {
+ return;
+ }
- if (*bm != NULL)
+ if (ops == NULL) {
+ *bm = NULL;
return;
+ }
*bm = bitmap_allocate(SMB_VFS_OP_LAST);
-
if (*bm == NULL) {
DEBUG(0, ("Could not alloc bitmap -- "
"defaulting to logging everything\n"));
return;
}
- while (*ops != NULL) {
+ for (; *ops != NULL; ops += 1) {
int i;
- bool found = False;
+ bool neg = false;
+ const char *op;
if (strequal(*ops, "all")) {
- log_all = True;
- break;
+ for (i=0; i<SMB_VFS_OP_LAST; i++) {
+ bitmap_set(*bm, i);
+ }
+ continue;
}
if (strequal(*ops, "none")) {
break;
}
+ op = ops[0];
+ if (op[0] == '!') {
+ neg = true;
+ op += 1;
+ }
+
for (i=0; i<SMB_VFS_OP_LAST; i++) {
if (vfs_op_names[i].name == NULL) {
smb_panic("vfs_full_audit.c: name table not "
"in sync with vfs.h\n");
}
-
- if (strequal(*ops, vfs_op_names[i].name)) {
- bitmap_set(*bm, i);
- found = True;
+ if (strequal(op, vfs_op_names[i].name)) {
+ if (neg) {
+ bitmap_clear(*bm, i);
+ } else {
+ bitmap_set(*bm, i);
+ }
+ break;
}
}
- if (!found) {
+ if (i == SMB_VFS_OP_LAST) {
DEBUG(0, ("Could not find opname %s, logging all\n",
*ops));
- log_all = True;
+ bitmap_free(*bm);
+ *bm = NULL;
break;
}
- ops += 1;
- }
-
- if (log_all) {
- /* The query functions default to True */
- bitmap_free(*bm);
- *bm = NULL;
}
}
@@ -603,8 +612,6 @@ static int smb_full_audit_connect(vfs_handle_struct *handle,
{
int result;
struct vfs_full_audit_private_data *pd = NULL;
- const char *none[] = { NULL };
- const char *all [] = { "all" };
result = SMB_VFS_NEXT_CONNECT(handle, svc, user);
if (result < 0) {
@@ -624,10 +631,10 @@ static int smb_full_audit_connect(vfs_handle_struct *handle,
init_bitmap(&pd->success_ops,
lp_parm_string_list(SNUM(handle->conn), "full_audit", "success",
- none));
+ NULL));
init_bitmap(&pd->failure_ops,
lp_parm_string_list(SNUM(handle->conn), "full_audit", "failure",
- all));
+ NULL));
/* Store the private data. */
SMB_VFS_HANDLE_SET_DATA(handle, pd, free_private_data,