]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
extensions: libebt_nflog: Use guided option parser
authorPhil Sutter <phil@nwl.cc>
Wed, 12 Oct 2022 00:47:44 +0000 (02:47 +0200)
committerPhil Sutter <phil@nwl.cc>
Wed, 10 Jan 2024 15:07:31 +0000 (16:07 +0100)
extensions/libebt_nflog.c

index 762d6d5d8bbe24207dbd333155f0ed48c0d0dad8..48cd53218bf0809195ff460870f9a899020177c5 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <getopt.h>
 #include <xtables.h>
 #include "iptables/nft.h"
 #include "iptables/nft-bridge.h"
 #include <linux/netfilter_bridge/ebt_nflog.h>
 
 enum {
-       NFLOG_GROUP     = 0x1,
-       NFLOG_PREFIX    = 0x2,
-       NFLOG_RANGE     = 0x4,
-       NFLOG_THRESHOLD = 0x8,
-       NFLOG_NFLOG     = 0x16,
+       O_GROUP = 0,
+       O_PREFIX,
+       O_RANGE,
+       O_THRESHOLD,
+       O_NFLOG,
 };
 
-static const struct option brnflog_opts[] = {
-       { .name = "nflog-group",     .has_arg = true,  .val = NFLOG_GROUP},
-       { .name = "nflog-prefix",    .has_arg = true,  .val = NFLOG_PREFIX},
-       { .name = "nflog-range",     .has_arg = true,  .val = NFLOG_RANGE},
-       { .name = "nflog-threshold", .has_arg = true,  .val = NFLOG_THRESHOLD},
-       { .name = "nflog",           .has_arg = false, .val = NFLOG_NFLOG},
-       XT_GETOPT_TABLEEND,
+static const struct xt_option_entry brnflog_opts[] = {
+       { .name = "nflog-group",     .id = O_GROUP, .type = XTTYPE_UINT16,
+         .flags = XTOPT_PUT, XTOPT_POINTER(struct ebt_nflog_info, group) },
+       { .name = "nflog-prefix",    .id = O_PREFIX, .type = XTTYPE_STRING,
+         .flags = XTOPT_PUT, XTOPT_POINTER(struct ebt_nflog_info, prefix) },
+       { .name = "nflog-range",     .id = O_RANGE, .type = XTTYPE_UINT32,
+         .flags = XTOPT_PUT, XTOPT_POINTER(struct ebt_nflog_info, len) },
+       { .name = "nflog-threshold", .id = O_THRESHOLD, .type = XTTYPE_UINT16,
+         .flags = XTOPT_PUT, XTOPT_POINTER(struct ebt_nflog_info, threshold) },
+       { .name = "nflog",           .id = O_NFLOG, .type = XTTYPE_NONE },
+       XTOPT_TABLEEND,
 };
 
 static void brnflog_help(void)
@@ -59,55 +62,6 @@ static void brnflog_init(struct xt_entry_target *t)
        info->threshold = EBT_NFLOG_DEFAULT_THRESHOLD;
 }
 
-static int brnflog_parse(int c, char **argv, int invert, unsigned int *flags,
-                        const void *entry, struct xt_entry_target **target)
-{
-       struct ebt_nflog_info *info = (struct ebt_nflog_info *)(*target)->data;
-       unsigned int i;
-
-       if (invert)
-               xtables_error(PARAMETER_PROBLEM,
-                             "The use of '!' makes no sense for the"
-                             " nflog watcher");
-
-       switch (c) {
-       case NFLOG_PREFIX:
-               EBT_CHECK_OPTION(flags, NFLOG_PREFIX);
-               if (strlen(optarg) > EBT_NFLOG_PREFIX_SIZE - 1)
-                       xtables_error(PARAMETER_PROBLEM,
-                                     "Prefix too long for nflog-prefix");
-               strncpy(info->prefix, optarg, EBT_NFLOG_PREFIX_SIZE);
-               break;
-       case NFLOG_GROUP:
-               EBT_CHECK_OPTION(flags, NFLOG_GROUP);
-               if (!xtables_strtoui(optarg, NULL, &i, 1, UINT32_MAX))
-                       xtables_error(PARAMETER_PROBLEM,
-                                     "--nflog-group must be a number!");
-               info->group = i;
-               break;
-       case NFLOG_RANGE:
-               EBT_CHECK_OPTION(flags, NFLOG_RANGE);
-               if (!xtables_strtoui(optarg, NULL, &i, 1, UINT32_MAX))
-                       xtables_error(PARAMETER_PROBLEM,
-                                     "--nflog-range must be a number!");
-               info->len = i;
-               break;
-       case NFLOG_THRESHOLD:
-               EBT_CHECK_OPTION(flags, NFLOG_THRESHOLD);
-               if (!xtables_strtoui(optarg, NULL, &i, 1, UINT32_MAX))
-                       xtables_error(PARAMETER_PROBLEM,
-                                     "--nflog-threshold must be a number!");
-               info->threshold = i;
-               break;
-       case NFLOG_NFLOG:
-               EBT_CHECK_OPTION(flags, NFLOG_NFLOG);
-               break;
-       default:
-               return 0;
-       }
-       return 1;
-}
-
 static void
 brnflog_print(const void *ip, const struct xt_entry_target *target,
              int numeric)
@@ -153,10 +107,10 @@ static struct xtables_target brnflog_watcher = {
        .userspacesize  = XT_ALIGN(sizeof(struct ebt_nflog_info)),
        .init           = brnflog_init,
        .help           = brnflog_help,
-       .parse          = brnflog_parse,
+       .x6_parse       = xtables_option_parse,
        .print          = brnflog_print,
        .xlate          = brnflog_xlate,
-       .extra_opts     = brnflog_opts,
+       .x6_options     = brnflog_opts,
 };
 
 void _init(void)