1/* 2 * (C) 2011 by Pablo Neira Ayuso <pablo@netfilter.org> 3 * (C) 2011 by Intra2Net AG <http://www.intra2net.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 (or 7 * any later at your option) as published by the Free Software Foundation. 8 */ 9#include <stdbool.h> 10#include <stdlib.h> 11#include <stdio.h> 12#include <string.h> 13#include <getopt.h> 14#include <xtables.h> 15 16#include <linux/netfilter/x_tables.h> 17#include <linux/netfilter/xt_nfacct.h> 18 19enum { 20 O_NAME = 0, 21}; 22 23#define s struct xt_nfacct_match_info 24static const struct xt_option_entry nfacct_opts[] = { 25 {.name = "nfacct-name", .id = O_NAME, .type = XTTYPE_STRING, 26 .min = 1, .flags = XTOPT_MAND|XTOPT_PUT, XTOPT_POINTER(s, name)}, 27 XTOPT_TABLEEND, 28}; 29#undef s 30 31static void nfacct_help(void) 32{ 33 printf("nfacct match options:\n" 34 " --nfacct-name STRING Name of accouting area\n"); 35} 36 37static void nfacct_parse(struct xt_option_call *cb) 38{ 39 xtables_option_parse(cb); 40 switch (cb->entry->id) { 41 case O_NAME: 42 if (strchr(cb->arg, '\n') != NULL) 43 xtables_error(PARAMETER_PROBLEM, 44 "Newlines not allowed in --nfacct-name"); 45 break; 46 } 47} 48 49static void 50nfacct_print_name(const struct xt_nfacct_match_info *info, char *name) 51{ 52 printf(" %snfacct-name ", name); 53 xtables_save_string(info->name); 54} 55 56static void nfacct_print(const void *ip, const struct xt_entry_match *match, 57 int numeric) 58{ 59 const struct xt_nfacct_match_info *info = 60 (struct xt_nfacct_match_info *)match->data; 61 62 nfacct_print_name(info, ""); 63} 64 65static void nfacct_save(const void *ip, const struct xt_entry_match *match) 66{ 67 const struct xt_nfacct_match_info *info = 68 (struct xt_nfacct_match_info *)match->data; 69 70 nfacct_print_name(info, "--"); 71} 72 73static struct xtables_match nfacct_match = { 74 .family = NFPROTO_UNSPEC, 75 .name = "nfacct", 76 .version = XTABLES_VERSION, 77 .size = XT_ALIGN(sizeof(struct xt_nfacct_match_info)), 78 .userspacesize = offsetof(struct xt_nfacct_match_info, nfacct), 79 .help = nfacct_help, 80 .x6_parse = nfacct_parse, 81 .print = nfacct_print, 82 .save = nfacct_save, 83 .x6_options = nfacct_opts, 84}; 85 86void _init(void) 87{ 88 xtables_register_match(&nfacct_match); 89} 90