From: Zbigniew Jędrzejewski-Szmek Date: Wed, 18 Dec 2019 13:18:34 +0000 (+0100) Subject: networkctl: define a helper for interface name resolution X-Git-Tag: v245-rc1~138^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=231d9de1e3e92dc65ee3b7f98294367c0d291a19;p=thirdparty%2Fsystemd.git networkctl: define a helper for interface name resolution --- diff --git a/src/libsystemd/sd-netlink/netlink-util.c b/src/libsystemd/sd-netlink/netlink-util.c index a91db5df5f1..c9d4e3c6079 100644 --- a/src/libsystemd/sd-netlink/netlink-util.c +++ b/src/libsystemd/sd-netlink/netlink-util.c @@ -167,13 +167,12 @@ int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifn return 0; } -int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, int *ret) { +int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL; - int r; + int r, ret; assert(rtnl); assert(name); - assert(ret); if (!*rtnl) { r = sd_netlink_open(rtnl); @@ -193,7 +192,11 @@ int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, int if (r < 0) return r; - return sd_rtnl_message_link_get_ifindex(reply, ret); + r = sd_rtnl_message_link_get_ifindex(reply, &ret); + if (r < 0) + return r; + assert(ret > 0); + return ret; } int rtnl_message_new_synthetic_error(sd_netlink *rtnl, int error, uint32_t serial, sd_netlink_message **ret) { diff --git a/src/libsystemd/sd-netlink/netlink-util.h b/src/libsystemd/sd-netlink/netlink-util.h index 7b007a61c23..55bc12712a0 100644 --- a/src/libsystemd/sd-netlink/netlink-util.h +++ b/src/libsystemd/sd-netlink/netlink-util.h @@ -51,7 +51,7 @@ int rtnl_set_link_name(sd_netlink **rtnl, int ifindex, const char *name); int rtnl_set_link_properties(sd_netlink **rtnl, int ifindex, const char *alias, const struct ether_addr *mac, uint32_t mtu); int rtnl_set_link_alternative_names(sd_netlink **rtnl, int ifindex, char * const *alternative_names); int rtnl_set_link_alternative_names_by_ifname(sd_netlink **rtnl, const char *ifname, char * const *alternative_names); -int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name, int *ret); +int rtnl_resolve_link_alternative_name(sd_netlink **rtnl, const char *name); int rtnl_log_parse_error(int r); int rtnl_log_create_error(int r); diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 0cc018e088c..5cc62841ec4 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -64,6 +64,21 @@ 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; @@ -1880,12 +1895,9 @@ static int link_delete(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - index = parse_ifindex_or_ifname(argv[i]); - if (index < 0) { - r = rtnl_resolve_link_alternative_name(&rtnl, argv[i], &index); - if (r < 0) - return log_error_errno(r, "Failed to resolve interface %s", argv[i]); - } + index = resolve_ifname(&rtnl, argv[i]); + if (index < 0) + return index; r = set_put(indexes, INT_TO_PTR(index)); if (r < 0) @@ -1936,12 +1948,9 @@ 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 = parse_ifindex_or_ifname(argv[i]); - if (index < 0) { - r = rtnl_resolve_link_alternative_name(&rtnl, argv[i], &index); - if (r < 0) - return log_error_errno(r, "Failed to resolve interface %s", argv[i]); - } + index = resolve_ifname(&rtnl, argv[i]); + if (index < 0) + return index; r = link_renew_one(bus, index, argv[i]); if (r < 0 && k >= 0) @@ -1991,12 +2000,9 @@ static int verb_reconfigure(int argc, char *argv[], void *userdata) { return log_oom(); for (i = 1; i < argc; i++) { - index = parse_ifindex_or_ifname(argv[i]); - if (index < 0) { - r = rtnl_resolve_link_alternative_name(&rtnl, argv[i], &index); - if (r < 0) - return log_error_errno(r, "Failed to resolve interface %s", argv[i]); - } + index = resolve_ifname(&rtnl, argv[i]); + if (index < 0) + return index; r = set_put(indexes, INT_TO_PTR(index)); if (r < 0) diff --git a/src/network/networkd-manager-bus.c b/src/network/networkd-manager-bus.c index 8bcce06b854..4db72b33024 100644 --- a/src/network/networkd-manager-bus.c +++ b/src/network/networkd-manager-bus.c @@ -68,8 +68,8 @@ static int method_get_link_by_name(sd_bus_message *message, void *userdata, sd_b index = if_nametoindex(name); if (index <= 0) { - r = rtnl_resolve_link_alternative_name(&manager->rtnl, name, &index); - if (r < 0) + index = rtnl_resolve_link_alternative_name(&manager->rtnl, name); + if (index < 0) return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_LINK, "Link %s not known", name); }