1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-19 22:50:17 +03:00

networkd: work inside containers

Udev does not run in containers, so instead of relying on it to tell us when a
network device is ready to be used by networkd, we simply assume that any
device was fully initialized before being added to the container.
This commit is contained in:
Tom Gundersen 2014-02-12 16:40:24 +01:00
parent 86d0d51942
commit 60ad0c85e5

View File

@ -27,6 +27,7 @@
#include "udev-util.h"
#include "rtnl-util.h"
#include "mkdir.h"
#include "virt.h"
const char* const network_dirs[] = {
"/etc/systemd/network",
@ -63,9 +64,18 @@ int manager_new(Manager **ret) {
if (!m->udev)
return -ENOMEM;
m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
if (!m->udev_monitor)
return -ENOMEM;
/* udev does not initialize devices inside containers,
* so we rely on them being already initialized before
* entering the container */
if (detect_container(NULL) > 0) {
m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "kernel");
if (!m->udev_monitor)
return -ENOMEM;
} else {
m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
if (!m->udev_monitor)
return -ENOMEM;
}
m->links = hashmap_new(uint64_hash_func, uint64_compare_func);
if (!m->links)
@ -179,9 +189,14 @@ int manager_udev_enumerate_links(Manager *m) {
if (r < 0)
return r;
r = udev_enumerate_add_match_is_initialized(e);
if (r < 0)
return r;
/* udev does not initialize devices inside containers,
* so we rely on them being already initialized before
* entering the container */
if (detect_container(NULL) <= 0) {
r = udev_enumerate_add_match_is_initialized(e);
if (r < 0)
return r;
}
r = udev_enumerate_scan_devices(e);
if (r < 0)