chiark / gitweb /
journal: implementation rotation
[elogind.git] / src / journal / journalctl.c
index 7bcd842f6db5db8d3a2a1c8c3b19497210a00512..4645f9ebb015ab539c7cf174f12a08df622e9512 100644 (file)
 #include <errno.h>
 #include <stddef.h>
 
-#include "journal-private.h"
+#include "journal-file.h"
+
+static int system_journal_open(JournalFile **f) {
+        int r;
+        char *fn;
+        sd_id128_t machine;
+        char ids[33];
+
+        assert(f);
+
+        r = sd_id128_get_machine(&machine);
+        if (r < 0)
+                return r;
+
+        fn = join("/var/log/journal/", sd_id128_to_string(machine, ids), "/system.journal", NULL);
+        if (!fn)
+                return -ENOMEM;
+
+        r = journal_file_open(fn, O_RDONLY, 0640, NULL, f);
+        free(fn);
+
+        if (r >= 0)
+                return r;
+
+        if (r < 0 && r != -ENOENT) {
+                log_error("Failed to open system journal: %s", strerror(-r));
+                return r;
+        }
+
+        fn = join("/run/log/journal/", ids, "/system.journal", NULL);
+        if (!fn)
+                return -ENOMEM;
+
+        r = journal_file_open(fn, O_RDONLY, 0640, NULL, f);
+        free(fn);
+
+        if (r < 0) {
+                log_error("Failed to open system journal: %s", strerror(-r));
+                return r;
+        }
+
+        return r;
+}
 
 int main(int argc, char *argv[]) {
         int r;
@@ -33,10 +75,7 @@ int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
 
-        r = journal_file_open("/var/log/journal/system.journal", O_RDONLY, 0644, &f);
-        if (r == -ENOENT)
-                r = journal_file_open("/run/log/journal/system.journal", O_RDONLY, 0644, &f);
-
+        r = system_journal_open(&f);
         if (r < 0) {
                 log_error("Failed to open journal: %s", strerror(-r));
                 return EXIT_FAILURE;
@@ -62,21 +101,16 @@ int main(int argc, char *argv[]) {
                         uint64_t p, l;
 
                         p = le64toh(o->entry.items[i].object_offset);
-                        r = journal_file_move_to_object(f, p, &o);
+                        r = journal_file_move_to_object(f, p, OBJECT_DATA, &o);
                         if (r < 0) {
                                 log_error("Failed to move to data: %s", strerror(-r));
                                 goto finish;
                         }
 
-                        if (le64toh(o->object.type) != OBJECT_DATA) {
-                                log_error("Invalid file");
-                                goto finish;
-                        }
-
                         l = o->object.size - offsetof(Object, data.payload);
                         printf("\t[%.*s]\n", (int) l, o->data.payload);
 
-                        r = journal_file_move_to_object(f, offset, &o);
+                        r = journal_file_move_to_object(f, offset, OBJECT_ENTRY, &o);
                         if (r < 0) {
                                 log_error("Failed to move back to entry: %s", strerror(-r));
                                 goto finish;