diff options
-rw-r--r-- | networking/libiproute/ip_parse_common_args.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/networking/libiproute/ip_parse_common_args.c b/networking/libiproute/ip_parse_common_args.c index cea5b4753..3606d3877 100644 --- a/networking/libiproute/ip_parse_common_args.c +++ b/networking/libiproute/ip_parse_common_args.c | |||
@@ -26,6 +26,20 @@ void ip_parse_common_args(int *argcp, char ***argvp) | |||
26 | { | 26 | { |
27 | int argc = *argcp; | 27 | int argc = *argcp; |
28 | char **argv = *argvp; | 28 | char **argv = *argvp; |
29 | static const char * const ip_common_commands[] = | ||
30 | {"-family", "inet", "inet6", "link", | ||
31 | "-4", "-6", "-0", "-oneline", 0}; | ||
32 | enum { | ||
33 | ARG_family, | ||
34 | ARG_inet, | ||
35 | ARG_inet6, | ||
36 | ARG_link, | ||
37 | ARG_IPv4, | ||
38 | ARG_IPv6, | ||
39 | ARG_packet, | ||
40 | ARG_oneline | ||
41 | }; | ||
42 | smalluint arg; | ||
29 | 43 | ||
30 | while (argc > 1) { | 44 | while (argc > 1) { |
31 | char *opt = argv[1]; | 45 | char *opt = argv[1]; |
@@ -35,33 +49,32 @@ void ip_parse_common_args(int *argcp, char ***argvp) | |||
35 | argv++; | 49 | argv++; |
36 | break; | 50 | break; |
37 | } | 51 | } |
38 | |||
39 | if (opt[0] != '-') | 52 | if (opt[0] != '-') |
40 | break; | 53 | break; |
41 | |||
42 | if (opt[1] == '-') | 54 | if (opt[1] == '-') |
43 | opt++; | 55 | opt++; |
44 | 56 | arg = index_in_str_array(ip_common_commands, opt) + 1; | |
45 | if (matches(opt, "-family") == 0) { | 57 | if (arg == ARG_family) { |
46 | argc--; | 58 | argc--; |
47 | argv++; | 59 | argv++; |
48 | if (!argv[1]) | 60 | if (!argv[1]) |
49 | bb_show_usage(); | 61 | bb_show_usage(); |
50 | if (strcmp(argv[1], "inet") == 0) | 62 | arg = index_in_str_array(ip_common_commands, argv[1]) + 1; |
63 | if (arg == ARG_inet) | ||
51 | preferred_family = AF_INET; | 64 | preferred_family = AF_INET; |
52 | else if (strcmp(argv[1], "inet6") == 0) | 65 | else if (arg == ARG_inet6) |
53 | preferred_family = AF_INET6; | 66 | preferred_family = AF_INET6; |
54 | else if (strcmp(argv[1], "link") == 0) | 67 | else if (arg == ARG_link) |
55 | preferred_family = AF_PACKET; | 68 | preferred_family = AF_PACKET; |
56 | else | 69 | else |
57 | invarg(argv[1], "protocol family"); | 70 | invarg(argv[1], "protocol family"); |
58 | } else if (strcmp(opt, "-4") == 0) { | 71 | } else if (arg == ARG_IPv4) { |
59 | preferred_family = AF_INET; | 72 | preferred_family = AF_INET; |
60 | } else if (strcmp(opt, "-6") == 0) { | 73 | } else if (arg == ARG_IPv6) { |
61 | preferred_family = AF_INET6; | 74 | preferred_family = AF_INET6; |
62 | } else if (strcmp(opt, "-0") == 0) { | 75 | } else if (arg == ARG_packet) { |
63 | preferred_family = AF_PACKET; | 76 | preferred_family = AF_PACKET; |
64 | } else if (matches(opt, "-oneline") == 0) { | 77 | } else if (arg == ARG_oneline) { |
65 | ++oneline; | 78 | ++oneline; |
66 | } else { | 79 | } else { |
67 | bb_show_usage(); | 80 | bb_show_usage(); |