From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- .../networking/libiproute/ip_parse_common_args.c | 98 ++++++++++++---------- 1 file changed, 54 insertions(+), 44 deletions(-) (limited to 'release/src/router/busybox/networking/libiproute/ip_parse_common_args.c') diff --git a/release/src/router/busybox/networking/libiproute/ip_parse_common_args.c b/release/src/router/busybox/networking/libiproute/ip_parse_common_args.c index 21e9f74b..5e4012b8 100644 --- a/release/src/router/busybox/networking/libiproute/ip_parse_common_args.c +++ b/release/src/router/busybox/networking/libiproute/ip_parse_common_args.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * ip.c "ip" utility frontend. * @@ -14,61 +15,70 @@ * Rani Assaf 980929: resolve addresses */ -#include - +#include "ip_common.h" /* #include "libbb.h" is inside */ #include "utils.h" -#include "ip_common.h" - -#include "busybox.h" -int preferred_family = AF_UNSPEC; -int oneline = 0; -char * _SL_ = NULL; +family_t preferred_family = AF_UNSPEC; +smallint oneline; +char _SL_; -void ip_parse_common_args(int *argcp, char ***argvp) +char **ip_parse_common_args(char **argv) { - int argc = *argcp; - char **argv = *argvp; - - while (argc > 1) { - char *opt = argv[1]; + static const char ip_common_commands[] ALIGN1 = + "oneline" "\0" + "family" "\0" + "4" "\0" + "6" "\0" + "0" "\0" + ; + enum { + ARG_oneline, + ARG_family, + ARG_IPv4, + ARG_IPv6, + ARG_packet, + }; + static const family_t af_numbers[] = { AF_INET, AF_INET6, AF_PACKET }; + int arg; - if (strcmp(opt,"--") == 0) { - argc--; argv++; - break; - } + while (*argv) { + char *opt = *argv; if (opt[0] != '-') break; - - if (opt[1] == '-') + opt++; + if (opt[0] == '-') { opt++; - - if (matches(opt, "-family") == 0) { - argc--; + if (!opt[0]) { /* "--" */ + argv++; + break; + } + } + arg = index_in_substrings(ip_common_commands, opt); + if (arg < 0) + bb_show_usage(); + if (arg == ARG_oneline) { + oneline = 1; argv++; - if (! argv[1]) - bb_show_usage(); - if (strcmp(argv[1], "inet") == 0) - preferred_family = AF_INET; - else if (strcmp(argv[1], "inet6") == 0) - preferred_family = AF_INET6; - else if (strcmp(argv[1], "link") == 0) - preferred_family = AF_PACKET; - else - invarg(argv[1], "invalid protocol family"); - } else if (strcmp(opt, "-4") == 0) { - preferred_family = AF_INET; - } else if (strcmp(opt, "-6") == 0) { - preferred_family = AF_INET6; - } else if (strcmp(opt, "-0") == 0) { - preferred_family = AF_PACKET; - } else if (matches(opt, "-oneline") == 0) { - ++oneline; + continue; + } + if (arg == ARG_family) { + static const char families[] ALIGN1 = + "inet" "\0" "inet6" "\0" "link" "\0"; + argv++; + if (!*argv) + bb_show_usage(); + arg = index_in_strings(families, *argv); + if (arg < 0) + invarg(*argv, "protocol family"); + /* now arg == 0, 1 or 2 */ } else { - bb_show_usage(); + arg -= ARG_IPv4; + /* now arg == 0, 1 or 2 */ } - argc--; argv++; + preferred_family = af_numbers[arg]; + argv++; } - _SL_ = oneline ? "\\" : "\n" ; + _SL_ = oneline ? '\\' : '\n'; + return argv; } -- cgit v1.2.3-54-g00ecf