]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
libxt_NFLOG: use guided option parser
authorJan Engelhardt <jengelh@medozas.de>
Sun, 1 May 2011 14:27:46 +0000 (16:27 +0200)
committerJan Engelhardt <jengelh@medozas.de>
Sun, 8 May 2011 22:41:20 +0000 (00:41 +0200)
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
extensions/libxt_NFLOG.c

index 61c97412599d30c1ea39b41d165c8c4bf0615b87..448576afaabe3bb7e39254acede9530d7ad70ad1 100644 (file)
@@ -9,19 +9,25 @@
 #include <linux/netfilter/xt_NFLOG.h>
 
 enum {
-       NFLOG_GROUP     = 0x1,
-       NFLOG_PREFIX    = 0x2,
-       NFLOG_RANGE     = 0x4,
-       NFLOG_THRESHOLD = 0x8,
+       O_GROUP = 0,
+       O_PREFIX,
+       O_RANGE,
+       O_THRESHOLD,
 };
 
-static const struct option NFLOG_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},
-       XT_GETOPT_TABLEEND,
+#define s struct xt_nflog_info
+static const struct xt_option_entry NFLOG_opts[] = {
+       {.name = "nflog-group", .id = O_GROUP, .type = XTTYPE_UINT16,
+        .flags = XTOPT_PUT, XTOPT_POINTER(s, group)},
+       {.name = "nflog-prefix", .id = O_PREFIX, .type = XTTYPE_STRING,
+        .min = 1, .flags = XTOPT_PUT, XTOPT_POINTER(s, prefix)},
+       {.name = "nflog-range", .id = O_RANGE, .type = XTTYPE_UINT32,
+        .flags = XTOPT_PUT, XTOPT_POINTER(s, len)},
+       {.name = "nflog-threshold", .id = O_THRESHOLD, .type = XTTYPE_UINT16,
+        .flags = XTOPT_PUT, XTOPT_POINTER(s, threshold)},
+       XTOPT_TABLEEND,
 };
+#undef s
 
 static void NFLOG_help(void)
 {
@@ -39,72 +45,16 @@ static void NFLOG_init(struct xt_entry_target *t)
        info->threshold = XT_NFLOG_DEFAULT_THRESHOLD;
 }
 
-static int NFLOG_parse(int c, char **argv, int invert, unsigned int *flags,
-                       const void *entry, struct xt_entry_target **target)
+static void NFLOG_parse(struct xt_option_call *cb)
 {
-       struct xt_nflog_info *info = (struct xt_nflog_info *)(*target)->data;
-       int n;
-       size_t length;
-
-       switch (c) {
-       case NFLOG_GROUP:
-               if (*flags & NFLOG_GROUP)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Can't specify --nflog-group twice");
-               if (xtables_check_inverse(optarg, &invert, NULL, 0, argv))
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Unexpected `!' after --nflog-group");
-
-               n = atoi(optarg);
-               if (n < 0)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "--nflog-group can not be negative");
-               info->group = n;
-               break;
-       case NFLOG_PREFIX:
-               if (*flags & NFLOG_PREFIX)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Can't specify --nflog-prefix twice");
-               if (xtables_check_inverse(optarg, &invert, NULL, 0, argv))
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Unexpected `!' after --nflog-prefix");
-
-               length = strlen(optarg);
-               if (length == 0)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "No prefix specified for --nflog-prefix");
-               if (length >= sizeof(info->prefix))
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "--nflog-prefix too long, max %Zu characters",
-                                  sizeof(info->prefix) - 1);
-               if (length != strlen(strtok(optarg, "\n")))
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Newlines are not allowed in --nflog-prefix");
-               strcpy(info->prefix, optarg);
-               break;
-       case NFLOG_RANGE:
-               if (*flags & NFLOG_RANGE)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Can't specify --nflog-range twice");
-               n = atoi(optarg);
-               if (n < 0)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Invalid --nflog-range, must be >= 0");
-               info->len = n;
-               break;
-       case NFLOG_THRESHOLD:
-               if (*flags & NFLOG_THRESHOLD)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Can't specify --nflog-threshold twice");
-               n = atoi(optarg);
-               if (n < 1)
+       xtables_option_parse(cb);
+       switch (cb->entry->id) {
+       case O_PREFIX:
+               if (strchr(cb->arg, '\n') != NULL)
                        xtables_error(PARAMETER_PROBLEM,
-                                  "Invalid --nflog-threshold, must be >= 1");
-               info->threshold = n;
+                                  "Newlines not allowed in --log-prefix");
                break;
        }
-       *flags |= c;
-       return 1;
 }
 
 static void nflog_print(const struct xt_nflog_info *info, char *prefix)
@@ -144,10 +94,10 @@ static struct xtables_target nflog_target = {
        .userspacesize  = XT_ALIGN(sizeof(struct xt_nflog_info)),
        .help           = NFLOG_help,
        .init           = NFLOG_init,
-       .parse          = NFLOG_parse,
+       .x6_parse       = NFLOG_parse,
        .print          = NFLOG_print,
        .save           = NFLOG_save,
-       .extra_opts     = NFLOG_opts,
+       .x6_options     = NFLOG_opts,
 };
 
 void _init(void)