summaryrefslogtreecommitdiffstats
path: root/extensions/libipt_account.c
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/libipt_account.c')
-rw-r--r--extensions/libipt_account.c277
1 files changed, 0 insertions, 277 deletions
diff --git a/extensions/libipt_account.c b/extensions/libipt_account.c
deleted file mode 100644
index d049a03d..00000000
--- a/extensions/libipt_account.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * accounting match helper (libipt_account.c)
- * (C) 2003,2004 by Piotr Gasidło (quaker@barbara.eu.org)
- *
- * Version: 0.1.6
- *
- * This software is distributed under the terms of GNU GPL
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <iptables.h>
-#include <string.h>
-#include <getopt.h>
-
-#include <linux/netfilter_ipv4/ipt_account.h>
-
-#ifndef HIPQUAD
-#define HIPQUAD(addr) \
- ((unsigned char *)&addr)[3], \
- ((unsigned char *)&addr)[2], \
- ((unsigned char *)&addr)[1], \
- ((unsigned char *)&addr)[0]
-#endif
-
-static void help(void) {
- printf(
- "account v%s options:\n"
- "--aaddr network/netmask\n"
- " defines network/netmask for which make statistics.\n"
- "--aname name\n"
- " defines name of list where statistics will be kept. If no is\n"
- " specified DEFAULT will be used.\n"
- "--ashort\n"
- " table will colect only short statistics (only total counters\n"
- " without splitting it into protocols.\n"
- ,
- IPTABLES_VERSION);
-};
-
-static struct option opts[] = {
- { .name = "aaddr", .has_arg = 1, .flag = NULL, .val = 201 },
- { .name = "aname", .has_arg = 1, .flag = NULL, .val = 202 },
- { .name = "ashort", .has_arg = 0, .flag = NULL, .val = 203 },
- { .name = 0, .has_arg = 0, .flag = 0, .val = 0 }
-};
-
-/* Helper functions for parse_network */
-int parseip(const char *parameter, u_int32_t *ip) {
-
- char buffer[16], *bufferptr, *dot;
- unsigned int i, shift, part;
-
- if (strlen(parameter) > 15)
- return 0;
-
- strncpy(buffer, parameter, 15);
- buffer[15] = 0;
-
- bufferptr = buffer;
-
- for (i = 0, shift = 24, *ip = 0; i < 3; i++, shift -= 8) {
- /* no dot */
- if ((dot = strchr(bufferptr, '.')) == NULL)
- return 0;
- /* not a number */
- if ((part = strtol(bufferptr, (char**)NULL, 10)) < 0)
- return 0;
- /* to big number */
- if (part > 255)
- return 0;
- *ip |= part << shift;
- bufferptr = dot + 1;
- }
- /* not a number */
- if ((part = strtol(bufferptr, (char**)NULL, 10)) < 0)
- return 0;
- /* to big number */
- if (part > 255)
- return 0;
- *ip |= part;
- return 1;
-}
-
-static void parsenetwork(const char *parameter, u_int32_t *network) {
- if (!parseip(parameter, network))
- exit_error(PARAMETER_PROBLEM, "account: wrong ip in network");
-}
-
-static void parsenetmaskasbits(const char *parameter, u_int32_t *netmask) {
-
- u_int32_t bits;
-
- if ((bits = strtol(parameter, (char **)NULL, 10)) < 0 || bits > 32)
- exit_error(PARAMETER_PROBLEM, "account: wrong netmask");
-
- *netmask = 0xffffffff << (32 - bits);
-}
-
-static void parsenetmaskasip(const char *parameter, u_int32_t *netmask) {
- if (!parseip(parameter, netmask))
- exit_error(PARAMETER_PROBLEM, "account: wrong ip in netmask");
-}
-
-static void parsenetmask(const char *parameter, u_int32_t *netmask)
-{
- if (strchr(parameter, '.') != NULL)
- parsenetmaskasip(parameter, netmask);
- else
- parsenetmaskasbits(parameter, netmask);
-}
-
-static void parsenetworkandnetmask(const char *parameter, u_int32_t *network, u_int32_t *netmask)
-{
-
- char buffer[32], *slash;
-
- if (strlen(parameter) > 31)
- /* text is to long, even for 255.255.255.255/255.255.255.255 */
- exit_error(PARAMETER_PROBLEM, "account: wrong network/netmask");
-
- strncpy(buffer, parameter, 31);
- buffer[31] = 0;
-
- /* check whether netmask is given */
- if ((slash = strchr(buffer, '/')) != NULL) {
- parsenetmask(slash + 1, netmask);
- *slash = 0;
- } else
- *netmask = 0xffffffff;
- parsenetwork(buffer, network);
-
- if ((*network & *netmask) != *network)
- exit_error(PARAMETER_PROBLEM, "account: wrong network/netmask");
-}
-
-
-/* Function gets network & netmask from argument after --aaddr */
-static void parse_network(const char *parameter, struct t_ipt_account_info *info) {
-
- parsenetworkandnetmask(parameter, &info->network, &info->netmask);
-
-}
-
-/* validate netmask */
-inline int valid_netmask(u_int32_t netmask) {
- while (netmask & 0x80000000)
- netmask <<= 1;
- if (netmask != 0)
- return 0;
- return 1;
-}
-
-/* validate network/netmask pair */
-inline int valid_network_and_netmask(struct t_ipt_account_info *info) {
- if (!valid_netmask(info->netmask))
- return 0;
- if ((info->network & info->netmask) != info->network)
- return 0;
- return 1;
-}
-
-
-
-/* Function initializes match */
-static void init(struct ipt_entry_match *match,
- unsigned int *nfcache) {
-
- struct t_ipt_account_info *info = (struct t_ipt_account_info *)(match)->data;
-
-
- /* set default table name to DEFAULT */
- strncpy(info->name, "DEFAULT", IPT_ACCOUNT_NAME_LEN);
- info->shortlisting = 0;
-
-}
-
-/* Function parses match's arguments */
-static int parse(int c, char **argv,
- int invert,
- unsigned int *flags,
- const struct ipt_entry *entry,
- unsigned int *nfcache,
- struct ipt_entry_match **match) {
-
- struct t_ipt_account_info *info = (struct t_ipt_account_info *)(*match)->data;
-
- switch (c) {
-
- /* --aaddr */
- case 201:
- parse_network(optarg, info);
- if (!valid_network_and_netmask(info))
- exit_error(PARAMETER_PROBLEM, "account: wrong network/netmask");
- *flags = 1;
- break;
-
- /* --aname */
- case 202:
- if (strlen(optarg) < IPT_ACCOUNT_NAME_LEN)
- strncpy(info->name, optarg, IPT_ACCOUNT_NAME_LEN);
- else
- exit_error(PARAMETER_PROBLEM, "account: Too long table name");
- break;
- /* --ashort */
- case 203:
- info->shortlisting = 1;
- break;
- default:
- return 0;
- }
- return 1;
-}
-
-/* Final check whether network/netmask was specified */
-static void final_check(unsigned int flags) {
- if (!flags)
- exit_error(PARAMETER_PROBLEM, "account: You need specify '--aaddr' parameter");
-}
-
-/* Function used for printing rule with account match for iptables -L */
-static void print(const struct ipt_ip *ip,
- const struct ipt_entry_match *match,
- int numeric) {
-
- struct t_ipt_account_info *info = (struct t_ipt_account_info *)match->data;
-
- printf("account: ");
- printf("network/netmask: ");
- printf("%u.%u.%u.%u/%u.%u.%u.%u ",
- HIPQUAD(info->network),
- HIPQUAD(info->netmask)
- );
-
- printf("name: %s ", info->name);
- if (info->shortlisting)
- printf("short-listing ");
-}
-
-/* Function used for saving rule containing account match */
-static void save(const struct ipt_ip *ip,
- const struct ipt_entry_match *match) {
-
- struct t_ipt_account_info *info = (struct t_ipt_account_info *)match->data;
-
- printf("--aaddr ");
- printf("%u.%u.%u.%u/%u.%u.%u.%u ",
- HIPQUAD(info->network),
- HIPQUAD(info->netmask)
- );
-
- printf("--aname %s ", info->name);
- if (info->shortlisting)
- printf("--ashort ");
-}
-
-static struct iptables_match account = {
- .next = NULL,
- .name = "account",
- .version = IPTABLES_VERSION,
- .size = IPT_ALIGN(sizeof(struct t_ipt_account_info)),
- .userspacesize = IPT_ALIGN(sizeof(struct t_ipt_account_info)),
- .help = &help,
- .init = &init,
- .parse = &parse,
- .final_check = &final_check,
- .print = &print,
- .save = &save,
- .extra_opts = opts
-};
-
-/* Function which registers match */
-void _init(void)
-{
- register_match(&account);
-}
-