diff options
Diffstat (limited to 'extensions/ebt_AUDIT.c')
-rw-r--r-- | extensions/ebt_AUDIT.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/extensions/ebt_AUDIT.c b/extensions/ebt_AUDIT.c new file mode 100644 index 0000000..c9befcc --- /dev/null +++ b/extensions/ebt_AUDIT.c @@ -0,0 +1,110 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> +#include "../include/ebtables_u.h" +#include <linux/netfilter/xt_AUDIT.h> + +#define AUDIT_TYPE '1' +static struct option opts[] = +{ + { "audit-type" , required_argument, 0, AUDIT_TYPE }, + { 0 } +}; + +static void print_help() +{ + printf( + "AUDIT target options:\n" + " --audit-type TYPE : Set action type to record.\n"); +} + +static void init(struct ebt_entry_target *target) +{ + struct xt_AUDIT_info *info = (struct xt_AUDIT_info *) target->data; + + info->type = 0; +} + +static int parse(int c, char **argv, int argc, + const struct ebt_u_entry *entry, unsigned int *flags, + struct ebt_entry_target **target) +{ + struct xt_AUDIT_info *info = (struct xt_AUDIT_info *) (*target)->data; + + switch (c) { + case AUDIT_TYPE: + ebt_check_option2(flags, AUDIT_TYPE); + + if (!strcasecmp(optarg, "accept")) + info->type = XT_AUDIT_TYPE_ACCEPT; + else if (!strcasecmp(optarg, "drop")) + info->type = XT_AUDIT_TYPE_DROP; + else if (!strcasecmp(optarg, "reject")) + info->type = XT_AUDIT_TYPE_REJECT; + else + ebt_print_error2("Bad action type value `%s'", optarg); + + break; + default: + return 0; + } + return 1; +} + +static void final_check(const struct ebt_u_entry *entry, + const struct ebt_entry_target *target, const char *name, + unsigned int hookmask, unsigned int time) +{ +} + +static void print(const struct ebt_u_entry *entry, + const struct ebt_entry_target *target) +{ + const struct xt_AUDIT_info *info = + (const struct xt_AUDIT_info *) target->data; + + printf("--audit-type "); + + switch(info->type) { + case XT_AUDIT_TYPE_ACCEPT: + printf("accept"); + break; + case XT_AUDIT_TYPE_DROP: + printf("drop"); + break; + case XT_AUDIT_TYPE_REJECT: + printf("reject"); + break; + } +} + +static int compare(const struct ebt_entry_target *t1, + const struct ebt_entry_target *t2) +{ + const struct xt_AUDIT_info *info1 = + (const struct xt_AUDIT_info *) t1->data; + const struct xt_AUDIT_info *info2 = + (const struct xt_AUDIT_info *) t2->data; + + return info1->type == info2->type; +} + +static struct ebt_u_target AUDIT_target = +{ + .name = "AUDIT", + .size = sizeof(struct xt_AUDIT_info), + .help = print_help, + .init = init, + .parse = parse, + .final_check = final_check, + .print = print, + .compare = compare, + .extra_ops = opts, +}; + +static void _INIT(void) +{ + ebt_register_target(&AUDIT_target); +} |