nspawn: tweak check whether resolved is around a bit
authorLennart Poettering <lennart@poettering.net>
Thu, 16 Feb 2017 16:56:10 +0000 (17:56 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 17 Feb 2017 21:06:31 +0000 (16:06 -0500)
Let's check D-Bus instead of files in /run to see if resolved is
running. This is a bit nicer as bus names are automatically cleaned up
when resolved dies, which is not the case for files in /run.

See: #4649

src/nspawn/nspawn.c

index b172b44..72d1bb5 100644 (file)
@@ -41,6 +41,7 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
+#include "sd-bus.h"
 #include "sd-daemon.h"
 #include "sd-id128.h"
 
@@ -49,6 +50,7 @@
 #include "base-filesystem.h"
 #include "blkid-util.h"
 #include "btrfs-util.h"
+#include "bus-util.h"
 #include "cap-list.h"
 #include "capability-util.h"
 #include "cgroup-util.h"
@@ -1323,6 +1325,19 @@ static int setup_timezone(const char *dest) {
         return 0;
 }
 
+static int resolved_running(void) {
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
+        int r;
+
+        /* Check if resolved is running */
+
+        r = sd_bus_open_system(&bus);
+        if (r < 0)
+                return r;
+
+        return bus_name_has_owner(bus, "org.freedesktop.resolve1", NULL);
+}
+
 static int setup_resolv_conf(const char *dest) {
         _cleanup_free_ char *resolved = NULL, *etc = NULL;
         const char *where;
@@ -1346,8 +1361,8 @@ static int setup_resolv_conf(const char *dest) {
                 return 0;
         }
 
-        if (access("/run/systemd/resolve/resolv.conf", F_OK) >= 0 &&
-            access("/usr/lib/systemd/resolv.conf", F_OK) >= 0) {
+        if (access("/usr/lib/systemd/resolv.conf", F_OK) >= 0 &&
+            resolved_running() > 0) {
 
                 /* resolved is enabled on the host. In this, case bind mount its static resolv.conf file into the
                  * container, so that the container can use the host's resolver. Given that network namespacing is