From: Zbigniew Jędrzejewski-Szmek Date: Fri, 10 Jan 2020 20:18:31 +0000 (+0100) Subject: util-lib: add function to resolve "alternative" names X-Git-Tag: v245-rc1~138^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fc2ea97ad03baaa480253034b2f709e82bbc0fe1;p=thirdparty%2Fsystemd.git util-lib: add function to resolve "alternative" names Calls to if_nametoindex() are expected to use resolve_ifname() instead. --- diff --git a/src/network/networkd-manager-bus.c b/src/network/networkd-manager-bus.c index 4db72b33024..660c2847eb3 100644 --- a/src/network/networkd-manager-bus.c +++ b/src/network/networkd-manager-bus.c @@ -7,12 +7,12 @@ #include "alloc-util.h" #include "bus-common-errors.h" #include "bus-util.h" -#include "netlink-util.h" #include "networkd-link-bus.h" #include "networkd-link.h" #include "networkd-manager-bus.h" #include "networkd-manager.h" #include "path-util.h" +#include "socket-netlink.h" #include "strv.h" #include "user-util.h" @@ -66,12 +66,9 @@ static int method_get_link_by_name(sd_bus_message *message, void *userdata, sd_b if (r < 0) return r; - index = if_nametoindex(name); - if (index <= 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); - } + index = resolve_ifname(&manager->rtnl, name); + if (index < 0) + return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_LINK, "Link %s cannot be resolved", name); link = hashmap_get(manager->links, INT_TO_PTR(index)); if (!link) diff --git a/src/shared/socket-netlink.c b/src/shared/socket-netlink.c index 9f992d3e2f2..3fb73563170 100644 --- a/src/shared/socket-netlink.c +++ b/src/shared/socket-netlink.c @@ -10,11 +10,26 @@ #include "extract-word.h" #include "log.h" #include "memory-util.h" +#include "netlink-util.h" #include "parse-util.h" #include "socket-netlink.h" #include "socket-util.h" #include "string-util.h" +int resolve_ifname(sd_netlink **rtnl, const char *name) { + int r; + + /* Like if_nametoindex, but resolves "alternative names" too. */ + + assert(name); + + r = if_nametoindex(name); + if (r > 0) + return r; + + return rtnl_resolve_link_alternative_name(rtnl, name); +} + int socket_address_parse(SocketAddress *a, const char *s) { _cleanup_free_ char *n = NULL; char *e; @@ -140,15 +155,12 @@ int socket_address_parse(SocketAddress *a, const char *s) { a->sockaddr.in.sin_port = htobe16(port); a->size = sizeof(struct sockaddr_in); } else { - unsigned idx; - - if (strlen(n) > IF_NAMESIZE-1) - return -EINVAL; + int idx; /* Uh, our last resort, an interface name */ - idx = if_nametoindex(n); - if (idx == 0) - return -EINVAL; + idx = resolve_ifname(NULL, n); + if (idx < 0) + return idx; a->sockaddr.in6.sin6_family = AF_INET6; a->sockaddr.in6.sin6_port = htobe16(port); diff --git a/src/shared/socket-netlink.h b/src/shared/socket-netlink.h index 8808c589b77..d3898572429 100644 --- a/src/shared/socket-netlink.h +++ b/src/shared/socket-netlink.h @@ -1,10 +1,14 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #pragma once +#include "sd-netlink.h" + #include "in-addr-util.h" #include "macro.h" #include "socket-util.h" +int resolve_ifname(sd_netlink **rtnl, const char *name); + int make_socket_fd(int log_level, const char* address, int type, int flags); int socket_address_parse(SocketAddress *a, const char *s);