From ad0bed59f2b059edcae4af8cd1b3a1ba46523175 Mon Sep 17 00:00:00 2001 From: "/C=JP/ST=JP/CN=Yasuyuki Kozakai/emailAddress=yasuyuki@netfilter.org" Date: Tue, 24 Jul 2007 07:03:59 +0000 Subject: Add IPv6 support to quota match --- extensions/libxt_quota.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 extensions/libxt_quota.c (limited to 'extensions/libxt_quota.c') diff --git a/extensions/libxt_quota.c b/extensions/libxt_quota.c new file mode 100644 index 0000000..a273b29 --- /dev/null +++ b/extensions/libxt_quota.c @@ -0,0 +1,123 @@ +/* + * Shared library add-on to iptables to add quota support + * + * Sam Johnston + */ +#include +#include +#include +#include +#include + +#include + +static struct option opts[] = { + {"quota", 1, 0, '1'}, + {0} +}; + +/* print usage */ +static void +help(void) +{ + printf("quota options:\n" + " --quota quota quota (bytes)\n" "\n"); +} + +/* print matchinfo */ +static void +print(const void *ip, const struct xt_entry_match *match, int numeric) +{ + struct xt_quota_info *q = (struct xt_quota_info *) match->data; + printf("quota: %llu bytes", (unsigned long long) q->quota); +} + +/* save matchinfo */ +static void +save(const void *ip, const struct xt_entry_match *match) +{ + struct xt_quota_info *q = (struct xt_quota_info *) match->data; + printf("--quota %llu ", (unsigned long long) q->quota); +} + +/* parse quota option */ +static int +parse_quota(const char *s, u_int64_t * quota) +{ + *quota = strtoull(s, (char **) NULL, 10); + +#ifdef DEBUG_XT_QUOTA + printf("Quota: %llu\n", *quota); +#endif + + if (*quota == -1) + exit_error(PARAMETER_PROBLEM, "quota invalid: '%s'\n", s); + else + return 1; +} + +/* parse all options, returning true if we found any for us */ +static int +parse(int c, char **argv, int invert, unsigned int *flags, + const void *entry, + unsigned int *nfcache, struct xt_entry_match **match) +{ + struct xt_quota_info *info = (struct xt_quota_info *) (*match)->data; + + switch (c) { + case '1': + if (check_inverse(optarg, &invert, NULL, 0)) + exit_error(PARAMETER_PROBLEM, "quota: unexpected '!'"); + if (!parse_quota(optarg, &info->quota)) + exit_error(PARAMETER_PROBLEM, + "bad quota: '%s'", optarg); + break; + + default: + return 0; + } + return 1; +} + +/* no final check */ +static void +final_check(unsigned int flags) +{ +} + +struct xtables_match quota = { + .next = NULL, + .family = AF_INET, + .name = "quota", + .version = IPTABLES_VERSION, + .size = XT_ALIGN(sizeof (struct xt_quota_info)), + .userspacesize = offsetof(struct xt_quota_info, quota), + .help = &help, + .parse = &parse, + .final_check = &final_check, + .print = &print, + .save = &save, + .extra_opts = opts +}; + +struct xtables_match quota6 = { + .next = NULL, + .family = AF_INET6, + .name = "quota", + .version = IPTABLES_VERSION, + .size = XT_ALIGN(sizeof (struct xt_quota_info)), + .userspacesize = offsetof(struct xt_quota_info, quota), + .help = &help, + .parse = &parse, + .final_check = &final_check, + .print = &print, + .save = &save, + .extra_opts = opts +}; + +void +_init(void) +{ + xtables_register_match("a); + xtables_register_match("a6); +} -- cgit v1.2.3