diff options
author | Michael Tokarev <mjt@tls.msk.ru> | 2015-05-20 16:27:44 +0300 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2015-07-01 18:26:41 +0200 |
commit | 6a7cd3d4aba493c0b0d00155b1e09a867db437cf (patch) | |
tree | 9352fa171c379d0f6879cf1aac3b2b28fbcc15a8 | |
parent | 7db312ad265608264c1d42106ceadf158ff7f77e (diff) | |
download | busybox-6a7cd3d4aba493c0b0d00155b1e09a867db437cf.tar.gz |
ip addr: support change and replace commands
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ip.c | 2 | ||||
-rw-r--r-- | networking/libiproute/ipaddress.c | 20 |
2 files changed, 13 insertions, 9 deletions
diff --git a/networking/ip.c b/networking/ip.c index 98fe621b1..d35345c36 100644 --- a/networking/ip.c +++ b/networking/ip.c @@ -33,7 +33,7 @@ //usage: "{ {add|del} IFADDR dev STRING | {show|flush}\n" //usage: " [dev STRING] [to PREFIX] }" //usage:#define ipaddr_full_usage "\n\n" -//usage: "ipaddr {add|delete} IFADDR dev STRING\n" +//usage: "ipaddr {add|change|replace|delete} IFADDR dev STRING\n" //usage: "ipaddr {show|flush} [dev STRING] [scope SCOPE-ID]\n" //usage: " [to PREFIX] [label PATTERN]\n" //usage: " IFADDR := PREFIX | ADDR peer PREFIX\n" diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c index 4072d0626..85f33560f 100644 --- a/networking/libiproute/ipaddress.c +++ b/networking/libiproute/ipaddress.c @@ -598,7 +598,7 @@ static int default_scope(inet_prefix *lcl) } /* Return value becomes exitcode. It's okay to not return at all */ -static int ipaddr_modify(int cmd, char **argv) +static int ipaddr_modify(int cmd, int flags, char **argv) { static const char option[] ALIGN1 = "peer\0""remote\0""broadcast\0""brd\0" @@ -622,7 +622,7 @@ static int ipaddr_modify(int cmd, char **argv) memset(&req, 0, sizeof(req)); req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); - req.n.nlmsg_flags = NLM_F_REQUEST; + req.n.nlmsg_flags = NLM_F_REQUEST | flags; req.n.nlmsg_type = cmd; req.ifa.ifa_family = preferred_family; @@ -749,16 +749,20 @@ static int ipaddr_modify(int cmd, char **argv) int FAST_FUNC do_ipaddr(char **argv) { static const char commands[] ALIGN1 = - "add\0""delete\0""list\0""show\0""lst\0""flush\0"; + /* 0 1 2 3 4 5 6 7 8 */ + "add\0""change\0""chg\0""replace\0""delete\0""list\0""show\0""lst\0""flush\0"; int cmd = 2; if (*argv) { cmd = index_in_substrings(commands, *argv); if (cmd < 0) invarg(*argv, applet_name); argv++; - if (cmd <= 1) - return ipaddr_modify((cmd == 0) ? RTM_NEWADDR : RTM_DELADDR, argv); - } - /* 2 == list, 3 == show, 4 == lst */ - return ipaddr_list_or_flush(argv, cmd == 5); + if (cmd <= 4) + return ipaddr_modify(cmd == 4 ? RTM_DELADDR : RTM_NEWADDR, + cmd == 0 ? NLM_F_CREATE|NLM_F_EXCL : + cmd == 1 || cmd == 2 ? NLM_F_REPLACE : + cmd == 3 ? NLM_F_CREATE|NLM_F_REPLACE : + 0, argv); + } + return ipaddr_list_or_flush(argv, cmd == 8); } |