diff options
author | Tim Vandermeersch <tim.vandermeersch@pandora.be> | 2003-05-31 17:11:49 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2003-05-31 17:11:49 +0000 |
commit | 926d46fc2998b7f59a0ca932852082b9bc9db4ed (patch) | |
tree | 51a2404c4392da60ee6ed1ba668e973b5e926896 | |
parent | 5a52c517ebb2c7421f57b0f00f2de6697cdd7a9c (diff) |
add XOR patch by Tim Vandermeersch
-rwxr-xr-x | extensions/.XOR-test | 2 | ||||
-rw-r--r-- | extensions/libipt_XOR.c | 112 |
2 files changed, 114 insertions, 0 deletions
diff --git a/extensions/.XOR-test b/extensions/.XOR-test new file mode 100755 index 00000000..92707da2 --- /dev/null +++ b/extensions/.XOR-test @@ -0,0 +1,2 @@ +#! /bin/sh +[ -f $KERNEL_DIR/net/ipv4/netfilter/ipt_XOR.c ] && echo XOR diff --git a/extensions/libipt_XOR.c b/extensions/libipt_XOR.c new file mode 100644 index 00000000..3b05a309 --- /dev/null +++ b/extensions/libipt_XOR.c @@ -0,0 +1,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); +} |