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
25static int ip_print_help(char **argv UNUSED_PARAM)
26{
27	bb_show_usage();
28}
29
30typedef int (*ip_func_ptr_t)(char**);
31
32static 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
39int ipaddr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
40int 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
46int iplink_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
47int 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
53int iproute_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
54int 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
60int iprule_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
61int 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
67int iptunnel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
68int iptunnel_main(int argc UNUSED_PARAM, char **argv)
69{
70	return ip_do(do_iptunnel, argv);
71}
72#endif
73
74
75int ip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
76int 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 */
108