Invoke parse_flag_on_off() instead of rolling a custom function. Several
places have the on/off logic reversed vs. how the flag is specified (e.g.
IFF_NOARP vs. "arp" on command line). For those, invoke parse_on_off() and
then set_flag() with a negated value.

Signed-off-by: Petr Machata <m...@pmachata.org>
---
 ip/iplink.c | 182 +++++++++++++++++++---------------------------------
 1 file changed, 66 insertions(+), 116 deletions(-)

diff --git a/ip/iplink.c b/ip/iplink.c
index 5ec33a98b96e..422e2fdccde5 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -135,14 +135,6 @@ static void usage(void)
        iplink_usage();
 }
 
-static int on_off(const char *msg, const char *realval)
-{
-       fprintf(stderr,
-               "Error: argument of \"%s\" must be \"on\" or \"off\", not 
\"%s\"\n",
-               msg, realval);
-       return -1;
-}
-
 static void *BODY;             /* cached dlopen(NULL) handle */
 static struct link_util *linkutil_list;
 
@@ -351,6 +343,7 @@ static int iplink_parse_vf(int vf, int *argcp, char 
***argvp,
        int len, argc = *argcp;
        char **argv = *argvp;
        struct rtattr *vfinfo;
+       int ret;
 
        tivt.min_tx_rate = -1;
        tivt.max_tx_rate = -1;
@@ -463,12 +456,9 @@ static int iplink_parse_vf(int vf, int *argcp, char 
***argvp,
                        struct ifla_vf_spoofchk ivs;
 
                        NEXT_ARG();
-                       if (matches(*argv, "on") == 0)
-                               ivs.setting = 1;
-                       else if (matches(*argv, "off") == 0)
-                               ivs.setting = 0;
-                       else
-                               return on_off("spoofchk", *argv);
+                       ivs.setting = parse_on_off("spoofchk", *argv, &ret);
+                       if (ret)
+                               return ret;
                        ivs.vf = vf;
                        addattr_l(&req->n, sizeof(*req), IFLA_VF_SPOOFCHK,
                                  &ivs, sizeof(ivs));
@@ -477,12 +467,9 @@ static int iplink_parse_vf(int vf, int *argcp, char 
***argvp,
                        struct ifla_vf_rss_query_en ivs;
 
                        NEXT_ARG();
-                       if (matches(*argv, "on") == 0)
-                               ivs.setting = 1;
-                       else if (matches(*argv, "off") == 0)
-                               ivs.setting = 0;
-                       else
-                               return on_off("query_rss", *argv);
+                       ivs.setting = parse_on_off("query_rss", *argv, &ret);
+                       if (ret)
+                               return ret;
                        ivs.vf = vf;
                        addattr_l(&req->n, sizeof(*req), IFLA_VF_RSS_QUERY_EN,
                                  &ivs, sizeof(ivs));
@@ -491,12 +478,9 @@ static int iplink_parse_vf(int vf, int *argcp, char 
***argvp,
                        struct ifla_vf_trust ivt;
 
                        NEXT_ARG();
-                       if (matches(*argv, "on") == 0)
-                               ivt.setting = 1;
-                       else if (matches(*argv, "off") == 0)
-                               ivt.setting = 0;
-                       else
-                               invarg("Invalid \"trust\" value\n", *argv);
+                       ivt.setting = parse_on_off("trust", *argv, &ret);
+                       if (ret)
+                               return ret;
                        ivt.vf = vf;
                        addattr_l(&req->n, sizeof(*req), IFLA_VF_TRUST,
                                  &ivt, sizeof(ivt));
@@ -594,6 +578,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req 
*req, char **type)
        int index = 0;
        int group = -1;
        int addr_len = 0;
+       int err;
 
        ret = argc;
 
@@ -687,62 +672,53 @@ int iplink_parse(int argc, char **argv, struct iplink_req 
*req, char **type)
                        NEXT_ARG();
                        req->i.ifi_change |= IFF_MULTICAST;
 
-                       if (strcmp(*argv, "on") == 0)
-                               req->i.ifi_flags |= IFF_MULTICAST;
-                       else if (strcmp(*argv, "off") == 0)
-                               req->i.ifi_flags &= ~IFF_MULTICAST;
-                       else
-                               return on_off("multicast", *argv);
+                       parse_flag_on_off("multicast", *argv, &req->i.ifi_flags,
+                                         IFF_MULTICAST, &err);
+                       if (err)
+                               return err;
                } else if (strcmp(*argv, "allmulticast") == 0) {
                        NEXT_ARG();
                        req->i.ifi_change |= IFF_ALLMULTI;
 
-                       if (strcmp(*argv, "on") == 0)
-                               req->i.ifi_flags |= IFF_ALLMULTI;
-                       else if (strcmp(*argv, "off") == 0)
-                               req->i.ifi_flags &= ~IFF_ALLMULTI;
-                       else
-                               return on_off("allmulticast", *argv);
+                       parse_flag_on_off("allmulticast", *argv, 
&req->i.ifi_flags,
+                                         IFF_ALLMULTI, &err);
+                       if (err)
+                               return err;
                } else if (strcmp(*argv, "promisc") == 0) {
                        NEXT_ARG();
                        req->i.ifi_change |= IFF_PROMISC;
 
-                       if (strcmp(*argv, "on") == 0)
-                               req->i.ifi_flags |= IFF_PROMISC;
-                       else if (strcmp(*argv, "off") == 0)
-                               req->i.ifi_flags &= ~IFF_PROMISC;
-                       else
-                               return on_off("promisc", *argv);
+                       parse_flag_on_off("promisc", *argv, &req->i.ifi_flags,
+                                         IFF_PROMISC, &err);
+                       if (err)
+                               return err;
                } else if (strcmp(*argv, "trailers") == 0) {
+                       int on_off;
+
                        NEXT_ARG();
                        req->i.ifi_change |= IFF_NOTRAILERS;
 
-                       if (strcmp(*argv, "off") == 0)
-                               req->i.ifi_flags |= IFF_NOTRAILERS;
-                       else if (strcmp(*argv, "on") == 0)
-                               req->i.ifi_flags &= ~IFF_NOTRAILERS;
-                       else
-                               return on_off("trailers", *argv);
+                       on_off = parse_on_off("trailers", *argv, &err);
+                       if (err)
+                               return err;
+                       set_flag(&req->i.ifi_flags, IFF_NOTRAILERS, !on_off);
                } else if (strcmp(*argv, "arp") == 0) {
+                       int on_off;
+
                        NEXT_ARG();
                        req->i.ifi_change |= IFF_NOARP;
 
-                       if (strcmp(*argv, "on") == 0)
-                               req->i.ifi_flags &= ~IFF_NOARP;
-                       else if (strcmp(*argv, "off") == 0)
-                               req->i.ifi_flags |= IFF_NOARP;
-                       else
-                               return on_off("arp", *argv);
+                       on_off = parse_on_off("arp", *argv, &err);
+                       if (err)
+                               return err;
+                       set_flag(&req->i.ifi_flags, IFF_NOARP, !on_off);
                } else if (strcmp(*argv, "carrier") == 0) {
                        int carrier;
 
                        NEXT_ARG();
-                       if (strcmp(*argv, "on") == 0)
-                               carrier = 1;
-                       else if (strcmp(*argv, "off") == 0)
-                               carrier = 0;
-                       else
-                               return on_off("carrier", *argv);
+                       carrier = parse_on_off("carrier", *argv, &err);
+                       if (err)
+                               return err;
 
                        addattr8(&req->n, sizeof(*req), IFLA_CARRIER, carrier);
                } else if (strcmp(*argv, "vf") == 0) {
@@ -793,12 +769,10 @@ int iplink_parse(int argc, char **argv, struct iplink_req 
*req, char **type)
                        NEXT_ARG();
                        req->i.ifi_change |= IFF_DYNAMIC;
 
-                       if (strcmp(*argv, "on") == 0)
-                               req->i.ifi_flags |= IFF_DYNAMIC;
-                       else if (strcmp(*argv, "off") == 0)
-                               req->i.ifi_flags &= ~IFF_DYNAMIC;
-                       else
-                               return on_off("dynamic", *argv);
+                       parse_flag_on_off("dynamic", *argv, &req->i.ifi_flags,
+                                         IFF_DYNAMIC, &err);
+                       if (err)
+                               return err;
                } else if (matches(*argv, "type") == 0) {
                        NEXT_ARG();
                        *type = *argv;
@@ -895,12 +869,9 @@ int iplink_parse(int argc, char **argv, struct iplink_req 
*req, char **type)
                        unsigned int proto_down;
 
                        NEXT_ARG();
-                       if (strcmp(*argv, "on") == 0)
-                               proto_down = 1;
-                       else if (strcmp(*argv, "off") == 0)
-                               proto_down = 0;
-                       else
-                               return on_off("protodown", *argv);
+                       proto_down = parse_on_off("protodown", *argv, &err);
+                       if (err)
+                               return err;
                        addattr8(&req->n, sizeof(*req), IFLA_PROTO_DOWN,
                                 proto_down);
                } else if (strcmp(*argv, "gso_max_size") == 0) {
@@ -1320,6 +1291,7 @@ static int do_set(int argc, char **argv)
        struct ifreq ifr0, ifr1;
        char *newname = NULL;
        int htype, halen;
+       int ret;
 
        while (argc > 0) {
                if (strcmp(*argv, "up") == 0) {
@@ -1357,63 +1329,41 @@ static int do_set(int argc, char **argv)
                } else if (strcmp(*argv, "multicast") == 0) {
                        NEXT_ARG();
                        mask |= IFF_MULTICAST;
-
-                       if (strcmp(*argv, "on") == 0)
-                               flags |= IFF_MULTICAST;
-                       else if (strcmp(*argv, "off") == 0)
-                               flags &= ~IFF_MULTICAST;
-                       else
-                               return on_off("multicast", *argv);
+                       parse_flag_on_off("multicast", *argv, &flags, 
IFF_MULTICAST, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "allmulticast") == 0) {
                        NEXT_ARG();
                        mask |= IFF_ALLMULTI;
-
-                       if (strcmp(*argv, "on") == 0)
-                               flags |= IFF_ALLMULTI;
-                       else if (strcmp(*argv, "off") == 0)
-                               flags &= ~IFF_ALLMULTI;
-                       else
-                               return on_off("allmulticast", *argv);
+                       parse_flag_on_off("allmulticast", *argv, &flags, 
IFF_ALLMULTI, &ret);
                } else if (strcmp(*argv, "promisc") == 0) {
                        NEXT_ARG();
                        mask |= IFF_PROMISC;
-
-                       if (strcmp(*argv, "on") == 0)
-                               flags |= IFF_PROMISC;
-                       else if (strcmp(*argv, "off") == 0)
-                               flags &= ~IFF_PROMISC;
-                       else
-                               return on_off("promisc", *argv);
+                       parse_flag_on_off("promisc", *argv, &flags, 
IFF_PROMISC, &ret);
                } else if (strcmp(*argv, "trailers") == 0) {
+                       int on_off;
+
                        NEXT_ARG();
                        mask |= IFF_NOTRAILERS;
-
-                       if (strcmp(*argv, "off") == 0)
-                               flags |= IFF_NOTRAILERS;
-                       else if (strcmp(*argv, "on") == 0)
-                               flags &= ~IFF_NOTRAILERS;
-                       else
-                               return on_off("trailers", *argv);
+                       on_off = parse_on_off("trailers", *argv, &ret);
+                       if (ret)
+                               return ret;
+                       set_flag(&flags, IFF_NOTRAILERS, !on_off);
                } else if (strcmp(*argv, "arp") == 0) {
+                       int on_off;
+
                        NEXT_ARG();
                        mask |= IFF_NOARP;
-
-                       if (strcmp(*argv, "on") == 0)
-                               flags &= ~IFF_NOARP;
-                       else if (strcmp(*argv, "off") == 0)
-                               flags |= IFF_NOARP;
-                       else
-                               return on_off("arp", *argv);
+                       on_off = parse_on_off("arp", *argv, &ret);
+                       if (ret)
+                               return ret;
+                       set_flag(&flags, IFF_NOARP, !on_off);
                } else if (matches(*argv, "dynamic") == 0) {
                        NEXT_ARG();
                        mask |= IFF_DYNAMIC;
-
-                       if (strcmp(*argv, "on") == 0)
-                               flags |= IFF_DYNAMIC;
-                       else if (strcmp(*argv, "off") == 0)
-                               flags &= ~IFF_DYNAMIC;
-                       else
-                               return on_off("dynamic", *argv);
+                       parse_flag_on_off("dynamic", *argv, &flags, 
IFF_DYNAMIC, &ret);
+                       if (ret)
+                               return ret;
                } else {
                        if (strcmp(*argv, "dev") == 0)
                                NEXT_ARG();
-- 
2.25.1

Reply via email to