- mv ip*_main into ip.c; use a dispatcher to save on needless duplication.
[oweals/busybox.git] / networking / ip.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * ip.c         "ip" utility frontend.
4  *
5  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
6  *
7  * Authors:     Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
8  *
9  *
10  * Changes:
11  *
12  * Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses
13  * Bernhard Fischer rewrote to use index_in_substr_array
14  */
15
16 #include "busybox.h"
17
18 #include "libiproute/utils.h"
19 #include "libiproute/ip_common.h"
20
21 static int ATTRIBUTE_NORETURN ip_print_help(int ATTRIBUTE_UNUSED ac, char ATTRIBUTE_UNUSED **av)
22 {
23         bb_show_usage();
24 }
25
26 static int (*ip_func)(int argc, char **argv) = ip_print_help;
27
28 static int ip_do(int argc, char **argv)
29 {
30         ip_parse_common_args(&argc, &argv);
31         return ip_func(argc-1, argv+1);
32 }
33
34 #if ENABLE_FEATURE_IP_ADDRESS
35 int ipaddr_main(int argc, char **argv);
36 int ipaddr_main(int argc, char **argv)
37 {
38     ip_func = do_ipaddr;
39     return ip_do(argc, argv);
40 }
41 #endif
42 #if ENABLE_FEATURE_IP_LINK
43 int iplink_main(int argc, char **argv);
44 int iplink_main(int argc, char **argv)
45 {
46     ip_func = do_iplink;
47     return ip_do(argc, argv);
48 }
49 #endif
50 #if ENABLE_FEATURE_IP_ROUTE
51 int iproute_main(int argc, char **argv);
52 int iproute_main(int argc, char **argv)
53 {
54     ip_func = do_iproute;
55     return ip_do(argc, argv);
56 }
57 #endif
58 #if ENABLE_FEATURE_IP_RULE
59 int iprule_main(int argc, char **argv);
60 int iprule_main(int argc, char **argv)
61 {
62     ip_func = do_iprule;
63     return ip_do(argc, argv);
64 }
65 #endif
66 #if ENABLE_FEATURE_IP_TUNNEL
67 int iptunnel_main(int argc, char **argv);
68 int iptunnel_main(int argc, char **argv)
69 {
70     ip_func = do_iptunnel;
71     return ip_do(argc, argv);
72 }
73 #endif
74
75
76 int ip_main(int argc, char **argv);
77 int ip_main(int argc, char **argv)
78 {
79         const char * const keywords[] = {
80                 USE_FEATURE_IP_ADDRESS("address",)
81                 USE_FEATURE_IP_ROUTE("route",)
82                 USE_FEATURE_IP_LINK("link",)
83                 USE_FEATURE_IP_TUNNEL("tunnel", "tunl",)
84                 USE_FEATURE_IP_RULE("rule",)
85                 NULL
86         };
87         enum {
88                 USE_FEATURE_IP_ADDRESS(IP_addr,)
89                 USE_FEATURE_IP_ROUTE(IP_route,)
90                 USE_FEATURE_IP_LINK(IP_link,)
91                 USE_FEATURE_IP_TUNNEL(IP_tunnel, IP_tunl,)
92                 USE_FEATURE_IP_RULE(IP_rule,)
93                 IP_none
94         };
95
96         ip_parse_common_args(&argc, &argv);
97         if (argc > 1) {
98                 int key = index_in_substr_array(keywords, argv[1]);
99                 argc -= 2;
100                 argv += 2;
101 #if ENABLE_FEATURE_IP_ADDRESS
102                 if (key == IP_addr)
103                         ip_func = do_ipaddr;
104 #endif
105 #if ENABLE_FEATURE_IP_ROUTE
106                 if (key == IP_route)
107                         ip_func = do_iproute;
108 #endif
109 #if ENABLE_FEATURE_IP_LINK
110                 if (key == IP_link)
111                         ip_func = do_iplink;
112 #endif
113 #if ENABLE_FEATURE_IP_TUNNEL
114                 if (key == IP_tunnel || key == IP_tunl)
115                         ip_func = do_iptunnel;
116 #endif
117 #if ENABLE_FEATURE_IP_RULE
118                 if (key == IP_rule)
119                         ip_func = do_iprule;
120 #endif
121         }
122         return (ip_func(argc, argv));
123 }