diff options
Diffstat (limited to 'libip6t_SNPTV6.c')
-rw-r--r-- | libip6t_SNPTV6.c | 30 |
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) |