summaryrefslogtreecommitdiffstats
path: root/extensions/libipt_XOR.c
blob: 3b05a30903fb20dc854b64f5d97e5ecf2ff9fbc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* Shared library add-on to iptables for the XOR target
 * (C) 2000 by Tim Vandermeersch <Tim.Vandermeersch@pandora.be>
 * Based on libipt_TTL.c
 *
 * Version 1.0
 *
 * This program is distributed under the terms of GNU GPL
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
#include <iptables.h>

#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_XOR.h>

#define	IPT_KEY_SET		1
#define IPT_BLOCKSIZE_SET	2

static void init(struct ipt_entry_target *t, unsigned int *nfcache) 
{
}

static void help(void) 
{
	printf(
		"XOR target v%s options\n"
		"  --key string	          Set key to \"string\"\n"
		"  --block-size		  Set block size\n",
		IPTABLES_VERSION);
}

static int parse(int c, char **argv, int invert, unsigned int *flags,
		const struct ipt_entry *entry, 
		struct ipt_entry_target **target)
{
	struct ipt_XOR_info *info = (struct ipt_XOR_info *) (*target)->data;
	
	if (!optarg)
		exit_error(PARAMETER_PROBLEM, "XOR: too few arguments");
	
	if (check_inverse(optarg, &invert, NULL, 0))
		exit_error(PARAMETER_PROBLEM, "XOR: unexpected '!'");

	switch (c) {	
		case '1':
			strncpy(info->key, optarg, 30);
			*flags |= IPT_KEY_SET;
			break;
		case '2':
			info->block_size = atoi(optarg);
			*flags |= IPT_BLOCKSIZE_SET;
			break;
		default:
			return 0;
	}
	
	return 1;
}

static void final_check(unsigned int flags)
{
	if (!(flags & IPT_KEY_SET))
		exit_error(PARAMETER_PROBLEM, "XOR: You must specify a key");
	if (!(flags & IPT_BLOCKSIZE_SET))
		exit_error(PARAMETER_PROBLEM, "XOR: You must specify a block-size");
}

static void save (const struct ipt_ip *ip,
		const struct ipt_entry_target *target)
{
	const struct ipt_XOR_info *info = (struct ipt_XOR_info *) target->data;

	printf("--key %s ", info->key);
	printf("--block-size %u ", info->block_size);
}

static void print (const struct ipt_ip *ip,
	const struct ipt_entry_target *target, int numeric)
{
	const struct ipt_XOR_info *info = (struct ipt_XOR_info *) target->data;

	printf("key: %s ", info->key);
	printf("block-size: %u ", info->block_size);
}

static struct option opts[] = {
	{ "key", 1, 0, '1' },
	{ "block-size", 1, 0, '2' },
	{ 0 }
};

static struct iptables_target XOR = { NULL, 
	"XOR",
	IPTABLES_VERSION,
	IPT_ALIGN(sizeof(struct ipt_XOR_info)),
	IPT_ALIGN(sizeof(struct ipt_XOR_info)),
	&help,
	&init,
	&parse,
	&final_check,
	&print,
	&save,
	opts 
};

void _init(void)
{
	register_target(&XOR);
}