diff options
Diffstat (limited to 'networking/libiproute/ip_parse_common_args.c')
-rw-r--r-- | networking/libiproute/ip_parse_common_args.c | 84 |
1 files changed, 40 insertions, 44 deletions
diff --git a/networking/libiproute/ip_parse_common_args.c b/networking/libiproute/ip_parse_common_args.c index ff333993f..294bde540 100644 --- a/networking/libiproute/ip_parse_common_args.c +++ b/networking/libiproute/ip_parse_common_args.c @@ -18,71 +18,67 @@ #include "ip_common.h" /* #include "libbb.h" is inside */ #include "utils.h" -int preferred_family = AF_UNSPEC; +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; static const char ip_common_commands[] ALIGN1 = - "-family\0""inet\0""inet6\0""link\0" - "-4\0""-6\0""-0\0""-oneline\0"; + "oneline" "\0" + "family" "\0" + "4" "\0" + "6" "\0" + "0" "\0" + ; enum { - ARG_family = 1, - ARG_inet, - ARG_inet6, - ARG_link, + ARG_oneline, + ARG_family, ARG_IPv4, ARG_IPv6, ARG_packet, - ARG_oneline }; - smalluint arg; + static const family_t af_numbers[] = { AF_INET, AF_INET6, AF_PACKET }; + int arg; - while (argc > 1) { - char *opt = argv[1]; + while (*argv) { + char *opt = *argv; - if (strcmp(opt,"--") == 0) { - argc--; - argv++; - break; - } if (opt[0] != '-') break; - if (opt[1] == '-') + opt++; + if (opt[0] == '-') { opt++; - arg = index_in_strings(ip_common_commands, opt) + 1; + if (!opt[0]) { /* "--" */ + argv++; + break; + } + } + arg = index_in_strings(ip_common_commands, opt); + if (arg < 0) + bb_show_usage(); + if (arg == ARG_oneline) { + oneline = 1; + argv++; + continue; + } if (arg == ARG_family) { - argc--; + static const char families[] ALIGN1 = + "inet" "\0" "inet6" "\0" "link" "\0"; argv++; - if (!argv[1]) + if (!*argv) bb_show_usage(); - arg = index_in_strings(ip_common_commands, argv[1]) + 1; - if (arg == ARG_inet) - preferred_family = AF_INET; - else if (arg == ARG_inet6) - preferred_family = AF_INET6; - else if (arg == ARG_link) - preferred_family = AF_PACKET; - else - invarg(argv[1], "protocol family"); - } else if (arg == ARG_IPv4) { - preferred_family = AF_INET; - } else if (arg == ARG_IPv6) { - preferred_family = AF_INET6; - } else if (arg == ARG_packet) { - preferred_family = AF_PACKET; - } else if (arg == ARG_oneline) { - ++oneline; + 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--; + preferred_family = af_numbers[arg]; argv++; } _SL_ = oneline ? '\\' : '\n'; - *argcp = argc; - *argvp = argv; + return argv; } |