diff --git a/include/rtm_map.h b/include/rtm_map.h index 70bda7d0..d6e5885c 100644 --- a/include/rtm_map.h +++ b/include/rtm_map.h @@ -4,7 +4,6 @@ char *rtnl_rtntype_n2a(int id, char *buf, int len); int rtnl_rtntype_a2n(int *id, char *arg); -int get_rt_realms(__u32 *realms, char *arg); - +int get_rt_realms_or_raw(__u32 *realms, char *arg); #endif /* __RTM_MAP_H__ */ diff --git a/ip/iproute.c b/ip/iproute.c index b137f555..ae86cc0d 100644 --- a/ip/iproute.c +++ b/ip/iproute.c @@ -749,7 +749,7 @@ static int parse_one_nh(struct rtmsg *r, struct rtattr *rta, } else if (matches(*argv, "realms") == 0) { __u32 realm; NEXT_ARG(); - if (get_rt_realms(&realm, *argv)) + if (get_rt_realms_or_raw(&realm, *argv)) invarg("\"realm\" value is invalid\n", *argv); rta_addattr32(rta, 4096, RTA_FLOW, realm); rtnh->rtnh_len += sizeof(struct rtattr) + 4; @@ -1050,7 +1050,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) } else if (matches(*argv, "realms") == 0) { __u32 realm; NEXT_ARG(); - if (get_rt_realms(&realm, *argv)) + if (get_rt_realms_or_raw(&realm, *argv)) invarg("\"realm\" value is invalid\n", *argv); addattr32(&req.n, sizeof(req), RTA_FLOW, realm); } else if (strcmp(*argv, "onlink") == 0) { @@ -1383,7 +1383,7 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action) } else if (matches(*argv, "realms") == 0) { __u32 realm; NEXT_ARG(); - if (get_rt_realms(&realm, *argv)) + if (get_rt_realms_or_raw(&realm, *argv)) invarg("invalid realms\n", *argv); filter.realm = realm; filter.realmmask = ~0U; diff --git a/ip/iprule.c b/ip/iprule.c index cec29246..9923b8eb 100644 --- a/ip/iprule.c +++ b/ip/iprule.c @@ -391,7 +391,7 @@ static int iprule_modify(int cmd, int argc, char **argv) } else if (matches(*argv, "realms") == 0) { __u32 realm; NEXT_ARG(); - if (get_rt_realms(&realm, *argv)) + if (get_rt_realms_or_raw(&realm, *argv)) invarg("invalid realms\n", *argv); addattr32(&req.n, sizeof(req), FRA_FLOW, realm); } else if (matches(*argv, "table") == 0 || diff --git a/ip/rtm_map.c b/ip/rtm_map.c index 21e818b4..1d7d2c7e 100644 --- a/ip/rtm_map.c +++ b/ip/rtm_map.c @@ -93,7 +93,7 @@ int rtnl_rtntype_a2n(int *id, char *arg) return 0; } -int get_rt_realms(__u32 *realms, char *arg) +static int get_rt_realms(__u32 *realms, char *arg) { __u32 realm = 0; char *p = strchr(arg, '/'); @@ -114,3 +114,11 @@ int get_rt_realms(__u32 *realms, char *arg) *realms |= realm; return 0; } + +int get_rt_realms_or_raw(__u32 *realms, char *arg) +{ + if (!get_rt_realms(realms, arg)) + return 0; + + return get_unsigned(realms, arg, 0); +}