From: Zbigniew Jędrzejewski-Szmek Date: Sat, 11 Jan 2020 10:21:01 +0000 (+0100) Subject: Resolve alternative ifnames wherever we would resolve an interface name X-Git-Tag: v245-rc1~138^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d308bb99d20b45fed1923ed6b893a59dbac02eca;p=thirdparty%2Fsystemd.git Resolve alternative ifnames wherever we would resolve an interface name To keep the names manageable, "ifname_or_ifindex" is replaced by "interface". --- diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index d3140cc1a40..b644c4a4d60 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -93,23 +93,6 @@ int parse_ifindex(const char *s) { return ifi; } -int parse_ifindex_or_ifname(const char *s) { - int r; - - assert(s); - - r = parse_ifindex(s); - if (r > 0) - return r; - assert(r < 0); - - r = (int) if_nametoindex(s); - if (r <= 0) - return -errno; - - return r; -} - 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 b20f5b52cce..c6d1d249672 100644 --- a/src/basic/parse-util.h +++ b/src/basic/parse-util.h @@ -14,7 +14,6 @@ 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 parse_ifindex_or_ifname(const char *s); 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/libsystemd/sd-netlink/netlink-util.c b/src/libsystemd/sd-netlink/netlink-util.c index 0b2d171b2d2..9c6a5d29f6e 100644 --- a/src/libsystemd/sd-netlink/netlink-util.c +++ b/src/libsystemd/sd-netlink/netlink-util.c @@ -191,6 +191,8 @@ int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name) { return r; r = sd_netlink_call(*rtnl, message, 0, &reply); + if (r == -EINVAL) + return -ENODEV; /* The device doesn't exist */ if (r < 0) return r; diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 5cc62841ec4..e1865152057 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -38,6 +38,7 @@ #include "parse-util.h" #include "pretty-print.h" #include "set.h" +#include "socket-netlink.h" #include "socket-util.h" #include "sort-util.h" #include "sparse-endian.h" @@ -64,21 +65,6 @@ static bool arg_stats = false; static bool arg_full = false; static unsigned arg_lines = 10; -static int resolve_ifname(sd_netlink **rtnl, const char *name) { - int r; - - r = parse_ifindex_or_ifname(name); - if (r > 0) - return r; - assert(r < 0); - - r = rtnl_resolve_link_alternative_name(rtnl, name); - if (r > 0) - return r; - assert(r < 0); - return log_error_errno(r, "Failed to resolve interface \"%s\": %m", name); -} - static char *link_get_type_string(unsigned short iftype, sd_device *d) { const char *t, *devtype; char *p; @@ -1895,7 +1881,7 @@ static int link_delete(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - index = resolve_ifname(&rtnl, argv[i]); + index = resolve_interface_or_warn(&rtnl, argv[i]); if (index < 0) return index; @@ -1948,7 +1934,7 @@ static int link_renew(int argc, char *argv[], void *userdata) { return log_error_errno(r, "Failed to connect system bus: %m"); for (i = 1; i < argc; i++) { - index = resolve_ifname(&rtnl, argv[i]); + index = resolve_interface_or_warn(&rtnl, argv[i]); if (index < 0) return index; @@ -2000,7 +1986,7 @@ static int verb_reconfigure(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - index = resolve_ifname(&rtnl, argv[i]); + index = resolve_interface_or_warn(&rtnl, argv[i]); if (index < 0) return index; diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 2223a356da8..2df8b864e88 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 "socket-netlink.h" #include "string-table.h" #include "string-util.h" #include "strxcpyx.h" @@ -1646,7 +1647,7 @@ int config_parse_multipath_route( m->gateway.family = family; if (dev) { - r = parse_ifindex_or_ifname(dev); + r = resolve_interface(NULL, dev); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Invalid interface name or index, ignoring assignment: %s", dev); diff --git a/src/nspawn/nspawn-network.c b/src/nspawn/nspawn-network.c index b2592b023dd..da074d77c65 100644 --- a/src/nspawn/nspawn-network.c +++ b/src/nspawn/nspawn-network.c @@ -18,6 +18,7 @@ #include "nspawn-network.h" #include "parse-util.h" #include "siphash24.h" +#include "socket-netlink.h" #include "socket-util.h" #include "stat-util.h" #include "string-util.h" @@ -280,7 +281,8 @@ int setup_veth(const char *machine_name, if (r < 0) return r; - u = if_nametoindex(n); + u = if_nametoindex(n); /* We don't need to use resolve_ifname() here because the + * name we assigned is always the main name. */ if (u == 0) return log_error_errno(errno, "Failed to resolve interface %s: %m", n); @@ -337,7 +339,7 @@ static int join_bridge(sd_netlink *rtnl, const char *veth_name, const char *brid assert(veth_name); assert(bridge_name); - bridge_ifi = parse_ifindex_or_ifname(bridge_name); + bridge_ifi = resolve_interface(&rtnl, bridge_name); if (bridge_ifi < 0) return bridge_ifi; @@ -472,16 +474,6 @@ int remove_bridge(const char *bridge_name) { return remove_one_link(rtnl, bridge_name); } -static int parse_interface(const char *name) { - int ifi; - - ifi = parse_ifindex_or_ifname(name); - if (ifi < 0) - return log_error_errno(ifi, "Failed to resolve interface %s: %m", name); - - return ifi; -} - int test_network_interface_initialized(const char *name) { _cleanup_(sd_device_unrefp) sd_device *d = NULL; int ifi, r; @@ -492,7 +484,7 @@ int test_network_interface_initialized(const char *name) { /* udev should be around. */ - ifi = parse_interface(name); + ifi = resolve_interface_or_warn(NULL, name); if (ifi < 0) return ifi; @@ -532,7 +524,7 @@ int move_network_interfaces(int netns_fd, char **ifaces) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL; int ifi; - ifi = parse_interface(*i); + ifi = resolve_interface_or_warn(&rtnl, *i); if (ifi < 0) return ifi; @@ -571,7 +563,7 @@ int setup_macvlan(const char *machine_name, pid_t pid, char **ifaces) { struct ether_addr mac; int ifi; - ifi = parse_interface(*i); + ifi = resolve_interface_or_warn(&rtnl, *i); if (ifi < 0) return ifi; @@ -657,7 +649,7 @@ int setup_ipvlan(const char *machine_name, pid_t pid, char **ifaces) { _cleanup_free_ char *n = NULL, *a = NULL; int ifi; - ifi = parse_interface(*i); + ifi = resolve_interface_or_warn(&rtnl, *i); if (ifi < 0) return ifi; diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index cabb3f6c699..2dceaa5d215 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -94,14 +94,14 @@ int ifname_mangle(const char *s) { if (!iface) return log_oom(); - ifi = parse_ifindex_or_ifname(iface); + ifi = resolve_interface(NULL, iface); if (ifi < 0) { if (ifi == -ENODEV && arg_ifindex_permissive) { log_debug("Interface '%s' not found, but -f specified, ignoring.", iface); return 0; /* done */ } - return log_error_errno(ifi, "Unknown interface '%s': %m", iface); + return log_error_errno(ifi, "Failed to resolve interface \"%s\": %m", iface); } if (arg_ifindex > 0 && arg_ifindex != ifi) @@ -1828,9 +1828,9 @@ static int verb_status(int argc, char **argv, void *userdata) { STRV_FOREACH(ifname, argv + 1) { int ifindex, q; - ifindex = parse_ifindex_or_ifname(*ifname); + ifindex = resolve_interface(NULL, *ifname); if (ifindex < 0) { - log_warning_errno(ifindex, "Unknown interface '%s', ignoring: %m", *ifname); + log_warning_errno(ifindex, "Failed to resolve interface \"%s\", ignoring: %m", *ifname); continue; } diff --git a/src/shared/socket-netlink.c b/src/shared/socket-netlink.c index 3fb73563170..5177137b995 100644 --- a/src/shared/socket-netlink.c +++ b/src/shared/socket-netlink.c @@ -30,6 +30,30 @@ int resolve_ifname(sd_netlink **rtnl, const char *name) { return rtnl_resolve_link_alternative_name(rtnl, name); } +int resolve_interface(sd_netlink **rtnl, const char *name) { + int r; + + /* Like resolve_ifname, but resolves interface numbers too. */ + + assert(name); + + r = parse_ifindex(name); + if (r > 0) + return r; + assert(r < 0); + + return resolve_ifname(rtnl, name); +} + +int resolve_interface_or_warn(sd_netlink **rtnl, const char *name) { + int r; + + r = resolve_interface(rtnl, name); + if (r < 0) + return log_error_errno(r, "Failed to resolve interface \"%s\": %m", name); + return r; +} + int socket_address_parse(SocketAddress *a, const char *s) { _cleanup_free_ char *n = NULL; char *e; @@ -318,7 +342,7 @@ int in_addr_ifindex_from_string_auto(const char *s, int *family, union in_addr_u if (suffix) { if (ret_ifindex) { /* If we shall return the interface index, try to parse it */ - ifindex = parse_ifindex_or_ifname(suffix + 1); + ifindex = resolve_interface(NULL, suffix + 1); if (ifindex < 0) return ifindex; } diff --git a/src/shared/socket-netlink.h b/src/shared/socket-netlink.h index d3898572429..fa58409d618 100644 --- a/src/shared/socket-netlink.h +++ b/src/shared/socket-netlink.h @@ -8,6 +8,8 @@ #include "socket-util.h" int resolve_ifname(sd_netlink **rtnl, const char *name); +int resolve_interface(sd_netlink **rtnl, const char *name); +int resolve_interface_or_warn(sd_netlink **rtnl, const char *name); int make_socket_fd(int log_level, const char* address, int type, int flags);