libxt_helper.c revision c5e85736c207f211d82d2878a5781f512327dfce
1/* Shared library add-on to iptables to add related packet matching support. */
2#include <stdio.h>
3#include <netdb.h>
4#include <string.h>
5#include <stdlib.h>
6#include <getopt.h>
7
8#include <xtables.h>
9#include <linux/netfilter/xt_helper.h>
10
11static void helper_help(void)
12{
13	printf(
14"helper match options:\n"
15"[!] --helper string        Match helper identified by string\n");
16}
17
18static const struct option helper_opts[] = {
19	{ "helper", 1, NULL, '1' },
20	{ .name = NULL }
21};
22
23static int
24helper_parse(int c, char **argv, int invert, unsigned int *flags,
25             const void *entry, struct xt_entry_match **match)
26{
27	struct xt_helper_info *info = (struct xt_helper_info *)(*match)->data;
28
29	switch (c) {
30	case '1':
31		if (*flags)
32			xtables_error(PARAMETER_PROBLEM,
33					"helper match: Only use --helper ONCE!");
34		xtables_check_inverse(optarg, &invert, &invert, 0);
35		strncpy(info->name, optarg, 29);
36		info->name[29] = '\0';
37		if (invert)
38			info->invert = 1;
39		*flags = 1;
40		break;
41
42	default:
43		return 0;
44	}
45	return 1;
46}
47
48static void helper_check(unsigned int flags)
49{
50	if (!flags)
51		xtables_error(PARAMETER_PROBLEM,
52			   "helper match: You must specify `--helper'");
53}
54
55static void
56helper_print(const void *ip, const struct xt_entry_match *match, int numeric)
57{
58	const struct xt_helper_info *info = (const void *)match->data;
59
60	printf("helper match %s\"%s\" ", info->invert ? "! " : "", info->name);
61}
62
63static void helper_save(const void *ip, const struct xt_entry_match *match)
64{
65	const struct xt_helper_info *info = (const void *)match->data;
66
67	printf("%s--helper ",info->invert ? "! " : "");
68	xtables_save_string(info->name);
69}
70
71static struct xtables_match helper_match = {
72	.family		= NFPROTO_UNSPEC,
73	.name		= "helper",
74	.version	= XTABLES_VERSION,
75	.size		= XT_ALIGN(sizeof(struct xt_helper_info)),
76	.help		= helper_help,
77	.parse		= helper_parse,
78	.final_check	= helper_check,
79	.print		= helper_print,
80	.save		= helper_save,
81	.extra_opts	= helper_opts,
82};
83
84void _init(void)
85{
86	xtables_register_match(&helper_match);
87}
88