chiark / gitweb /
bootchart: parse /etc/os-release rather than system-release
[elogind.git] / src / core / machine-id-setup.c
index 9e84ac0cb990757d6981d1adef8c8d9507bdea12..ca163978f39a885142dade4023c01f2192ed885a 100644 (file)
@@ -35,6 +35,7 @@
 #include "mkdir.h"
 #include "log.h"
 #include "virt.h"
+#include "fileio.h"
 
 static int shorten_uuid(char destination[36], const char *source) {
         unsigned i, j;
@@ -100,7 +101,7 @@ static int generate(char id[34]) {
                         if (k >= 36) {
                                 r = shorten_uuid(id, uuid);
                                 if (r >= 0) {
-                                        log_info("Initializing machine ID from KVM UUID");
+                                        log_info("Initializing machine ID from KVM UUID.");
                                         return 0;
                                 }
                         }
@@ -110,45 +111,22 @@ static int generate(char id[34]) {
         /* If that didn't work either, see if we are running in a
          * container, and a machine ID was passed in via
          * $container_uuid the way libvirt/LXC does it */
-
         r = detect_container(NULL);
         if (r > 0) {
-                FILE *f;
-
-                f = fopen("/proc/1/environ", "re");
-                if (f) {
-                        bool done = false;
-
-                        do {
-                                char line[LINE_MAX];
-                                unsigned i;
+                char *e;
 
-                                for (i = 0; i < sizeof(line)-1; i++) {
-                                        int c;
-
-                                        c = getc(f);
-                                        if (_unlikely_(c == EOF)) {
-                                                done = true;
-                                                break;
-                                        } else if (c == 0)
-                                                break;
-
-                                        line[i] = c;
-                                }
-                                line[i] = 0;
-
-                                if (startswith(line, "container_uuid=") &&
-                                    strlen(line + 15) >= 36) {
-                                        r = shorten_uuid(id, line + 15);
-                                        if (r >= 0) {
-                                                log_info("Initializing machine ID from container UUID");
-                                                return 0;
-                                        }
+                r = getenv_for_pid(1, "container_uuid", &e);
+                if (r > 0) {
+                        if (strlen(e) >= 36) {
+                                r = shorten_uuid(id, e);
+                                if (r >= 0) {
+                                        log_info("Initializing machine ID from container UUID.");
+                                        free(e);
+                                        return 0;
                                 }
+                        }
 
-                        } while (!done);
-
-                        fclose(f);
+                        free(e);
                 }
         }
 
@@ -249,13 +227,17 @@ int machine_id_setup(void) {
         }
 
         /* And now, let's mount it over */
-        r = mount("/run/machine-id", "/etc/machine-id", "bind", MS_BIND|MS_RDONLY, NULL) < 0 ? -errno : 0;
+        r = mount("/run/machine-id", "/etc/machine-id", NULL, MS_BIND, NULL) < 0 ? -errno : 0;
         if (r < 0) {
                 unlink("/run/machine-id");
                 log_error("Failed to mount /etc/machine-id: %s", strerror(-r));
-        } else
+        } else {
                 log_info("Installed transient /etc/machine-id file.");
 
+                /* Mark the mount read-only */
+                mount(NULL, "/etc/machine-id", NULL, MS_BIND|MS_RDONLY|MS_REMOUNT, NULL);
+        }
+
 finish:
 
         if (fd >= 0)