summaryrefslogtreecommitdiffstats
path: root/libip6t_SNPTV6.c
diff options
context:
space:
mode:
Diffstat (limited to 'libip6t_SNPTV6.c')
-rw-r--r--libip6t_SNPTV6.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/libip6t_SNPTV6.c b/libip6t_SNPTV6.c
index 3bcc66e..267a27a 100644
--- a/libip6t_SNPTV6.c
+++ b/libip6t_SNPTV6.c
@@ -16,15 +16,35 @@ static void SNPTV6_help(void)
NPTV6_help_note();
}
+static int SNPTV6_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_target **target)
+{
+ struct ip6t_nptv6_info* info = (struct ip6t_nptv6_info*)(*target)->data;
+
+ switch(c) {
+ case 0:
+ if (!optarg) {
+ xtables_error(PARAMETER_PROBLEM, "--to-source: No prefix given");
+ }
+ if (invert) {
+ xtables_error(PARAMETER_PROBLEM, "Unexpected `!' after --to-source");
+ }
+
+ NPTV6_parse_to(optarg, info);
+ return 1;
+ }
+
+ return 0;
+}
+
static void SNPTV6_save(const void *ip, const struct xt_entry_target *target)
{
const struct ip6t_nptv6_info* info = (struct ip6t_nptv6_info*)target->data;
printf(" --to-source %s/%d ", xtables_ip6addr_to_numeric(&info->nptv6_prefix), info->nptv6_prefix_len);
}
-static const struct xt_option_entry SNPTV6_opts[] = {
- {.name = "to-source", .id = 0, .type = XTTYPE_STRING, .flags = XTOPT_MAND},
- XTOPT_TABLEEND,
+static const struct option SNPTV6_opts[] = {
+ {.name = "to-source", .has_arg = required_argument, .flag = NULL, .val = 0},
+ {.name = NULL},
};
static struct xtables_target SNPTV6_tg6_reg = {
@@ -34,10 +54,10 @@ static struct xtables_target SNPTV6_tg6_reg = {
.size = XT_ALIGN(sizeof(struct ip6t_nptv6_info)),
.userspacesize = XT_ALIGN(sizeof(struct ip6t_nptv6_info)),
.help = SNPTV6_help,
- .x6_parse = NPTV6_parse,
+ .parse = SNPTV6_parse,
.print = NPTV6_print,
.save = SNPTV6_save,
- .x6_options = SNPTV6_opts,
+ .extra_opts = SNPTV6_opts,
};
void _init(void)