]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
nspawn-network: Split off udev checking from parse_interface.
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 19 Dec 2019 20:16:30 +0000 (21:16 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 23 Dec 2019 17:47:36 +0000 (18:47 +0100)
src/nspawn/nspawn-network.c
src/nspawn/nspawn-network.h
src/nspawn/nspawn.c

index fa1ec05b62285df499451fff0870d952d01aeda4..83ce62877a05ddd9b12ab6d7967a3f4d46d657f8 100644 (file)
@@ -395,37 +395,47 @@ int remove_bridge(const char *bridge_name) {
 }
 
 static int parse_interface(const char *name) {
-        _cleanup_(sd_device_unrefp) sd_device *d = NULL;
         int ifi, r;
 
         r = parse_ifindex_or_ifname(name, &ifi);
         if (r < 0)
                 return log_error_errno(r, "Failed to resolve interface %s: %m", name);
 
-        if (path_is_read_only_fs("/sys") <= 0) {
-                char ifi_str[2 + DECIMAL_STR_MAX(int)];
+        return ifi;
+}
 
-                /* udev should be around. */
+int test_network_interface_initialized(const char *name) {
+        _cleanup_(sd_device_unrefp) sd_device *d = NULL;
+        int ifi, r;
+        char ifi_str[2 + DECIMAL_STR_MAX(int)];
 
-                sprintf(ifi_str, "n%i", ifi);
-                r = sd_device_new_from_device_id(&d, ifi_str);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to get device %s: %m", name);
+        if (path_is_read_only_fs("/sys"))
+                return 0;
 
-                r = sd_device_get_is_initialized(d);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to determine whether interface %s is initialized: %m", name);
-                if (r == 0)
-                        return log_error_errno(SYNTHETIC_ERRNO(EBUSY), "Network interface %s is not initialized yet.", name);
+        /* udev should be around. */
 
-                r = device_is_renaming(d);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to determine the interface %s is being renamed: %m", name);
-                if (r > 0)
-                        return log_error_errno(SYNTHETIC_ERRNO(EBUSY), "Interface %s is being renamed.", name);
-        }
+        ifi = parse_interface(name);
+        if (ifi < 0)
+                return ifi;
 
-        return ifi;
+        sprintf(ifi_str, "n%i", ifi);
+        r = sd_device_new_from_device_id(&d, ifi_str);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get device %s: %m", name);
+
+        r = sd_device_get_is_initialized(d);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine whether interface %s is initialized: %m", name);
+        if (r == 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EBUSY), "Network interface %s is not initialized yet.", name);
+
+        r = device_is_renaming(d);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine the interface %s is being renamed: %m", name);
+        if (r > 0)
+                return log_error_errno(SYNTHETIC_ERRNO(EBUSY), "Interface %s is being renamed.", name);
+
+        return 0;
 }
 
 int move_network_interfaces(pid_t pid, char **ifaces) {
index 32ea21ccc80a78bab90ac4b8d7bf90133abc964d..7e83d10bfee801288f937aa1e41aab23408dc6ce 100644 (file)
@@ -5,6 +5,8 @@
 #include <stdbool.h>
 #include <sys/types.h>
 
+int test_network_interface_initialized(const char *name);
+
 int setup_veth(const char *machine_name, pid_t pid, char iface_name[IFNAMSIZ], bool bridge);
 int setup_veth_extra(const char *machine_name, pid_t pid, char **pairs);
 
index 9113f6e323c667b59ce4b033f753332c4ca4abda..13c91c40bfcbb9eb915f19b51a2bc3338a974cb0 100644 (file)
@@ -848,6 +848,10 @@ static int parse_argv(int argc, char *argv[]) {
                                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                        "Network interface name not valid: %s", optarg);
 
+                        r = test_network_interface_initialized(optarg);
+                        if (r < 0)
+                                return r;
+
                         if (strv_extend(&arg_network_interfaces, optarg) < 0)
                                 return log_oom();
 
@@ -861,6 +865,10 @@ static int parse_argv(int argc, char *argv[]) {
                                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                        "MACVLAN network interface name not valid: %s", optarg);
 
+                        r = test_network_interface_initialized(optarg);
+                        if (r < 0)
+                                return r;
+
                         if (strv_extend(&arg_network_macvlan, optarg) < 0)
                                 return log_oom();
 
@@ -874,6 +882,10 @@ static int parse_argv(int argc, char *argv[]) {
                                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                        "IPVLAN network interface name not valid: %s", optarg);
 
+                        r = test_network_interface_initialized(optarg);
+                        if (r < 0)
+                                return r;
+
                         if (strv_extend(&arg_network_ipvlan, optarg) < 0)
                                 return log_oom();