diff options
author | Stephane Ouellette <ouellettes@videotron.ca> | 2003-04-27 12:59:00 +0000 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2003-04-27 12:59:00 +0000 |
commit | 451f3eaad6712ba790aeba1a5af41ef9ee007d68 (patch) | |
tree | e590bba4f629783c1d7641a9085b61be61a4068c | |
parent | 30596a5e7ae8c518a8a0bbf3aa891728e9f9ec1b (diff) |
- Remove unneeded fputc() in help().
- C99 initializers.
- In parse(), print an error message when multiple strings are specified on the
command line.
- Remove print_string(). This fixes save() when used with
iptables-save/iptables-restore.
(Stephane Ouellette)
-rw-r--r-- | extensions/libipt_string.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/extensions/libipt_string.c b/extensions/libipt_string.c index 99611a3f..632d5af2 100644 --- a/extensions/libipt_string.c +++ b/extensions/libipt_string.c @@ -18,6 +18,7 @@ #include <iptables.h> #include <linux/netfilter_ipv4/ipt_string.h> + /* Function which prints out usage message. */ static void help(void) @@ -27,16 +28,16 @@ help(void) "--string [!] string Match a string in a packet\n" "--hex-string [!] string Match a hex string in a packet\n", IPTABLES_VERSION); - - fputc('\n', stdout); } + static struct option opts[] = { - { "string", 1, 0, '1' }, - { "hex-string", 1, 0, '2' }, - {0} + { .name = "string", .has_arg = 1, .flag = 0, .val = '1' }, + { .name = "hex-string", .has_arg = 1, .flag = 0, .val = '2' }, + { .name = 0 } }; + /* Initialize the match. */ static void init(struct ipt_entry_match *m, unsigned int *nfcache) @@ -44,6 +45,7 @@ init(struct ipt_entry_match *m, unsigned int *nfcache) *nfcache |= NFC_UNKNOWN; } + static void parse_string(const unsigned char *s, struct ipt_string_info *info) { @@ -51,6 +53,7 @@ parse_string(const unsigned char *s, struct ipt_string_info *info) else exit_error(PARAMETER_PROBLEM, "STRING too long `%s'", s); } + static void parse_hex_string(const unsigned char *s, struct ipt_string_info *info) { @@ -125,6 +128,7 @@ parse_hex_string(const unsigned char *s, struct ipt_string_info *info) info->len = sindex; } + /* Function which parses command options; returns true if it ate an option */ static int @@ -137,6 +141,10 @@ parse(int c, char **argv, int invert, unsigned int *flags, switch (c) { case '1': + if (*flags) + exit_error(PARAMETER_PROBLEM, + "Can't specify multiple strings"); + check_inverse(optarg, &invert, &optind, 0); parse_string(argv[optind-1], stringinfo); if (invert) @@ -146,6 +154,10 @@ parse(int c, char **argv, int invert, unsigned int *flags, break; case '2': + if (*flags) + exit_error(PARAMETER_PROBLEM, + "Can't specify multiple strings"); + check_inverse(optarg, &invert, &optind, 0); parse_hex_string(argv[optind-1], stringinfo); /* sets length */ if (invert) @@ -159,14 +171,6 @@ parse(int c, char **argv, int invert, unsigned int *flags, return 1; } -static void -print_string(char string[], int invert, int numeric) -{ - - if (invert) - fputc('!', stdout); - printf("%s ",string); -} /* Final check; must have specified --string. */ static void @@ -177,42 +181,46 @@ final_check(unsigned int flags) "STRING match: You must specify `--string'"); } + /* Prints out the matchinfo. */ static void print(const struct ipt_ip *ip, const struct ipt_entry_match *match, int numeric) { - printf("STRING match "); - print_string(((struct ipt_string_info *)match->data)->string, - ((struct ipt_string_info *)match->data)->invert, numeric); + const struct ipt_string_info *info = + (const struct ipt_string_info*) match->data; + + printf("STRING match %s%s ", (info->invert) ? "!" : "", info->string); } -/* Saves the union ipt_matchinfo in parsable form to stdout. */ + +/* Saves the union ipt_matchinfo in parseable form to stdout. */ static void save(const struct ipt_ip *ip, const struct ipt_entry_match *match) { - printf("--string "); - print_string(((struct ipt_string_info *)match->data)->string, - ((struct ipt_string_info *)match->data)->invert, 0); + const struct ipt_string_info *info = + (const struct ipt_string_info*) match->data; + + printf("--string %s%s ", (info->invert) ? "! ", "", info->string); } -static -struct iptables_match string -= { NULL, - "string", - IPTABLES_VERSION, - IPT_ALIGN(sizeof(struct ipt_string_info)), - IPT_ALIGN(sizeof(struct ipt_string_info)), - &help, - &init, - &parse, - &final_check, - &print, - &save, - opts + +static struct iptables_match string = { + .name = "string", + .version = IPTABLES_VERSION, + .size = IPT_ALIGN(sizeof(struct ipt_string_info)), + .userspacesize = IPT_ALIGN(sizeof(struct ipt_string_info)), + .help = &help, + .init = &init, + .parse = &parse, + .final_check = &final_check, + .print = &print, + .save = &save, + .extra_opts = opts }; + void _init(void) { register_match(&string); |