diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2017-03-16 16:55:01 +0900 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2017-03-17 14:20:46 +0100 |
commit | 6e2e169eb66b63d2991e1c7ada931e3cdb0ced32 (patch) | |
tree | 2d30c42e08c94f7681a88d316fdbba9a1ed24dbc /iptables/xshared.c | |
parent | 836846f0d747e1be8e37d2d43b215a68b30ea1a9 (diff) |
iptables: remove duplicated argument parsing code
1. Factor out repeated code to a new xs_has_arg function.
2. Add a new parse_wait_time option to parse the value of -w.
3. Make parse_wait_interval take argc and argv so its callers
can be simpler.
Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'iptables/xshared.c')
-rw-r--r-- | iptables/xshared.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/iptables/xshared.c b/iptables/xshared.c index 9b8e856e..06147d18 100644 --- a/iptables/xshared.c +++ b/iptables/xshared.c @@ -285,12 +285,36 @@ bool xtables_lock(int wait, struct timeval *wait_interval) } } -void parse_wait_interval(const char *str, struct timeval *wait_interval) +int parse_wait_time(int argc, char *argv[]) { + int wait = -1; + + if (optarg) { + if (sscanf(optarg, "%i", &wait) != 1) + xtables_error(PARAMETER_PROBLEM, + "wait seconds not numeric"); + } else if (xs_has_arg(argc, argv)) + if (sscanf(argv[optind++], "%i", &wait) != 1) + xtables_error(PARAMETER_PROBLEM, + "wait seconds not numeric"); + + return wait; +} + +void parse_wait_interval(int argc, char *argv[], struct timeval *wait_interval) +{ + const char *arg; unsigned int usec; int ret; - ret = sscanf(str, "%u", &usec); + if (optarg) + arg = optarg; + else if (xs_has_arg(argc, argv)) + arg = argv[optind++]; + else + return; + + ret = sscanf(arg, "%u", &usec); if (ret == 1) { if (usec > 999999) xtables_error(PARAMETER_PROBLEM, @@ -303,3 +327,10 @@ void parse_wait_interval(const char *str, struct timeval *wait_interval) } xtables_error(PARAMETER_PROBLEM, "wait interval not numeric"); } + +inline bool xs_has_arg(int argc, char *argv[]) +{ + return optind < argc && + argv[optind][0] != '-' && + argv[optind][0] != '!'; +} |