iplink: shrink
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Tue, 25 May 2010 14:16:28 +0000 (16:16 +0200)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Tue, 25 May 2010 16:48:33 +0000 (18:48 +0200)
function                                             old     new   delta
do_change                                            490     487      -3
ipaddr_list_link                                      18       -     -18
do_iplink                                           1169    1113     -56
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/2 up/down: 0/-77)             Total: -77 bytes

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
networking/libiproute/iplink.c

index a28df6e..583a280 100644 (file)
@@ -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);
 }