ba1bcd1137e4044e03796b24183dfa5ce9f3e1a0
[openwrt/svn-archive/archive.git] / package / utils / busybox / patches / 300-ip-addr-improvements.patch
1 From 6a7cd3d4aba493c0b0d00155b1e09a867db437cf Mon Sep 17 00:00:00 2001
2 From: Michael Tokarev <mjt@tls.msk.ru>
3 Date: Wed, 20 May 2015 16:27:44 +0300
4 Subject: [PATCH] ip addr: support change and replace commands
5
6 Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
7 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
8 ---
9 networking/ip.c | 2 +-
10 networking/libiproute/ipaddress.c | 20 ++++++++++++--------
11 2 files changed, 13 insertions(+), 9 deletions(-)
12
13 --- a/networking/ip.c
14 +++ b/networking/ip.c
15 @@ -33,7 +33,7 @@
16 //usage: "{ {add|del} IFADDR dev STRING | {show|flush}\n"
17 //usage: " [dev STRING] [to PREFIX] }"
18 //usage:#define ipaddr_full_usage "\n\n"
19 -//usage: "ipaddr {add|delete} IFADDR dev STRING\n"
20 +//usage: "ipaddr {add|change|replace|delete} IFADDR dev STRING\n"
21 //usage: "ipaddr {show|flush} [dev STRING] [scope SCOPE-ID]\n"
22 //usage: " [to PREFIX] [label PATTERN]\n"
23 //usage: " IFADDR := PREFIX | ADDR peer PREFIX\n"
24 --- a/networking/libiproute/ipaddress.c
25 +++ b/networking/libiproute/ipaddress.c
26 @@ -598,7 +598,7 @@ static int default_scope(inet_prefix *lc
27 }
28
29 /* Return value becomes exitcode. It's okay to not return at all */
30 -static int ipaddr_modify(int cmd, char **argv)
31 +static int ipaddr_modify(int cmd, int flags, char **argv)
32 {
33 static const char option[] ALIGN1 =
34 "peer\0""remote\0""broadcast\0""brd\0"
35 @@ -622,7 +622,7 @@ static int ipaddr_modify(int cmd, char *
36 memset(&req, 0, sizeof(req));
37
38 req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
39 - req.n.nlmsg_flags = NLM_F_REQUEST;
40 + req.n.nlmsg_flags = NLM_F_REQUEST | flags;
41 req.n.nlmsg_type = cmd;
42 req.ifa.ifa_family = preferred_family;
43
44 @@ -749,16 +749,24 @@ static int ipaddr_modify(int cmd, char *
45 int FAST_FUNC do_ipaddr(char **argv)
46 {
47 static const char commands[] ALIGN1 =
48 - "add\0""delete\0""list\0""show\0""lst\0""flush\0";
49 + /* 0 1 2 3 4 5 6 7 8 */
50 + "add\0""change\0""chg\0""replace\0""delete\0""list\0""show\0""lst\0""flush\0";
51 int cmd = 2;
52 if (*argv) {
53 cmd = index_in_substrings(commands, *argv);
54 if (cmd < 0)
55 invarg(*argv, applet_name);
56 argv++;
57 - if (cmd <= 1)
58 - return ipaddr_modify((cmd == 0) ? RTM_NEWADDR : RTM_DELADDR, argv);
59 + if (cmd <= 4) {
60 + return ipaddr_modify(
61 + /*cmd:*/ cmd == 4 ? RTM_DELADDR : RTM_NEWADDR,
62 + /*flags:*/
63 + cmd == 0 ? NLM_F_CREATE|NLM_F_EXCL : /* add */
64 + cmd == 1 || cmd == 2 ? NLM_F_REPLACE : /* change */
65 + cmd == 3 ? NLM_F_CREATE|NLM_F_REPLACE : /* replace */
66 + 0 /* delete */
67 + , argv);
68 + }
69 }
70 - /* 2 == list, 3 == show, 4 == lst */
71 - return ipaddr_list_or_flush(argv, cmd == 5);
72 + return ipaddr_list_or_flush(argv, cmd == 8);
73 }