diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-07-07 01:43:33 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-07-12 02:39:43 +0200 |
commit | 7a22312d6876290ede6576a9793ab9a654fe173d (patch) | |
tree | ae313ce472368bc2635db265395ebb32fe5cfcd2 | |
parent | test-network: test more bridge properties (diff) | |
download | systemd-7a22312d6876290ede6576a9793ab9a654fe173d.tar.xz systemd-7a22312d6876290ede6576a9793ab9a654fe173d.zip |
network: use string table to parse route type
-rw-r--r-- | src/network/networkd-route.c | 31 | ||||
-rw-r--r-- | src/network/networkd-route.h | 3 |
2 files changed, 21 insertions, 13 deletions
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index f79d5b2057..618d250899 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -12,6 +12,7 @@ #include "networkd-route.h" #include "parse-util.h" #include "set.h" +#include "string-table.h" #include "string-util.h" #include "sysctl-util.h" #include "util.h" @@ -749,6 +750,17 @@ int network_add_default_route_on_device(Network *network) { return 0; } +static const char * const route_type_table[__RTN_MAX] = { + [RTN_UNICAST] = "unicast", + [RTN_BLACKHOLE] = "blackhole", + [RTN_UNREACHABLE] = "unreachable", + [RTN_PROHIBIT] = "prohibit", + [RTN_THROW] = "throw", +}; + +assert_cc(__RTN_MAX <= UCHAR_MAX); +DEFINE_STRING_TABLE_LOOKUP(route_type, int); + int config_parse_gateway( const char *unit, const char *filename, @@ -1127,28 +1139,21 @@ int config_parse_route_type( Network *network = userdata; _cleanup_(route_free_or_set_invalidp) Route *n = NULL; - int r; + int t, r; r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; - if (streq(rvalue, "unicast")) - n->type = RTN_UNICAST; - else if (streq(rvalue, "blackhole")) - n->type = RTN_BLACKHOLE; - else if (streq(rvalue, "unreachable")) - n->type = RTN_UNREACHABLE; - else if (streq(rvalue, "prohibit")) - n->type = RTN_PROHIBIT; - else if (streq(rvalue, "throw")) - n->type = RTN_THROW; - else { - log_syntax(unit, LOG_ERR, filename, line, r, + t = route_type_from_string(rvalue); + if (t < 0) { + log_syntax(unit, LOG_ERR, filename, line, 0, "Could not parse route type \"%s\", ignoring assignment: %m", rvalue); return 0; } + n->type = (unsigned char) t; + TAKE_PTR(n); return 0; } diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index 3c0ac896ae..e7bd61eb9e 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -65,6 +65,9 @@ DEFINE_NETWORK_SECTION_FUNCTIONS(Route, route_free); int network_add_ipv4ll_route(Network *network); int network_add_default_route_on_device(Network *network); +const char* route_type_to_string(int t) _const_; +int route_type_from_string(const char *s) _pure_; + CONFIG_PARSER_PROTOTYPE(config_parse_gateway); CONFIG_PARSER_PROTOTYPE(config_parse_preferred_src); CONFIG_PARSER_PROTOTYPE(config_parse_destination); |