diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index 87724af693..7774e794d4 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -83,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; @@ -93,6 +97,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); 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) 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)