]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
libxt_time: use guided option parser
authorJan Engelhardt <jengelh@medozas.de>
Wed, 2 Mar 2011 22:03:36 +0000 (23:03 +0100)
committerJan Engelhardt <jengelh@medozas.de>
Wed, 6 Apr 2011 11:13:01 +0000 (13:13 +0200)
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
extensions/libxt_time.c

index 56fb135aec3cded7a18dae73cc81faa29a1208f2..b538476c0d761623605d17b4492206ac0a67858d 100644 (file)
@@ -9,45 +9,41 @@
  *
  *     Based on libipt_time.c.
  */
-#include <sys/types.h>
-#include <getopt.h>
-#include <stdbool.h>
-#include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
-#include <stddef.h>
 #include <time.h>
-#include <limits.h>
-
 #include <linux/types.h>
 #include <linux/netfilter/xt_time.h>
 #include <xtables.h>
 
-enum { /* getopt "seen" bits */
-       F_DATE_START = 1 << 0,
-       F_DATE_STOP  = 1 << 1,
-       F_TIME_START = 1 << 2,
-       F_TIME_STOP  = 1 << 3,
-       F_MONTHDAYS  = 1 << 4,
-       F_WEEKDAYS   = 1 << 5,
-       F_TIMEZONE   = 1 << 6,
+enum {
+       O_DATE_START = 0,
+       O_DATE_STOP,
+       O_TIME_START,
+       O_TIME_STOP,
+       O_MONTHDAYS,
+       O_WEEKDAYS,
+       O_LOCAL_TZ,
+       O_UTC,
 };
 
 static const char *const week_days[] = {
        NULL, "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",
 };
 
-static const struct option time_opts[] = {
-       {.name = "datestart", .has_arg = true,  .val = 'D'},
-       {.name = "datestop",  .has_arg = true,  .val = 'E'},
-       {.name = "timestart", .has_arg = true,  .val = 'X'},
-       {.name = "timestop",  .has_arg = true,  .val = 'Y'},
-       {.name = "weekdays",  .has_arg = true,  .val = 'w'},
-       {.name = "monthdays", .has_arg = true,  .val = 'm'},
-       {.name = "localtz",   .has_arg = false, .val = 'l'},
-       {.name = "utc",       .has_arg = false, .val = 'u'},
-       XT_GETOPT_TABLEEND,
+static const struct xt_option_entry time_opts[] = {
+       {.name = "datestart", .id = O_DATE_START, .type = XTTYPE_STRING},
+       {.name = "datestop", .id = O_DATE_STOP, .type = XTTYPE_STRING},
+       {.name = "timestart", .id = O_TIME_START, .type = XTTYPE_STRING},
+       {.name = "timestop", .id = O_TIME_STOP, .type = XTTYPE_STRING},
+       {.name = "weekdays", .id = O_WEEKDAYS, .type = XTTYPE_STRING,
+        .flags = XTOPT_INVERT},
+       {.name = "monthdays", .id = O_MONTHDAYS, .type = XTTYPE_STRING,
+        .flags = XTOPT_INVERT},
+       {.name = "localtz", .id = O_LOCAL_TZ, .type = XTTYPE_NONE},
+       {.name = "utc", .id = O_UTC, .type = XTTYPE_NONE},
+       XTOPT_TABLEEND,
 };
 
 static void time_help(void)
@@ -248,86 +244,41 @@ static unsigned int time_parse_weekdays(const char *arg)
        return ret;
 }
 
-static int time_parse(int c, char **argv, int invert, unsigned int *flags,
-                      const void *entry, struct xt_entry_match **match)
+static void time_parse(struct xt_option_call *cb)
 {
-       struct xt_time_info *info = (void *)(*match)->data;
-
-       switch (c) {
-       case 'D': /* --datestart */
-               if (*flags & F_DATE_START)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Cannot specify --datestart twice");
-               if (invert)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Unexpected \"!\" with --datestart");
-               info->date_start = time_parse_date(optarg, false);
-               *flags |= F_DATE_START;
-               return 1;
-       case 'E': /* --datestop */
-               if (*flags & F_DATE_STOP)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Cannot specify --datestop more than once");
-               if (invert)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "unexpected \"!\" with --datestop");
-               info->date_stop = time_parse_date(optarg, true);
-               *flags |= F_DATE_STOP;
-               return 1;
-       case 'X': /* --timestart */
-               if (*flags & F_TIME_START)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Cannot specify --timestart more than once");
-               if (invert)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Unexpected \"!\" with --timestart");
-               info->daytime_start = time_parse_minutes(optarg);
-               *flags |= F_TIME_START;
-               return 1;
-       case 'Y': /* --timestop */
-               if (*flags & F_TIME_STOP)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Cannot specify --timestop more than once");
-               if (invert)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Unexpected \"!\" with --timestop");
-               info->daytime_stop = time_parse_minutes(optarg);
-               *flags |= F_TIME_STOP;
-               return 1;
-       case 'l': /* --localtz */
-               if (*flags & F_TIMEZONE)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Can only specify exactly one of --localtz or --utc");
+       struct xt_time_info *info = cb->data;
+
+       xtables_option_parse(cb);
+       switch (cb->entry->id) {
+       case O_DATE_START:
+               info->date_start = time_parse_date(cb->arg, false);
+               break;
+       case O_DATE_STOP:
+               info->date_stop = time_parse_date(cb->arg, true);
+               break;
+       case O_TIME_START:
+               info->daytime_start = time_parse_minutes(cb->arg);
+               break;
+       case O_TIME_STOP:
+               info->daytime_stop = time_parse_minutes(cb->arg);
+               break;
+       case O_LOCAL_TZ:
                info->flags |= XT_TIME_LOCAL_TZ;
-               *flags |= F_TIMEZONE;
-               return 1;
-       case 'm': /* --monthdays */
-               if (*flags & F_MONTHDAYS)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Cannot specify --monthdays more than once");
-               info->monthdays_match = time_parse_monthdays(optarg);
-               if (invert)
+               break;
+       case O_MONTHDAYS:
+               info->monthdays_match = time_parse_monthdays(cb->arg);
+               if (cb->invert)
                        info->monthdays_match ^= XT_TIME_ALL_MONTHDAYS;
-               *flags |= F_MONTHDAYS;
-               return 1;
-       case 'w': /* --weekdays */
-               if (*flags & F_WEEKDAYS)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Cannot specify --weekdays more than once");
-               info->weekdays_match = time_parse_weekdays(optarg);
-               if (invert)
+               break;
+       case O_WEEKDAYS:
+               info->weekdays_match = time_parse_weekdays(cb->arg);
+               if (cb->invert)
                        info->weekdays_match ^= XT_TIME_ALL_WEEKDAYS;
-               *flags |= F_WEEKDAYS;
-               return 1;
-       case 'u': /* --utc */
-               if (*flags & F_TIMEZONE)
-                       xtables_error(PARAMETER_PROBLEM,
-                                  "Can only specify exactly one of --localtz or --utc");
+               break;
+       case O_UTC:
                info->flags &= ~XT_TIME_LOCAL_TZ;
-               *flags |= F_TIMEZONE;
-               return 1;
+               break;
        }
-       return 0;
 }
 
 static void time_print_date(time_t date, const char *command)
@@ -474,10 +425,10 @@ static struct xtables_match time_match = {
        .userspacesize = XT_ALIGN(sizeof(struct xt_time_info)),
        .help          = time_help,
        .init          = time_init,
-       .parse         = time_parse,
        .print         = time_print,
        .save          = time_save,
-       .extra_opts    = time_opts,
+       .x6_parse      = time_parse,
+       .x6_options    = time_opts,
 };
 
 void _init(void)