1
2
3
4
5
6
7
8
9
10
11
12
13
14#include "ip_common.h"
15#include "utils.h"
16
17family_t preferred_family = AF_UNSPEC;
18smallint oneline;
19char _SL_;
20
21char** FAST_FUNC ip_parse_common_args(char **argv)
22{
23 static const char ip_common_commands[] ALIGN1 =
24 "oneline" "\0"
25 "family" "\0"
26 "4" "\0"
27 "6" "\0"
28 "0" "\0"
29 ;
30 enum {
31 ARG_oneline,
32 ARG_family,
33 ARG_IPv4,
34 ARG_IPv6,
35 ARG_packet,
36 };
37 static const family_t af_numbers[] = { AF_INET, AF_INET6, AF_PACKET };
38 int arg;
39
40 while (*argv) {
41 char *opt = *argv;
42
43 if (opt[0] != '-')
44 break;
45 opt++;
46 if (opt[0] == '-') {
47 opt++;
48 if (!opt[0]) {
49 argv++;
50 break;
51 }
52 }
53 arg = index_in_substrings(ip_common_commands, opt);
54 if (arg < 0)
55 bb_show_usage();
56 if (arg == ARG_oneline) {
57 oneline = 1;
58 argv++;
59 continue;
60 }
61 if (arg == ARG_family) {
62 static const char families[] ALIGN1 =
63 "inet" "\0" "inet6" "\0" "link" "\0";
64 argv++;
65 if (!*argv)
66 bb_show_usage();
67 arg = index_in_strings(families, *argv);
68 if (arg < 0)
69 invarg_1_to_2(*argv, "family");
70
71 } else {
72 arg -= ARG_IPv4;
73
74 }
75 preferred_family = af_numbers[arg];
76 argv++;
77 }
78 _SL_ = oneline ? '\\' : '\n';
79 return argv;
80}
81