chiark / gitweb /
journal: synchronize seqnum across files
[elogind.git] / src / journal / journald.c
index b8a9fc3adfd8bf1d89b996a6290278c50fa284de..ede314a55f204d7c2fead9bcbbe398522e61be81 100644 (file)
@@ -43,6 +43,8 @@ typedef struct Server {
         JournalFile *runtime_journal;
         JournalFile *system_journal;
         Hashmap *user_journals;
+
+        uint64_t seqnum;
 } Server;
 
 static void fix_perms(JournalFile *f, uid_t uid) {
@@ -95,6 +97,8 @@ static JournalFile* find_journal(Server *s, uid_t uid) {
         char *p;
         int r;
         JournalFile *f;
+        char ids[33];
+        sd_id128_t machine;
 
         assert(s);
 
@@ -105,14 +109,18 @@ static JournalFile* find_journal(Server *s, uid_t uid) {
         if (uid <= 0)
                 return s->system_journal;
 
+        r = sd_id128_get_machine(&machine);
+        if (r < 0)
+                return s->system_journal;
+
         f = hashmap_get(s->user_journals, UINT32_TO_PTR(uid));
         if (f)
                 return f;
 
-        if (asprintf(&p, "/var/log/journal/%lu.journal", (unsigned long) uid) < 0)
+        if (asprintf(&p, "/var/log/journal/%s/user-%lu.journal", sd_id128_to_string(machine, ids), (unsigned long) uid) < 0)
                 return s->system_journal;
 
-        r = journal_file_open(p, O_RDWR|O_CREAT, 0640, &f);
+        r = journal_file_open(p, O_RDWR|O_CREAT, 0640, s->system_journal, &f);
         free(p);
 
         if (r < 0)
@@ -246,7 +254,7 @@ static void process_message(Server *s, const char *buf, struct ucred *ucred, str
         if (!f)
                 log_warning("Dropping message, as we can't find a place to store the data.");
         else {
-                r = journal_file_append_entry(f, NULL, iovec, n, NULL, NULL);
+                r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
 
                 if (r < 0)
                         log_error("Failed to write entry, ignoring: %s", strerror(-r));
@@ -375,7 +383,7 @@ static int system_journal_open(Server *s) {
                 return r;
 
         /* First try to create the machine path, but not the prefix */
-        fn = join("/var/log/journal/", sd_id128_to_string(machine, ids), NULL);
+        fn = strappend("/var/log/journal/", sd_id128_to_string(machine, ids));
         if (!fn)
                 return -ENOMEM;
         (void) mkdir(fn, 0755);
@@ -386,38 +394,36 @@ static int system_journal_open(Server *s) {
         if (!fn)
                 return -ENOMEM;
 
-        r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, &s->system_journal);
+        r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, NULL, &s->system_journal);
         free(fn);
 
-        if (r >= 0)
+        if (r >= 0) {
                 fix_perms(s->system_journal, 0);
-        else if (r == -ENOENT) {
-
-                /* /var didn't work, so try /run, but this time we
-                 * create the prefix too */
-                fn = join("/run/log/journal/", ids, NULL);
-                if (!fn)
-                        return -ENOMEM;
-                (void) mkdir_p(fn, 0755);
-                free(fn);
-
-                /* Then create the runtime journal file */
-                fn = join("/run/log/journal/", ids, "/system.journal", NULL);
-                if (!fn)
-                        return -ENOMEM;
-                r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, &s->runtime_journal);
-                free(fn);
-
-                if (r >= 0)
-                        fix_perms(s->runtime_journal, 0);
+                return r;
         }
 
         if (r < 0 && r != -ENOENT) {
-                log_error("Failed to open journal: %s", strerror(-r));
+                log_error("Failed to open system journal: %s", strerror(-r));
                 return r;
         }
 
-        return 0;
+        /* /var didn't work, so try /run, but this time we
+         * create the prefix too */
+        fn = join("/run/log/journal/", ids, "/system.journal", NULL);
+        if (!fn)
+                return -ENOMEM;
+
+        (void) mkdir_parents(fn, 0755);
+        r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, NULL, &s->runtime_journal);
+        free(fn);
+
+        if (r < 0) {
+                log_error("Failed to open runtime journal: %s", strerror(-r));
+                return r;
+        }
+
+        fix_perms(s->runtime_journal, 0);
+        return r;
 }
 
 static int server_init(Server *s) {
@@ -581,7 +587,7 @@ int main(int argc, char *argv[]) {
         sd_notify(false,
                   "READY=1\n"
                   "STATUS=Processing messages...");
-
+#
         for (;;) {
                 struct epoll_event event;