libiproute: code shrink by adding FAST_FUNC
[oweals/busybox.git] / networking / ip.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * "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  * Changes:
10  * Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses
11  * Bernhard Reutner-Fischer rewrote to use index_in_substr_array
12  */
13
14 #include "libbb.h"
15
16 #include "libiproute/utils.h"
17 #include "libiproute/ip_common.h"
18
19 #if ENABLE_FEATURE_IP_ADDRESS \
20  || ENABLE_FEATURE_IP_ROUTE \
21  || ENABLE_FEATURE_IP_LINK \
22  || ENABLE_FEATURE_IP_TUNNEL \
23  || ENABLE_FEATURE_IP_RULE
24
25 static int FAST_FUNC ip_print_help(char **argv UNUSED_PARAM)
26 {
27         bb_show_usage();
28 }
29
30 typedef int FAST_FUNC (*ip_func_ptr_t)(char**);
31
32 static int ip_do(ip_func_ptr_t ip_func, char **argv)
33 {
34         argv = ip_parse_common_args(argv + 1);
35         return ip_func(argv);
36 }
37
38 #if ENABLE_FEATURE_IP_ADDRESS
39 int ipaddr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
40 int ipaddr_main(int argc UNUSED_PARAM, char **argv)
41 {
42         return ip_do(do_ipaddr, argv);
43 }
44 #endif
45 #if ENABLE_FEATURE_IP_LINK
46 int iplink_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
47 int iplink_main(int argc UNUSED_PARAM, char **argv)
48 {
49         return ip_do(do_iplink, argv);
50 }
51 #endif
52 #if ENABLE_FEATURE_IP_ROUTE
53 int iproute_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
54 int iproute_main(int argc UNUSED_PARAM, char **argv)
55 {
56         return ip_do(do_iproute, argv);
57 }
58 #endif
59 #if ENABLE_FEATURE_IP_RULE
60 int iprule_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
61 int iprule_main(int argc UNUSED_PARAM, char **argv)
62 {
63         return ip_do(do_iprule, argv);
64 }
65 #endif
66 #if ENABLE_FEATURE_IP_TUNNEL
67 int iptunnel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
68 int iptunnel_main(int argc UNUSED_PARAM, char **argv)
69 {
70         return ip_do(do_iptunnel, argv);
71 }
72 #endif
73
74
75 int ip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
76 int ip_main(int argc UNUSED_PARAM, char **argv)
77 {
78         static const char keywords[] ALIGN1 =
79                 IF_FEATURE_IP_ADDRESS("address\0")
80                 IF_FEATURE_IP_ROUTE("route\0")
81                 IF_FEATURE_IP_ROUTE("r\0")
82                 IF_FEATURE_IP_LINK("link\0")
83                 IF_FEATURE_IP_TUNNEL("tunnel\0")
84                 IF_FEATURE_IP_TUNNEL("tunl\0")
85                 IF_FEATURE_IP_RULE("rule\0")
86                 ;
87         static const ip_func_ptr_t ip_func_ptrs[] = {
88                 ip_print_help,
89                 IF_FEATURE_IP_ADDRESS(do_ipaddr,)
90                 IF_FEATURE_IP_ROUTE(do_iproute,)
91                 IF_FEATURE_IP_ROUTE(do_iproute,)
92                 IF_FEATURE_IP_LINK(do_iplink,)
93                 IF_FEATURE_IP_TUNNEL(do_iptunnel,)
94                 IF_FEATURE_IP_TUNNEL(do_iptunnel,)
95                 IF_FEATURE_IP_RULE(do_iprule,)
96         };
97         ip_func_ptr_t ip_func;
98         int key;
99
100         argv = ip_parse_common_args(argv + 1);
101         key = *argv ? index_in_substrings(keywords, *argv++) : -1;
102         ip_func = ip_func_ptrs[key + 1];
103
104         return ip_func(argv);
105 }
106
107 #endif /* any of ENABLE_FEATURE_IP_xxx is 1 */