aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/libiproute/iplink.c93
1 files changed, 39 insertions, 54 deletions
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index a28df6e79..583a2801c 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -186,56 +186,48 @@ static int do_set(char **argv)
if (key == ARG_up) {
mask |= IFF_UP;
flags |= IFF_UP;
- }
- if (key == ARG_down) {
+ } else if (key == ARG_down) {
mask |= IFF_UP;
flags &= ~IFF_UP;
- }
- if (key == ARG_name) {
+ } else if (key == ARG_name) {
NEXT_ARG();
newname = *argv;
- }
- if (key == ARG_mtu) {
+ } else if (key == ARG_mtu) {
NEXT_ARG();
if (mtu != -1)
duparg("mtu", *argv);
mtu = get_unsigned(*argv, "mtu");
- }
- if (key == ARG_multicast) {
- int param;
- NEXT_ARG();
- mask |= IFF_MULTICAST;
- param = index_in_strings(str_on_off, *argv);
- if (param < 0)
- die_must_be_on_off("multicast");
- if (param == PARM_on)
- flags |= IFF_MULTICAST;
- else
- flags &= ~IFF_MULTICAST;
- }
- if (key == ARG_arp) {
- int param;
- NEXT_ARG();
- mask |= IFF_NOARP;
- param = index_in_strings(str_on_off, *argv);
- if (param < 0)
- die_must_be_on_off("arp");
- if (param == PARM_on)
- flags &= ~IFF_NOARP;
- else
- flags |= IFF_NOARP;
- }
- if (key == ARG_addr) {
+ } else if (key == ARG_addr) {
NEXT_ARG();
newaddr = *argv;
- }
- if (key >= ARG_dev) {
+ } else if (key >= ARG_dev) {
if (key == ARG_dev) {
NEXT_ARG();
}
if (dev)
duparg2("dev", *argv);
dev = *argv;
+ } else {
+ int param;
+ NEXT_ARG();
+ param = index_in_strings(str_on_off, *argv);
+ if (key == ARG_multicast) {
+ if (param < 0)
+ die_must_be_on_off("multicast");
+ mask |= IFF_MULTICAST;
+ if (param == PARM_on)
+ flags |= IFF_MULTICAST;
+ else
+ flags &= ~IFF_MULTICAST;
+ } else if (key == ARG_arp) {
+ if (param < 0)
+ die_must_be_on_off("arp");
+ mask |= IFF_NOARP;
+ if (param == PARM_on)
+ flags &= ~IFF_NOARP;
+ else
+ flags |= IFF_NOARP;
+ }
}
argv++;
}
@@ -248,9 +240,11 @@ static int do_set(char **argv)
halen = get_address(dev, &htype);
if (newaddr) {
parse_address(dev, htype, halen, newaddr, &ifr0);
+ set_address(&ifr0, 0);
}
if (newbrd) {
parse_address(dev, htype, halen, newbrd, &ifr1);
+ set_address(&ifr1, 1);
}
}
@@ -264,14 +258,6 @@ static int do_set(char **argv)
if (mtu != -1) {
set_mtu(dev, mtu);
}
- if (newaddr || newbrd) {
- if (newbrd) {
- set_address(&ifr1, 1);
- }
- if (newaddr) {
- set_address(&ifr0, 0);
- }
- }
if (mask)
do_chflags(dev, flags, mask);
return 0;
@@ -304,7 +290,7 @@ static int do_change(char **argv, const unsigned rtm)
struct ifinfomsg i;
char buf[1024];
} req;
- int arg;
+ smalluint arg;
char *name_str = NULL, *link_str = NULL, *type_str = NULL, *dev_str = NULL;
memset(&req, 0, sizeof(req));
@@ -375,17 +361,16 @@ int do_iplink(char **argv)
{
static const char keywords[] ALIGN1 =
"add\0""delete\0""set\0""show\0""lst\0""list\0";
- int key;
- if (!*argv)
- return ipaddr_list_link(argv);
- key = index_in_substrings(keywords, *argv);
- if (key < 0)
- bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);
- argv++;
- if (key <= 1) /* add/delete */
- return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK);
- else if (key == 2) /* set */
- return do_set(argv);
+ if (*argv) {
+ smalluint key = index_in_substrings(keywords, *argv);
+ if (key > 5) /* invalid argument */
+ bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);
+ argv++;
+ if (key <= 1) /* add/delete */
+ return do_change(argv, key ? RTM_DELLINK : RTM_NEWLINK);
+ else if (key == 2) /* set */
+ return do_set(argv);
+ }
/* show, lst, list */
return ipaddr_list_link(argv);
}