1/* Shared library add-on to iptables for the XOR target
2 * (C) 2000 by Tim Vandermeersch <Tim.Vandermeersch@pandora.be>
3 * Based on libipt_TTL.c
4 *
5 * Version 1.0
6 *
7 * This program is distributed under the terms of GNU GPL
8 */
9
10#include <stdio.h>
11#include <string.h>
12#include <stdlib.h>
13#include <getopt.h>
14#include <iptables.h>
15
16#include <linux/netfilter_ipv4/ip_tables.h>
17#include <linux/netfilter_ipv4/ipt_XOR.h>
18
19#define	IPT_KEY_SET		1
20#define IPT_BLOCKSIZE_SET	2
21
22static void init(struct ipt_entry_target *t, unsigned int *nfcache)
23{
24}
25
26static void help(void)
27{
28	printf(
29		"XOR target v%s options\n"
30		"  --key string	          Set key to \"string\"\n"
31		"  --block-size		  Set block size\n",
32		IPTABLES_VERSION);
33}
34
35static int parse(int c, char **argv, int invert, unsigned int *flags,
36		const struct ipt_entry *entry,
37		struct ipt_entry_target **target)
38{
39	struct ipt_XOR_info *info = (struct ipt_XOR_info *) (*target)->data;
40
41	if (!optarg)
42		exit_error(PARAMETER_PROBLEM, "XOR: too few arguments");
43
44	if (check_inverse(optarg, &invert, NULL, 0))
45		exit_error(PARAMETER_PROBLEM, "XOR: unexpected '!'");
46
47	switch (c) {
48		case '1':
49			strncpy(info->key, optarg, 30);
50			info->key[29] = '\0';
51			*flags |= IPT_KEY_SET;
52			break;
53		case '2':
54			info->block_size = atoi(optarg);
55			*flags |= IPT_BLOCKSIZE_SET;
56			break;
57		default:
58			return 0;
59	}
60
61	return 1;
62}
63
64static void final_check(unsigned int flags)
65{
66	if (!(flags & IPT_KEY_SET))
67		exit_error(PARAMETER_PROBLEM, "XOR: You must specify a key");
68	if (!(flags & IPT_BLOCKSIZE_SET))
69		exit_error(PARAMETER_PROBLEM, "XOR: You must specify a block-size");
70}
71
72static void save (const struct ipt_ip *ip,
73		const struct ipt_entry_target *target)
74{
75	const struct ipt_XOR_info *info = (struct ipt_XOR_info *) target->data;
76
77	printf("--key %s ", info->key);
78	printf("--block-size %u ", info->block_size);
79}
80
81static void print (const struct ipt_ip *ip,
82	const struct ipt_entry_target *target, int numeric)
83{
84	const struct ipt_XOR_info *info = (struct ipt_XOR_info *) target->data;
85
86	printf("key: %s ", info->key);
87	printf("block-size: %u ", info->block_size);
88}
89
90static struct option opts[] = {
91	{ "key", 1, 0, '1' },
92	{ "block-size", 1, 0, '2' },
93	{ 0 }
94};
95
96static struct iptables_target XOR = {
97	.next		= NULL,
98	.name		= "XOR",
99	.version	= IPTABLES_VERSION,
100	.size		= IPT_ALIGN(sizeof(struct ipt_XOR_info)),
101	.userspacesize	= IPT_ALIGN(sizeof(struct ipt_XOR_info)),
102	.help		= &help,
103	.init		= &init,
104	.parse		= &parse,
105	.final_check	= &final_check,
106	.print		= &print,
107	.save		= &save,
108	.extra_opts	= opts
109};
110
111void _init(void)
112{
113	register_target(&XOR);
114}
115