summaryrefslogtreecommitdiff
path: root/networking/libiproute/iproute.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/libiproute/iproute.c')
-rw-r--r--networking/libiproute/iproute.c93
1 files changed, 46 insertions, 47 deletions
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index 75e5293..0d171c7 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -294,6 +294,25 @@ static int print_route(struct sockaddr_nl *who ATTRIBUTE_UNUSED,
/* Return value becomes exitcode. It's okay to not return at all */
static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
{
+ static const char keywords[] =
+ "src\0""via\0""mtu\0""lock\0""protocol\0"USE_FEATURE_IP_RULE("table\0")
+ "dev\0""oif\0""to\0";
+ enum {
+ ARG_src,
+ ARG_via,
+ ARG_mtu, PARM_lock,
+ ARG_protocol,
+USE_FEATURE_IP_RULE(ARG_table,)
+ ARG_dev,
+ ARG_oif,
+ ARG_to
+ };
+ enum {
+ gw_ok = 1 << 0,
+ dst_ok = 1 << 1,
+ proto_ok = 1 << 2,
+ type_ok = 1 << 3
+ };
struct rtnl_handle rth;
struct {
struct nlmsghdr n;
@@ -304,22 +323,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
struct rtattr * mxrta = (void*)mxbuf;
unsigned mxlock = 0;
char *d = NULL;
- enum { gw_ok = 1<<0, dst_ok = 1<<1, proto_ok = 1<<2, type_ok = 1<<3};
smalluint ok = 0;
- static const char * const keywords[] = {
- "src", "via", "mtu", "lock", "protocol", USE_FEATURE_IP_RULE("table",)
- "dev", "oif", "to", NULL
- };
- enum {
- ARG_src,
- ARG_via,
- ARG_mtu, PARM_lock,
- ARG_protocol,
-USE_FEATURE_IP_RULE(ARG_table,)
- ARG_dev,
- ARG_oif,
- ARG_to
- };
int arg;
memset(&req, 0, sizeof(req));
@@ -341,7 +345,7 @@ USE_FEATURE_IP_RULE(ARG_table,)
mxrta->rta_len = RTA_LENGTH(0);
while (argc > 0) {
- arg = index_in_substr_array(keywords, *argv);
+ arg = index_in_substrings(keywords, *argv);
if (arg == ARG_src) {
inet_prefix addr;
NEXT_ARG();
@@ -361,7 +365,7 @@ USE_FEATURE_IP_RULE(ARG_table,)
} else if (arg == ARG_mtu) {
unsigned mtu;
NEXT_ARG();
- if (index_in_str_array(keywords, *argv) == PARM_lock) {
+ if (index_in_strings(keywords, *argv) == PARM_lock) {
mxlock |= (1<<RTAX_MTU);
NEXT_ARG();
}
@@ -513,10 +517,9 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
struct rtnl_handle rth;
char *id = NULL;
char *od = NULL;
- static const char * const keywords[] = {
- "protocol", "all", "dev", "oif", "iif", "via", "table", "cache",/*all,*/
- "from", "root", "match", "exact", "to", /*root,match,exact*/ NULL
- };
+ static const char keywords[] =
+ "protocol\0""all\0""dev\0""oif\0""iif\0""via\0""table\0""cache\0" /*all*/
+ "from\0""root\0""match\0""exact\0""to\0"/*root match exact*/;
enum {
ARG_proto, PARM_all,
ARG_dev,
@@ -535,13 +538,13 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
bb_error_msg_and_die(bb_msg_requires_arg, "\"ip route flush\"");
while (argc > 0) {
- arg = index_in_substr_array(keywords, *argv);
+ arg = index_in_substrings(keywords, *argv);
if (arg == ARG_proto) {
uint32_t prot = 0;
NEXT_ARG();
filter.protocolmask = -1;
if (rtnl_rtprot_a2n(&prot, *argv)) {
- if (index_in_str_array(keywords, *argv) != PARM_all)
+ if (index_in_strings(keywords, *argv) != PARM_all)
invarg(*argv, "protocol");
prot = 0;
filter.protocolmask = 0;
@@ -558,7 +561,7 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
get_prefix(&filter.rvia, *argv, do_ipv6);
} else if (arg == ARG_table) {
NEXT_ARG();
- parm = index_in_substr_array(keywords, *argv);
+ parm = index_in_substrings(keywords, *argv);
if (parm == PARM_cache)
filter.tb = -1;
else if (parm == PARM_all)
@@ -567,7 +570,7 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
invarg(*argv, "table");
} else if (arg == ARG_from) {
NEXT_ARG();
- parm = index_in_substr_array(keywords, *argv);
+ parm = index_in_substrings(keywords, *argv);
if (parm == PARM_root) {
NEXT_ARG();
get_prefix(&filter.rsrc, *argv, do_ipv6);
@@ -584,7 +587,7 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
/* parm = arg; // would be more plausible, we reuse arg here */
if (arg == ARG_to) {
NEXT_ARG();
- arg = index_in_substr_array(keywords, *argv);
+ arg = index_in_substrings(keywords, *argv);
}
if (arg == PARM_root) {
NEXT_ARG();
@@ -645,9 +648,8 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
xrtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE);
filter.flushed = 0;
xrtnl_dump_filter(&rth, print_route, stdout);
- if (filter.flushed == 0) {
+ if (filter.flushed == 0)
return 0;
- }
if (flush_update())
return 1;
}
@@ -655,10 +657,8 @@ static int iproute_list_or_flush(int argc, char **argv, int flush)
if (filter.tb != -1) {
xrtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE);
- } else {
- if (rtnl_rtcache_request(&rth, do_ipv6) < 0) {
- bb_perror_msg_and_die("cannot send dump request");
- }
+ } else if (rtnl_rtcache_request(&rth, do_ipv6) < 0) {
+ bb_perror_msg_and_die("cannot send dump request");
}
xrtnl_dump_filter(&rth, print_route, stdout);
@@ -671,16 +671,16 @@ static int iproute_get(int argc, char **argv)
{
struct rtnl_handle rth;
struct {
- struct nlmsghdr n;
- struct rtmsg r;
- char buf[1024];
+ struct nlmsghdr n;
+ struct rtmsg r;
+ char buf[1024];
} req;
- char *idev = NULL;
- char *odev = NULL;
+ char *idev = NULL;
+ char *odev = NULL;
bool connected = 0;
bool from_ok = 0;
- static const char * const options[] =
- { "from", "iif", "oif", "dev", "notify", "connected", "to", 0 };
+ static const char options[] =
+ "from\0""iif\0""oif\0""dev\0""notify\0""connected\0""to\0";
memset(&req, 0, sizeof(req));
@@ -699,7 +699,7 @@ static int iproute_get(int argc, char **argv)
req.r.rtm_tos = 0;
while (argc > 0) {
- switch (index_in_str_array(options, *argv)) {
+ switch (index_in_strings(options, *argv)) {
case 0: /* from */
{
inet_prefix addr;
@@ -824,19 +824,18 @@ static int iproute_get(int argc, char **argv)
/* Return value becomes exitcode. It's okay to not return at all */
int do_iproute(int argc, char **argv)
{
- static const char * const ip_route_commands[] = {
- /*0-3*/ "add", "append", "change", "chg",
- /*4-7*/ "delete", "get", "list", "show",
- /*8..*/ "prepend", "replace", "test", "flush", 0
- };
+ static const char ip_route_commands[] =
+ /*0-3*/ "add\0""append\0""change\0""chg\0"
+ /*4-7*/ "delete\0""get\0""list\0""show\0"
+ /*8..*/ "prepend\0""replace\0""test\0""flush\0";
int command_num = 6;
- unsigned int flags = 0;
+ unsigned flags = 0;
int cmd = RTM_NEWROUTE;
/* "Standard" 'ip r a' treats 'a' as 'add', not 'append' */
/* It probably means that it is using "first match" rule */
if (*argv) {
- command_num = index_in_substr_array(ip_route_commands, *argv);
+ command_num = index_in_substrings(ip_route_commands, *argv);
}
switch (command_num) {
case 0: /* add */