X-Git-Url: http://developer.intra2net.com/git/?p=ipt_ACCOUNT;a=blobdiff_plain;f=iptables%2Fextensions%2Flibipt_ACCOUNT.c;h=6a790c68c522aed04fc986f00a39e3f223de2cd6;hp=084c31f4011013a052af6640879e48d6ddfb5b0a;hb=a0ed824e8d772130a6f6ee759d7c986a34695a5b;hpb=146aa6772bdd87b14a91ac0a50df80a79a0ab7f8 diff --git a/iptables/extensions/libipt_ACCOUNT.c b/iptables/extensions/libipt_ACCOUNT.c index 084c31f..6a790c6 100644 --- a/iptables/extensions/libipt_ACCOUNT.c +++ b/iptables/extensions/libipt_ACCOUNT.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -18,6 +19,11 @@ static struct option opts[] = { { .name = 0 } }; +/* Compat glue for iptables 1.4.0 */ +#ifndef XTABLES_VERSION +#define XTABLES_VERSION IPTABLES_VERSION +#endif + /* Function which prints out usage message. */ static void help(void) { @@ -25,19 +31,16 @@ static void help(void) "ACCOUNT v%s options:\n" " --%s ip/netmask\t\tBase network IP and netmask used for this table\n" " --%s name\t\t\tTable name for the userspace library\n", -IPTABLES_VERSION, opts[0].name, opts[1].name); +XTABLES_VERSION, opts[0].name, opts[1].name); } /* Initialize the target. */ static void -init(struct ipt_entry_target *t, unsigned int *nfcache) +init(struct xt_entry_target *t) { struct ipt_acc_info *accountinfo = (struct ipt_acc_info *)t->data; accountinfo->table_nr = -1; - - /* Can't cache this */ - *nfcache |= NFC_UNKNOWN; } #define IPT_ACCOUNT_OPT_ADDR 0x01 @@ -45,10 +48,9 @@ init(struct ipt_entry_target *t, unsigned int *nfcache) /* Function which parses command options; returns true if it ate an option */ -static int -parse(int c, char **argv, int invert, unsigned int *flags, - const struct ipt_entry *entry, - struct ipt_entry_target **target) + +static int parse(int c, char **argv, int invert, unsigned int *flags, + const void *entry, struct xt_entry_target **target) { struct ipt_acc_info *accountinfo = (struct ipt_acc_info *)(*target)->data; struct in_addr *addrs = NULL, mask; @@ -57,43 +59,46 @@ parse(int c, char **argv, int invert, unsigned int *flags, switch (c) { case 'a': if (*flags & IPT_ACCOUNT_OPT_ADDR) - exit_error(PARAMETER_PROBLEM, "Can't specify --%s twice", + xtables_error(PARAMETER_PROBLEM, "Can't specify --%s twice", opts[0].name); - if (check_inverse(optarg, &invert, NULL, 0)) - exit_error(PARAMETER_PROBLEM, "Unexpected `!' after --%s", + if (xtables_check_inverse(optarg, &invert, NULL, 0)) + xtables_error(PARAMETER_PROBLEM, "Unexpected `!' after --%s", opts[0].name); - //loginfo->level = parse_level(optarg); +#ifdef XTABLES_VERSION_CODE + xtables_ipparse_any(optarg, &addrs, &mask, &naddrs); +#else parse_hostnetworkmask(optarg, &addrs, &mask, &naddrs); - +#endif + if (naddrs > 1) - exit_error(PARAMETER_PROBLEM, "multiple IP addresses not allowed"); - + xtables_error(PARAMETER_PROBLEM, "multiple IP addresses not allowed"); + accountinfo->net_ip = addrs[0].s_addr; accountinfo->net_mask = mask.s_addr; - + *flags |= IPT_ACCOUNT_OPT_ADDR; break; case 't': if (*flags & IPT_ACCOUNT_OPT_TABLE) - exit_error(PARAMETER_PROBLEM, + xtables_error(PARAMETER_PROBLEM, "Can't specify --%s twice", opts[1].name); - if (check_inverse(optarg, &invert, NULL, 0)) - exit_error(PARAMETER_PROBLEM, + if (xtables_check_inverse(optarg, &invert, NULL, 0)) + xtables_error(PARAMETER_PROBLEM, "Unexpected `!' after --%s", opts[1].name); if (strlen(optarg) > ACCOUNT_TABLE_NAME_LEN - 1) - exit_error(PARAMETER_PROBLEM, + xtables_error(PARAMETER_PROBLEM, "Maximum table name length %u for --%s", ACCOUNT_TABLE_NAME_LEN - 1, opts[1].name); strcpy(accountinfo->table_name, optarg); *flags |= IPT_ACCOUNT_OPT_TABLE; break; - + default: return 0; } @@ -104,12 +109,30 @@ parse(int c, char **argv, int invert, unsigned int *flags, static void final_check(unsigned int flags) { if (!(flags&IPT_ACCOUNT_OPT_ADDR) || !(flags&IPT_ACCOUNT_OPT_TABLE)) - exit_error(PARAMETER_PROBLEM, "ACCOUNT: needs --%s and --%s", + xtables_error(PARAMETER_PROBLEM, "ACCOUNT: needs --%s and --%s", opts[0].name, opts[1].name); } -static void print_it(const struct ipt_ip *ip, - const struct ipt_entry_target *target, char do_prefix) +static const char *print_helper_ip(struct in_addr a) +{ +#ifdef XTABLES_VERSION_CODE + return xtables_ipaddr_to_numeric(&a); +#else + return addr_to_dotted(&a); +#endif +} + +static const char *print_helper_mask(struct in_addr a) +{ +#ifdef XTABLES_VERSION_CODE + return xtables_ipmask_to_numeric(&a); +#else + return mask_to_dotted(&a); +#endif +} + +static void print_it(const void *ip, + const struct xt_entry_target *target, char do_prefix) { const struct ipt_acc_info *accountinfo = (const struct ipt_acc_info *)target->data; @@ -117,28 +140,28 @@ static void print_it(const struct ipt_ip *ip, if (!do_prefix) printf("ACCOUNT "); - + // Network information if (do_prefix) - printf("--"); + printf("--"); printf("%s ", opts[0].name); - + a.s_addr = accountinfo->net_ip; - printf("%s", addr_to_dotted(&a)); + printf("%s", print_helper_ip(a)); a.s_addr = accountinfo->net_mask; - printf("%s", mask_to_dotted(&a)); + printf("%s", print_helper_mask(a)); printf(" "); if (do_prefix) - printf("--"); + printf("--"); printf("%s %s", opts[1].name, accountinfo->table_name); } -/* Prints out the targinfo. */ + static void -print(const struct ipt_ip *ip, - const struct ipt_entry_target *target, +print(const void *ip, + const struct xt_entry_target *target, int numeric) { print_it (ip, target, 0); @@ -146,19 +169,20 @@ print(const struct ipt_ip *ip, /* Saves the union ipt_targinfo in parsable form to stdout. */ static void -save(const struct ipt_ip *ip, const struct ipt_entry_target *target) +save(const void *ip, const struct xt_entry_target *target) { print_it(ip, target, 1); } static -struct iptables_target account +struct xtables_target account = { .next = NULL, .name = "ACCOUNT", - .version = IPTABLES_VERSION, + .family = AF_INET, + .version = XTABLES_VERSION, .size = IPT_ALIGN(sizeof(struct ipt_acc_info)), - .userspacesize = IPT_ALIGN(sizeof(struct ipt_acc_info)), + .userspacesize = offsetof(struct ipt_acc_info, table_nr), .help = &help, .init = &init, .parse = &parse, @@ -170,5 +194,5 @@ struct iptables_target account void _init(void) { - register_target(&account); + xtables_register_target(&account); }