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 "libbb.h"
17
18#include "libiproute/utils.h"
19#include "libiproute/ip_common.h"
20
21#if ENABLE_FEATURE_IP_ADDRESS || ENABLE_FEATURE_IP_ROUTE || ENABLE_FEATURE_IP_LINK || \
22	ENABLE_FEATURE_IP_TUNNEL || ENABLE_FEATURE_IP_RULE
23
24static int ATTRIBUTE_NORETURN ip_print_help(int ATTRIBUTE_UNUSED ac, char ATTRIBUTE_UNUSED **av)
25{
26	bb_show_usage();
27}
28
29static int (*ip_func)(int argc, char **argv) = ip_print_help;
30
31static int ip_do(int argc, char **argv)
32{
33	ip_parse_common_args(&argc, &argv);
34	return ip_func(argc-1, argv+1);
35}
36
37#if ENABLE_FEATURE_IP_ADDRESS
38int ipaddr_main(int argc, char **argv);
39int ipaddr_main(int argc, char **argv)
40{
41    ip_func = do_ipaddr;
42    return ip_do(argc, argv);
43}
44#endif
45#if ENABLE_FEATURE_IP_LINK
46int iplink_main(int argc, char **argv);
47int iplink_main(int argc, char **argv)
48{
49    ip_func = do_iplink;
50    return ip_do(argc, argv);
51}
52#endif
53#if ENABLE_FEATURE_IP_ROUTE
54int iproute_main(int argc, char **argv);
55int iproute_main(int argc, char **argv)
56{
57    ip_func = do_iproute;
58    return ip_do(argc, argv);
59}
60#endif
61#if ENABLE_FEATURE_IP_RULE
62int iprule_main(int argc, char **argv);
63int iprule_main(int argc, char **argv)
64{
65    ip_func = do_iprule;
66    return ip_do(argc, argv);
67}
68#endif
69#if ENABLE_FEATURE_IP_TUNNEL
70int iptunnel_main(int argc, char **argv);
71int iptunnel_main(int argc, char **argv)
72{
73    ip_func = do_iptunnel;
74    return ip_do(argc, argv);
75}
76#endif
77
78
79int ip_main(int argc, char **argv);
80int ip_main(int argc, char **argv)
81{
82	static const char keywords[] ALIGN1 =
83		USE_FEATURE_IP_ADDRESS("address\0")
84		USE_FEATURE_IP_ROUTE("route\0")
85		USE_FEATURE_IP_LINK("link\0")
86		USE_FEATURE_IP_TUNNEL("tunnel\0" "tunl\0")
87		USE_FEATURE_IP_RULE("rule\0")
88		;
89	enum {
90		USE_FEATURE_IP_ADDRESS(IP_addr,)
91		USE_FEATURE_IP_ROUTE(IP_route,)
92		USE_FEATURE_IP_LINK(IP_link,)
93		USE_FEATURE_IP_TUNNEL(IP_tunnel, IP_tunl,)
94		USE_FEATURE_IP_RULE(IP_rule,)
95		IP_none
96	};
97
98	ip_parse_common_args(&argc, &argv);
99	if (argc > 1) {
100		int key = index_in_substrings(keywords, argv[1]);
101		argc -= 2;
102		argv += 2;
103#if ENABLE_FEATURE_IP_ADDRESS
104		if (key == IP_addr)
105			ip_func = do_ipaddr;
106#endif
107#if ENABLE_FEATURE_IP_ROUTE
108		if (key == IP_route)
109			ip_func = do_iproute;
110#endif
111#if ENABLE_FEATURE_IP_LINK
112		if (key == IP_link)
113			ip_func = do_iplink;
114#endif
115#if ENABLE_FEATURE_IP_TUNNEL
116		if (key == IP_tunnel || key == IP_tunl)
117			ip_func = do_iptunnel;
118#endif
119#if ENABLE_FEATURE_IP_RULE
120		if (key == IP_rule)
121			ip_func = do_iprule;
122#endif
123	}
124	return ip_func(argc, argv);
125}
126
127#endif /* any of ENABLE_FEATURE_IP_xxx is 1 */
128