]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ADDR: Add the 'change' and 'replace' commands to the IPv6 address manipulation context.
authorNoriaki TAKAMIYA <takamiya@po.ntts.co.jp>
Fri, 24 Nov 2006 03:26:58 +0000 (12:26 +0900)
committerStephen Hemminger <shemminger@osdl.org>
Mon, 27 Nov 2006 16:40:56 +0000 (08:40 -0800)
Signed-off-by: TAKAMIYA Noriaki <takamiya@po.ntts.co.jp>
Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org>
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
ip/ipaddress.c

index ea27d4218f0d9ac7deaf72b0f4710d4b14644c6c..14376588a8a549a07fadc19bb73b28b656b35cd9 100644 (file)
@@ -60,7 +60,7 @@ static void usage(void)
        if (do_link) {
                iplink_usage();
        }
-       fprintf(stderr, "Usage: ip addr add IFADDR dev STRING [ LIFETIME ]\n");
+       fprintf(stderr, "Usage: ip addr {add|change|replace} IFADDR dev STRING [ LIFETIME ]\n");
        fprintf(stderr, "       ip addr del IFADDR dev STRING\n");
        fprintf(stderr, "       ip addr {show|flush} [ dev STRING ] [ scope SCOPE-ID ]\n");
        fprintf(stderr, "                            [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ]\n");
@@ -746,7 +746,7 @@ int default_scope(inet_prefix *lcl)
        return 0;
 }
 
-int ipaddr_modify(int cmd, int argc, char **argv)
+int ipaddr_modify(int cmd, int flags, int argc, char **argv)
 {
        struct {
                struct nlmsghdr         n;
@@ -772,7 +772,7 @@ int ipaddr_modify(int cmd, int argc, 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;
 
@@ -942,9 +942,14 @@ int do_ipaddr(int argc, char **argv)
        if (argc < 1)
                return ipaddr_list_or_flush(0, NULL, 0);
        if (matches(*argv, "add") == 0)
-               return ipaddr_modify(RTM_NEWADDR, argc-1, argv+1);
+               return ipaddr_modify(RTM_NEWADDR, NLM_F_CREATE|NLM_F_EXCL, argc-1, argv+1);
+       if (matches(*argv, "change") == 0 ||
+               strcmp(*argv, "chg") == 0)
+               return ipaddr_modify(RTM_NEWADDR, NLM_F_REPLACE, argc-1, argv+1);
+       if (matches(*argv, "replace") == 0)
+               return ipaddr_modify(RTM_NEWADDR, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1);
        if (matches(*argv, "delete") == 0)
-               return ipaddr_modify(RTM_DELADDR, argc-1, argv+1);
+               return ipaddr_modify(RTM_DELADDR, 0, argc-1, argv+1);
        if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0
            || matches(*argv, "lst") == 0)
                return ipaddr_list_or_flush(argc-1, argv+1, 0);