Zbigniew Jędrzejewski-Szmek 126222
From bedb539662380d6a120db1e8dbb63b55d2ecac2c Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 126222
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 126222
Date: Wed, 11 Dec 2013 22:00:33 -0500
Zbigniew Jędrzejewski-Szmek 126222
Subject: [PATCH] nspawn: complain and continue if machine has same id
Zbigniew Jędrzejewski-Szmek 126222
Zbigniew Jędrzejewski-Szmek 126222
If --link-journal=host or --link-journal=guest is used, this totally
Zbigniew Jędrzejewski-Szmek 126222
cannot work and we exit with an error. If however --link-journal=auto
Zbigniew Jędrzejewski-Szmek 126222
or --link-journal=no is used, just display a warning.
Zbigniew Jędrzejewski-Szmek 126222
Zbigniew Jędrzejewski-Szmek 126222
Having the same machine id can happen if booting from the same
Zbigniew Jędrzejewski-Szmek 126222
filesystem as the host. Since other things mostly function correctly,
Zbigniew Jędrzejewski-Szmek 126222
let's allow that.
Zbigniew Jędrzejewski-Szmek 126222
Zbigniew Jędrzejewski-Szmek 126222
https://bugs.freedesktop.org/show_bug.cgi?id=68369
Zbigniew Jędrzejewski-Szmek 126222
---
Zbigniew Jędrzejewski-Szmek 126222
 src/nspawn/nspawn.c | 23 +++++++++++++++++++----
Zbigniew Jędrzejewski-Szmek 126222
 1 file changed, 19 insertions(+), 4 deletions(-)
Zbigniew Jędrzejewski-Szmek 126222
Zbigniew Jędrzejewski-Szmek 126222
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
Zbigniew Jędrzejewski-Szmek 126222
index 7346253..618f9c3 100644
Zbigniew Jędrzejewski-Szmek 126222
--- a/src/nspawn/nspawn.c
Zbigniew Jędrzejewski-Szmek 126222
+++ b/src/nspawn/nspawn.c
Zbigniew Jędrzejewski-Szmek 126222
@@ -811,14 +811,11 @@ static int setup_hostname(void) {
Zbigniew Jędrzejewski-Szmek 126222
 }
Zbigniew Jędrzejewski-Szmek 126222
 
Zbigniew Jędrzejewski-Szmek 126222
 static int setup_journal(const char *directory) {
Zbigniew Jędrzejewski-Szmek 126222
-        sd_id128_t machine_id;
Zbigniew Jędrzejewski-Szmek 126222
+        sd_id128_t machine_id, this_id;
Zbigniew Jędrzejewski-Szmek 126222
         _cleanup_free_ char *p = NULL, *b = NULL, *q = NULL, *d = NULL;
Zbigniew Jędrzejewski-Szmek 126222
         char *id;
Zbigniew Jędrzejewski-Szmek 126222
         int r;
Zbigniew Jędrzejewski-Szmek 126222
 
Zbigniew Jędrzejewski-Szmek 126222
-        if (arg_link_journal == LINK_NO)
Zbigniew Jędrzejewski-Szmek 126222
-                return 0;
Zbigniew Jędrzejewski-Szmek 126222
-
Zbigniew Jędrzejewski-Szmek 126222
         p = strappend(directory, "/etc/machine-id");
Zbigniew Jędrzejewski-Szmek 126222
         if (!p)
Zbigniew Jędrzejewski-Szmek 126222
                 return log_oom();
Zbigniew Jędrzejewski-Szmek 126222
@@ -842,6 +839,24 @@ static int setup_journal(const char *directory) {
Zbigniew Jędrzejewski-Szmek 126222
                 return r;
Zbigniew Jędrzejewski-Szmek 126222
         }
Zbigniew Jędrzejewski-Szmek 126222
 
Zbigniew Jędrzejewski-Szmek 126222
+        r = sd_id128_get_machine(&this_id);
Zbigniew Jędrzejewski-Szmek 126222
+        if (r < 0) {
Zbigniew Jędrzejewski-Szmek 126222
+                log_error("Failed to retrieve machine ID: %s", strerror(-r));
Zbigniew Jędrzejewski-Szmek 126222
+                return r;
Zbigniew Jędrzejewski-Szmek 126222
+        }
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
+        if (sd_id128_equal(machine_id, this_id)) {
Zbigniew Jędrzejewski-Szmek 126222
+                log_full(arg_link_journal == LINK_AUTO ? LOG_WARNING : LOG_ERR,
Zbigniew Jędrzejewski-Szmek 126222
+                         "Host and machine ids are equal (%s): refusing to link journals", id);
Zbigniew Jędrzejewski-Szmek 126222
+                if (arg_link_journal == LINK_AUTO)
Zbigniew Jędrzejewski-Szmek 126222
+                        return 0;
Zbigniew Jędrzejewski-Szmek 126222
+                return
Zbigniew Jędrzejewski-Szmek 126222
+                        -EEXIST;
Zbigniew Jędrzejewski-Szmek 126222
+        }
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
+        if (arg_link_journal == LINK_NO)
Zbigniew Jędrzejewski-Szmek 126222
+                return 0;
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
         free(p);
Zbigniew Jędrzejewski-Szmek 126222
         p = strappend("/var/log/journal/", id);
Zbigniew Jędrzejewski-Szmek 126222
         q = strjoin(directory, "/var/log/journal/", id, NULL);