]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/nspawn/nspawn-network.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / nspawn / nspawn-network.c
index 90852b9c757de869e2d782e5df15c33dcf2e1774..c028b5755a841bf39890c94c8b0f238aff072f1e 100644 (file)
@@ -1,28 +1,24 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
-/***
-  This file is part of systemd.
-
-  Copyright 2015 Lennart Poettering
-***/
 
 #include <linux/veth.h>
 #include <net/if.h>
 #include <sys/file.h>
 
-#include "libudev.h"
+#include "sd-device.h"
 #include "sd-id128.h"
 #include "sd-netlink.h"
 
 #include "alloc-util.h"
 #include "ether-addr-util.h"
 #include "lockfile-util.h"
+#include "missing_network.h"
 #include "netlink-util.h"
 #include "nspawn-network.h"
 #include "siphash24.h"
 #include "socket-util.h"
 #include "stat-util.h"
 #include "string-util.h"
-#include "udev-util.h"
+#include "strv.h"
 #include "util.h"
 
 #define HOST_HASH_KEY SD_ID128_MAKE(1a,37,6f,c7,46,ec,45,0b,ad,a3,d5,31,06,60,5d,b1)
@@ -71,7 +67,7 @@ static int generate_mac(
         if (idx > 0)
                 sz += sizeof(idx);
 
-        v = alloca(sz);
+        v = newa(uint8_t, sz);
 
         /* fetch some persistent data unique to the host */
         r = sd_id128_get_machine((sd_id128_t*) v);
@@ -325,7 +321,7 @@ static int create_bridge(sd_netlink *rtnl, const char *bridge_name) {
 }
 
 int setup_bridge(const char *veth_name, const char *bridge_name, bool create) {
-        _cleanup_release_lock_file_ LockFile bridge_lock = LOCK_FILE_INIT;
+        _cleanup_(release_lock_file) LockFile bridge_lock = LOCK_FILE_INIT;
         _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
         int r, bridge_ifi;
         unsigned n = 0;
@@ -366,7 +362,7 @@ int setup_bridge(const char *veth_name, const char *bridge_name, bool create) {
 }
 
 int remove_bridge(const char *bridge_name) {
-        _cleanup_release_lock_file_ LockFile bridge_lock = LOCK_FILE_INIT;
+        _cleanup_(release_lock_file) LockFile bridge_lock = LOCK_FILE_INIT;
         _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
         const char *path;
         int r;
@@ -397,21 +393,24 @@ int remove_bridge(const char *bridge_name) {
         return remove_one_link(rtnl, bridge_name);
 }
 
-static int parse_interface(struct udev *udev, const char *name) {
-        _cleanup_udev_device_unref_ struct udev_device *d = NULL;
+static int parse_interface(const char *name) {
+        _cleanup_(sd_device_unrefp) sd_device *d = NULL;
         char ifi_str[2 + DECIMAL_STR_MAX(int)];
-        int ifi;
+        int ifi, r;
 
         ifi = (int) if_nametoindex(name);
         if (ifi <= 0)
                 return log_error_errno(errno, "Failed to resolve interface %s: %m", name);
 
         sprintf(ifi_str, "n%i", ifi);
-        d = udev_device_new_from_device_id(udev, ifi_str);
-        if (!d)
-                return log_error_errno(errno, "Failed to get udev device for interface %s: %m", name);
+        r = sd_device_new_from_device_id(&d, ifi_str);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get device for interface %s: %m", name);
 
-        if (udev_device_get_is_initialized(d) <= 0) {
+        r = sd_device_get_is_initialized(d);
+        if (r < 0)
+                return log_error_errno(r, "Failed to determine whether interface %s is initialized or not: %m", name);
+        if (r == 0) {
                 log_error("Network interface %s is not initialized yet.", name);
                 return -EBUSY;
         }
@@ -420,7 +419,6 @@ static int parse_interface(struct udev *udev, const char *name) {
 }
 
 int move_network_interfaces(pid_t pid, char **ifaces) {
-        _cleanup_udev_unref_ struct udev *udev = NULL;
         _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
         char **i;
         int r;
@@ -432,17 +430,11 @@ int move_network_interfaces(pid_t pid, char **ifaces) {
         if (r < 0)
                 return log_error_errno(r, "Failed to connect to netlink: %m");
 
-        udev = udev_new();
-        if (!udev) {
-                log_error("Failed to connect to udev.");
-                return -ENOMEM;
-        }
-
         STRV_FOREACH(i, ifaces) {
                 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
                 int ifi;
 
-                ifi = parse_interface(udev, *i);
+                ifi = parse_interface(*i);
                 if (ifi < 0)
                         return ifi;
 
@@ -463,7 +455,6 @@ int move_network_interfaces(pid_t pid, char **ifaces) {
 }
 
 int setup_macvlan(const char *machine_name, pid_t pid, char **ifaces) {
-        _cleanup_udev_unref_ struct udev *udev = NULL;
         _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
         unsigned idx = 0;
         char **i;
@@ -476,19 +467,13 @@ int setup_macvlan(const char *machine_name, pid_t pid, char **ifaces) {
         if (r < 0)
                 return log_error_errno(r, "Failed to connect to netlink: %m");
 
-        udev = udev_new();
-        if (!udev) {
-                log_error("Failed to connect to udev.");
-                return -ENOMEM;
-        }
-
         STRV_FOREACH(i, ifaces) {
                 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
                 _cleanup_free_ char *n = NULL;
                 struct ether_addr mac;
                 int ifi;
 
-                ifi = parse_interface(udev, *i);
+                ifi = parse_interface(*i);
                 if (ifi < 0)
                         return ifi;
 
@@ -551,7 +536,6 @@ int setup_macvlan(const char *machine_name, pid_t pid, char **ifaces) {
 }
 
 int setup_ipvlan(const char *machine_name, pid_t pid, char **ifaces) {
-        _cleanup_udev_unref_ struct udev *udev = NULL;
         _cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
         char **i;
         int r;
@@ -563,18 +547,12 @@ int setup_ipvlan(const char *machine_name, pid_t pid, char **ifaces) {
         if (r < 0)
                 return log_error_errno(r, "Failed to connect to netlink: %m");
 
-        udev = udev_new();
-        if (!udev) {
-                log_error("Failed to connect to udev.");
-                return -ENOMEM;
-        }
-
         STRV_FOREACH(i, ifaces) {
                 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
                 _cleanup_free_ char *n = NULL;
                 int ifi;
 
-                ifi = parse_interface(udev, *i);
+                ifi = parse_interface(*i);
                 if (ifi < 0)
                         return ifi;