From 186c2b3d0e5b248bc20d62d0f49f536c8ebf2461 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 26 Nov 2007 18:29:52 +0000 Subject: [PATCH] iproute: fix a bug where "ip r flush table main" was rejected, add "ip r flush cache" (however I'm unsure it is really valid syntax) Add a few comments and stop mixing params and params' keywords. --- networking/libiproute/iproute.c | 84 +++++++++++++++++++-------------- networking/libiproute/iprule.c | 1 - 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c index ec0952668..d4437b923 100644 --- a/networking/libiproute/iproute.c +++ b/networking/libiproute/iproute.c @@ -111,11 +111,11 @@ static int print_route(struct sockaddr_nl *who ATTRIBUTE_UNUSED, if (r->rtm_family == AF_INET6) { if (filter.tb) { if (filter.tb < 0) { - if (!(r->rtm_flags&RTM_F_CLONED)) { + if (!(r->rtm_flags & RTM_F_CLONED)) { return 0; } } else { - if (r->rtm_flags&RTM_F_CLONED) { + if (r->rtm_flags & RTM_F_CLONED) { return 0; } if (filter.tb == RT_TABLE_LOCAL) { @@ -366,7 +366,7 @@ USE_FEATURE_IP_RULE(ARG_table,) unsigned mtu; NEXT_ARG(); if (index_in_strings(keywords, *argv) == PARM_lock) { - mxlock |= (1< '9') - && rtnl_rtntype_a2n(&type, *argv) == 0) { + && rtnl_rtntype_a2n(&type, *argv) == 0) { NEXT_ARG(); req.r.rtm_type = type; ok |= type_ok; @@ -518,19 +518,30 @@ static int iproute_list_or_flush(char **argv, int flush) char *id = NULL; char *od = NULL; static const char keywords[] ALIGN1 = - "protocol\0""all\0""dev\0""oif\0""iif\0""via\0""table\0""cache\0" /*all*/ - "from\0""root\0""match\0""exact\0""to\0"/*root match exact*/; + /* "ip route list/flush" parameters: */ + "protocol\0" "dev\0" "oif\0" "iif\0" + "via\0" "table\0" "cache\0" + "from\0" "to\0" + /* and possible further keywords */ + "all\0" + "root\0" + "match\0" + "exact\0" + "main\0" + ; enum { - ARG_proto, PARM_all, - ARG_dev, - ARG_oif, - ARG_iif, - ARG_via, - ARG_table, PARM_cache, /*PARM_all,*/ - ARG_from, PARM_root, PARM_match, PARM_exact, - ARG_to /*PARM_root, PARM_match, PARM_exact*/ + KW_proto, KW_dev, KW_oif, KW_iif, + KW_via, KW_table, KW_cache, + KW_from, KW_to, + /* */ + KW_all, + KW_root, + KW_match, + KW_exact, + KW_main, }; int arg, parm; + iproute_reset_filter(); filter.tb = RT_TABLE_MAIN; @@ -539,64 +550,66 @@ static int iproute_list_or_flush(char **argv, int flush) while (*argv) { arg = index_in_substrings(keywords, *argv); - if (arg == ARG_proto) { + if (arg == KW_proto) { uint32_t prot = 0; NEXT_ARG(); filter.protocolmask = -1; if (rtnl_rtprot_a2n(&prot, *argv)) { - if (index_in_strings(keywords, *argv) != PARM_all) + if (index_in_strings(keywords, *argv) != KW_all) invarg(*argv, "protocol"); prot = 0; filter.protocolmask = 0; } filter.protocol = prot; - } else if (arg == ARG_dev || arg == ARG_oif) { + } else if (arg == KW_dev || arg == KW_oif) { NEXT_ARG(); od = *argv; - } else if (arg == ARG_iif) { + } else if (arg == KW_iif) { NEXT_ARG(); id = *argv; - } else if (arg == ARG_via) { + } else if (arg == KW_via) { NEXT_ARG(); get_prefix(&filter.rvia, *argv, do_ipv6); - } else if (arg == ARG_table) { + } else if (arg == KW_table) { /* table all/cache/main */ NEXT_ARG(); parm = index_in_substrings(keywords, *argv); - if (parm == PARM_cache) + if (parm == KW_cache) filter.tb = -1; - else if (parm == PARM_all) + else if (parm == KW_all) filter.tb = 0; - else + else if (parm != KW_main) invarg(*argv, "table"); - } else if (arg == ARG_from) { + } else if (arg == KW_cache) { // hmm is it valid - "ip r flush cache"? + filter.tb = -1; + } else if (arg == KW_from) { NEXT_ARG(); parm = index_in_substrings(keywords, *argv); - if (parm == PARM_root) { + if (parm == KW_root) { NEXT_ARG(); get_prefix(&filter.rsrc, *argv, do_ipv6); - } else if (parm == PARM_match) { + } else if (parm == KW_match) { NEXT_ARG(); get_prefix(&filter.msrc, *argv, do_ipv6); } else { - if (parm == PARM_exact) + if (parm == KW_exact) NEXT_ARG(); get_prefix(&filter.msrc, *argv, do_ipv6); filter.rsrc = filter.msrc; } - } else { - /* parm = arg; // would be more plausible, we reuse arg here */ - if (arg == ARG_to) { + } else { /* "to" is the default parameter */ + if (arg == KW_to) { NEXT_ARG(); arg = index_in_substrings(keywords, *argv); } - if (arg == PARM_root) { + /* parm = arg; - would be more plausible, but we reuse 'arg' here */ + if (arg == KW_root) { NEXT_ARG(); get_prefix(&filter.rdst, *argv, do_ipv6); - } else if (arg == PARM_match) { + } else if (arg == KW_match) { NEXT_ARG(); get_prefix(&filter.mdst, *argv, do_ipv6); - } else { - if (arg == PARM_exact) + } else { /* "to exact" is the default */ + if (arg == KW_exact) NEXT_ARG(); get_prefix(&filter.mdst, *argv, do_ipv6); filter.rdst = filter.mdst; @@ -610,7 +623,6 @@ static int iproute_list_or_flush(char **argv, int flush) } xrtnl_open(&rth); - ll_init_map(&rth); if (id || od) { @@ -631,7 +643,7 @@ static int iproute_list_or_flush(char **argv, int flush) if (flush) { char flushb[4096-512]; - if (filter.tb == -1) { + if (filter.tb == -1) { /* "flush table cache" */ if (do_ipv6 != AF_INET6) iproute_flush_cache(); if (do_ipv6 == AF_INET) diff --git a/networking/libiproute/iprule.c b/networking/libiproute/iprule.c index 6442992b4..6b22061a7 100644 --- a/networking/libiproute/iprule.c +++ b/networking/libiproute/iprule.c @@ -17,7 +17,6 @@ */ #include -//#include #include #include #include -- 2.25.1