[systemd-devel] [PATCH 7/7] journal: Try getting journal fd from machined

Krzesimir Nowak krzesimir at endocode.com
Mon Jun 1 08:29:03 PDT 2015


---
 Makefile.am              |  2 +-
 src/journal/sd-journal.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 32e7ca3..ee9c29b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4399,8 +4399,8 @@ systemd_journal_upload_CFLAGS = \
 	$(LIBCURL_CFLAGS)
 
 systemd_journal_upload_LDADD = \
-	libsystemd-internal.la \
 	libsystemd-journal-internal.la \
+	libsystemd-internal.la \
 	libsystemd-shared.la \
 	$(LIBCURL_LIBS)
 
diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c
index 630cc3a..debd45c 100644
--- a/src/journal/sd-journal.c
+++ b/src/journal/sd-journal.c
@@ -28,6 +28,8 @@
 #include <sys/vfs.h>
 #include <linux/magic.h>
 
+#include "bus-error.h"
+#include "bus-util.h"
 #include "sd-journal.h"
 #include "journal-def.h"
 #include "journal-file.h"
@@ -1701,6 +1703,52 @@ fail:
         return r;
 }
 
+static int try_journal_fd(sd_journal *j, const char *machine) {
+        _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
+        _cleanup_bus_close_unref_ sd_bus *bus = NULL;
+        _cleanup_free_ char *p = NULL;
+        int fd;
+        int r;
+
+        r = sd_bus_default_system(&bus);
+        if (r < 0)
+                return log_error_errno(r, "Failed to get D-Bus connection: %m");
+
+        r = sd_bus_call_method(
+                        bus,
+                        "org.freedesktop.machine1",
+                        "/org/freedesktop/machine1",
+                        "org.freedesktop.machine1.Manager",
+                        "GetJournal",
+                        &error,
+                        &reply,
+                        "s", machine);
+        if (r < 0) {
+                log_error("Failed to get journal fd from machined: %s", bus_error_message(&error, r));
+                return r;
+        }
+
+        r = sd_bus_message_read(reply, "h", &fd);
+        if (r < 0)
+                return bus_log_parse_error(r);
+
+        if (fd < 0)
+                return -ENODATA;
+
+        /* TODO: Just some bogus directory name with machine id in it,
+         * so it will look semi-nicely in logs. Is that alright? */
+        p = strjoin("machine://", machine, "/journal", NULL);
+        if (!p)
+                return -ENOMEM;
+
+        r = add_root_directory_with_fd(j, p, fd);
+        if (r < 0)
+                return r;
+
+        return 0;
+}
+
 _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, int flags) {
         _cleanup_free_ char *root = NULL, *class = NULL;
         sd_journal *j;
@@ -1731,7 +1779,9 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in
         j->prefix = root;
         root = NULL;
 
-        r = add_search_paths(j);
+        r = try_journal_fd(j, machine);
+        if (r == -ENODATA)
+                r = add_search_paths(j);
         if (r < 0)
                 goto fail;
 
-- 
2.1.0



More information about the systemd-devel mailing list