]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Resolve alternative ifnames wherever we would resolve an interface name
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 11 Jan 2020 10:21:01 +0000 (11:21 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 12 Jan 2020 10:24:35 +0000 (11:24 +0100)
To keep the names manageable, "ifname_or_ifindex" is replaced by "interface".

src/basic/parse-util.c
src/basic/parse-util.h
src/libsystemd/sd-netlink/netlink-util.c
src/network/networkctl.c
src/network/networkd-route.c
src/nspawn/nspawn-network.c
src/resolve/resolvectl.c
src/shared/socket-netlink.c
src/shared/socket-netlink.h

index d3140cc1a401a8ba172e35f2b94f94d989acbbf9..b644c4a4d6043eb51069c55e112d93158d69cc13 100644 (file)
@@ -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;
index b20f5b52ccea2930013abd451f01ec8940255d77..c6d1d249672222eed0a5c0e52a1d41a05e86d8b5 100644 (file)
@@ -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);
index 0b2d171b2d29fbe88da53c6f4d3079a17a1b826d..9c6a5d29f6e0f5f67d15e06c3d6901784ed87ae7 100644 (file)
@@ -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;
 
index 5cc62841ec4a6db8cb600efd16c8b1e09c845c57..e1865152057fcb9b864f7c2bd55d7524ed4251f6 100644 (file)
@@ -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;
 
index 2223a356da89bda0f62ca22e9f25722745e05bcf..2df8b864e881e8da1c8b92bd4d407abf9a387b13 100644 (file)
@@ -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);
index b2592b023dd8aa32c714eb26005d4eb46d7250ee..da074d77c653968c70ba16c2e5e71b81ed4f0913 100644 (file)
@@ -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;
 
index cabb3f6c6994107f195850b122f4939ba42007fe..2dceaa5d2150617088bf4ed3d2f830396a40e2db 100644 (file)
@@ -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;
                         }
 
index 3fb73563170171e43a81192c1b8eee36eaccf38d..5177137b995d0744e6d4e6b37670a45041cb1773 100644 (file)
@@ -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;
                 }
index d389857242994a32a9f5931283746fd154c1262f..fa58409d6182f77c937cf52f149d2574d969faa7 100644 (file)
@@ -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);