Blame extensions/libxt_nfacct.c

Packit 7b22a4
/*
Packit 7b22a4
 * (C) 2011 by Pablo Neira Ayuso <pablo@netfilter.org>
Packit 7b22a4
 * (C) 2011 by Intra2Net AG <http://www.intra2net.com>
Packit 7b22a4
 *
Packit 7b22a4
 * This program is free software; you can redistribute it and/or modify
Packit 7b22a4
 * it under the terms of the GNU General Public License version 2 (or
Packit 7b22a4
 * any later at your option) as published by the Free Software Foundation.
Packit 7b22a4
 */
Packit 7b22a4
#include <stdbool.h>
Packit 7b22a4
#include <stdlib.h>
Packit 7b22a4
#include <stdio.h>
Packit 7b22a4
#include <string.h>
Packit 7b22a4
#include <getopt.h>
Packit 7b22a4
#include <xtables.h>
Packit 7b22a4
Packit 7b22a4
#include <linux/netfilter/x_tables.h>
Packit 7b22a4
#include <linux/netfilter/xt_nfacct.h>
Packit 7b22a4
Packit 7b22a4
enum {
Packit 7b22a4
	O_NAME = 0,
Packit 7b22a4
};
Packit 7b22a4
Packit 7b22a4
#define s struct xt_nfacct_match_info
Packit 7b22a4
static const struct xt_option_entry nfacct_opts[] = {
Packit 7b22a4
	{.name = "nfacct-name", .id = O_NAME, .type = XTTYPE_STRING,
Packit 7b22a4
	 .min = 1, .flags = XTOPT_MAND|XTOPT_PUT, XTOPT_POINTER(s, name)},
Packit 7b22a4
	XTOPT_TABLEEND,
Packit 7b22a4
};
Packit 7b22a4
#undef s
Packit 7b22a4
Packit 7b22a4
static void nfacct_help(void)
Packit 7b22a4
{
Packit 7b22a4
	printf("nfacct match options:\n"
Packit 7b22a4
	       " --nfacct-name STRING		Name of accouting area\n");
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void nfacct_parse(struct xt_option_call *cb)
Packit 7b22a4
{
Packit 7b22a4
	xtables_option_parse(cb);
Packit 7b22a4
	switch (cb->entry->id) {
Packit 7b22a4
	case O_NAME:
Packit 7b22a4
		if (strchr(cb->arg, '\n') != NULL)
Packit 7b22a4
			xtables_error(PARAMETER_PROBLEM,
Packit 7b22a4
				   "Newlines not allowed in --nfacct-name");
Packit 7b22a4
		break;
Packit 7b22a4
	}
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void
Packit 7b22a4
nfacct_print_name(const struct xt_nfacct_match_info *info, char *name)
Packit 7b22a4
{
Packit 7b22a4
	printf(" %snfacct-name ", name);
Packit 7b22a4
	xtables_save_string(info->name);
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void nfacct_print(const void *ip, const struct xt_entry_match *match,
Packit 7b22a4
                        int numeric)
Packit 7b22a4
{
Packit 7b22a4
	const struct xt_nfacct_match_info *info =
Packit 7b22a4
		(struct xt_nfacct_match_info *)match->data;
Packit 7b22a4
Packit 7b22a4
	nfacct_print_name(info, "");
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static void nfacct_save(const void *ip, const struct xt_entry_match *match)
Packit 7b22a4
{
Packit 7b22a4
	const struct xt_nfacct_match_info *info =
Packit 7b22a4
		(struct xt_nfacct_match_info *)match->data;
Packit 7b22a4
Packit 7b22a4
	nfacct_print_name(info, "--");
Packit 7b22a4
}
Packit 7b22a4
Packit 7b22a4
static struct xtables_match nfacct_matches[] = {
Packit 7b22a4
	{
Packit 7b22a4
		.family		= NFPROTO_UNSPEC,
Packit 7b22a4
		.revision	= 0,
Packit 7b22a4
		.name		= "nfacct",
Packit 7b22a4
		.version	= XTABLES_VERSION,
Packit 7b22a4
		.size		= XT_ALIGN(sizeof(struct xt_nfacct_match_info)),
Packit 7b22a4
		.userspacesize	= offsetof(struct xt_nfacct_match_info, nfacct),
Packit 7b22a4
		.help		= nfacct_help,
Packit 7b22a4
		.x6_parse	= nfacct_parse,
Packit 7b22a4
		.print		= nfacct_print,
Packit 7b22a4
		.save		= nfacct_save,
Packit 7b22a4
		.x6_options	= nfacct_opts,
Packit 7b22a4
	},
Packit 7b22a4
	{
Packit 7b22a4
		.family		= NFPROTO_UNSPEC,
Packit 7b22a4
		.revision	= 1,
Packit 7b22a4
		.name		= "nfacct",
Packit 7b22a4
		.version	= XTABLES_VERSION,
Packit 7b22a4
		.size		= XT_ALIGN(sizeof(struct xt_nfacct_match_info_v1)),
Packit 7b22a4
		.userspacesize	= offsetof(struct xt_nfacct_match_info_v1, nfacct),
Packit 7b22a4
		.help		= nfacct_help,
Packit 7b22a4
		.x6_parse	= nfacct_parse,
Packit 7b22a4
		.print		= nfacct_print,
Packit 7b22a4
		.save		= nfacct_save,
Packit 7b22a4
		.x6_options	= nfacct_opts,
Packit 7b22a4
	},
Packit 7b22a4
};
Packit 7b22a4
Packit 7b22a4
void _init(void)
Packit 7b22a4
{
Packit 7b22a4
	xtables_register_matches(nfacct_matches, ARRAY_SIZE(nfacct_matches));
Packit 7b22a4
}