]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
extensions: libebt_redirect: Use guided option parser
authorPhil Sutter <phil@nwl.cc>
Sun, 26 Nov 2023 16:17:12 +0000 (17:17 +0100)
committerPhil Sutter <phil@nwl.cc>
Wed, 10 Jan 2024 15:07:31 +0000 (16:07 +0100)
extensions/libebt_redirect.c

index 7821935e137aa67216f234565a7bdeaa0a2933c9..a44dbaec6cc8b12f20acd31dcb1360ac7245e349 100644 (file)
@@ -9,17 +9,19 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <getopt.h>
 #include <xtables.h>
 #include <linux/netfilter_bridge/ebt_redirect.h>
 #include "iptables/nft.h"
 #include "iptables/nft-bridge.h"
 
-#define REDIRECT_TARGET '1'
-static const struct option brredir_opts[] =
+enum {
+       O_TARGET,
+};
+
+static const struct xt_option_entry brredir_opts[] =
 {
-       { "redirect-target", required_argument, 0, REDIRECT_TARGET },
-       { 0 }
+       { .name = "redirect-target", .id = O_TARGET, .type = XTTYPE_STRING },
+       XTOPT_TABLEEND,
 };
 
 static void brredir_print_help(void)
@@ -37,23 +39,15 @@ static void brredir_init(struct xt_entry_target *target)
        redirectinfo->target = EBT_ACCEPT;
 }
 
-#define OPT_REDIRECT_TARGET  0x01
-static int brredir_parse(int c, char **argv, int invert, unsigned int *flags,
-                        const void *entry, struct xt_entry_target **target)
+static void brredir_parse(struct xt_option_call *cb)
 {
-       struct ebt_redirect_info *redirectinfo =
-          (struct ebt_redirect_info *)(*target)->data;
-
-       switch (c) {
-       case REDIRECT_TARGET:
-               EBT_CHECK_OPTION(flags, OPT_REDIRECT_TARGET);
-               if (ebt_fill_target(optarg, (unsigned int *)&redirectinfo->target))
-                       xtables_error(PARAMETER_PROBLEM, "Illegal --redirect-target target");
-               break;
-       default:
-               return 0;
-       }
-       return 1;
+       struct ebt_redirect_info *redirectinfo = cb->data;
+
+       xtables_option_parse(cb);
+       if (cb->entry->id == O_TARGET &&
+           ebt_fill_target(cb->arg, (unsigned int *)&redirectinfo->target))
+               xtables_error(PARAMETER_PROBLEM,
+                             "Illegal --redirect-target target");
 }
 
 static void brredir_print(const void *ip, const struct xt_entry_target *target, int numeric)
@@ -97,10 +91,10 @@ static struct xtables_target brredirect_target = {
        .userspacesize  = XT_ALIGN(sizeof(struct ebt_redirect_info)),
        .help           = brredir_print_help,
        .init           = brredir_init,
-       .parse          = brredir_parse,
+       .x6_parse       = brredir_parse,
        .print          = brredir_print,
        .xlate          = brredir_xlate,
-       .extra_opts     = brredir_opts,
+       .x6_options     = brredir_opts,
 };
 
 void _init(void)