From 88465a4ee7b86c4b69f96a23082163692076fb96 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 29 May 2019 10:43:12 +0900 Subject: [PATCH 1/4] util: introduce parse_ifindex_or_ifname() --- src/basic/parse-util.c | 19 +++++++++++++++++++ src/basic/parse-util.h | 1 + 2 files changed, 20 insertions(+) diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index 87724af693..ae764c581d 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -93,6 +94,24 @@ int parse_ifindex(const char *s, int *ret) { return 0; } +int parse_ifindex_or_ifname(const char *s, int *ret) { + int r; + + assert(s); + assert(ret); + + r = parse_ifindex(s, ret); + if (r >= 0) + return r; + + r = (int) if_nametoindex(s); + if (r <= 0) + return -errno; + + *ret = r; + return 0; +} + int parse_mtu(int family, const char *s, uint32_t *ret) { uint64_t u; size_t m; diff --git a/src/basic/parse-util.h b/src/basic/parse-util.h index e47641b429..7f5b0cf2b4 100644 --- a/src/basic/parse-util.h +++ b/src/basic/parse-util.h @@ -16,6 +16,7 @@ int parse_dev(const char *s, dev_t *ret); int parse_pid(const char *s, pid_t* ret_pid); int parse_mode(const char *s, mode_t *ret); int parse_ifindex(const char *s, int *ret); +int parse_ifindex_or_ifname(const char *s, int *ret); int parse_mtu(int family, const char *s, uint32_t *ret); int parse_size(const char *t, uint64_t base, uint64_t *size); From f5072281bae7d60f023654b2dd2949db7bc6ee14 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 29 May 2019 13:21:43 +0900 Subject: [PATCH 2/4] util: add assertions --- src/basic/parse-util.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index ae764c581d..7774e794d4 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -84,6 +84,9 @@ int parse_mode(const char *s, mode_t *ret) { int parse_ifindex(const char *s, int *ret) { int ifi, r; + assert(s); + assert(ret); + r = safe_atoi(s, &ifi); if (r < 0) return r; From 8e5385b485955772133ff7d1b48dcdaa37b11225 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 29 May 2019 10:56:55 +0900 Subject: [PATCH 3/4] resolvectl: use parse_ifindex_or_ifname() --- src/resolve/resolvectl.c | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index 9637e00e60..8e4315d86a 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -76,24 +76,10 @@ typedef enum StatusMode { STATUS_NTA, } StatusMode; -static int parse_ifindex_and_warn(const char *s) { - int ifi; - - assert(s); - - if (parse_ifindex(s, &ifi) < 0) { - ifi = if_nametoindex(s); - if (ifi <= 0) - return log_error_errno(errno, "Unknown interface '%s': %m", s); - } - - return ifi; -} - int ifname_mangle(const char *s) { _cleanup_free_ char *iface = NULL; const char *dot; - int ifi; + int ifi, r; assert(s); @@ -107,16 +93,14 @@ int ifname_mangle(const char *s) { if (!iface) return log_oom(); - if (parse_ifindex(iface, &ifi) < 0) { - ifi = if_nametoindex(iface); - if (ifi <= 0) { - if (errno == ENODEV && arg_ifindex_permissive) { - log_debug("Interface '%s' not found, but -f specified, ignoring.", iface); - return 0; /* done */ - } - - return log_error_errno(errno, "Unknown interface '%s': %m", iface); + r = parse_ifindex_or_ifname(iface, &ifi); + if (r < 0) { + if (r == -ENODEV && arg_ifindex_permissive) { + log_debug("Interface '%s' not found, but -f specified, ignoring.", iface); + return 0; /* done */ } + + return log_error_errno(r, "Unknown interface '%s': %m", iface); } if (arg_ifindex > 0 && arg_ifindex != ifi) @@ -1843,9 +1827,11 @@ static int verb_status(int argc, char **argv, void *userdata) { STRV_FOREACH(ifname, argv + 1) { int ifindex; - ifindex = parse_ifindex_and_warn(*ifname); - if (ifindex < 0) + q = parse_ifindex_or_ifname(*ifname, &ifindex); + if (q < 0) { + log_error_errno(q, "Unknown interface '%s', ignoring: %m", *ifname); continue; + } q = status_ifindex(bus, ifindex, NULL, STATUS_ALL, &empty_line); if (q < 0) From 4bddccc684e9c30ba825dae5175b710843c41d56 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 29 May 2019 11:02:09 +0900 Subject: [PATCH 4/4] networkctl: use parse_ifindex_or_ifname() --- src/network/networkctl.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 5e3095917f..321fe92f09 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1089,12 +1089,9 @@ static int link_delete(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - r = parse_ifindex(argv[i], &index); - if (r < 0) { - index = (int) if_nametoindex(argv[i]); - if (index <= 0) - return log_error_errno(r, "Failed to resolve interface %s", argv[i]); - } + r = parse_ifindex_or_ifname(argv[i], &index); + if (r < 0) + return log_error_errno(r, "Failed to resolve interface %s", argv[i]); r = set_put(indexes, INT_TO_PTR(index)); if (r < 0)