chiark / gitweb /
util: add a bit of syntactic sugar to run short code fragments with a different umask
[elogind.git] / src / core / machine-id-setup.c
index 7f4c23b13004c2beffb546e097c1fd5e1462fa24..fbba3aab78d0f0073a65b34d7374cb8a8c7f24c0 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;
@@ -154,31 +155,27 @@ int machine_id_setup(void) {
         bool writable;
         struct stat st;
         char id[34]; /* 32 + \n + \0 */
-        mode_t m;
 
-        m = umask(0000);
-
-        /* We create this 0444, to indicate that this isn't really
-         * something you should ever modify. Of course, since the file
-         * will be owned by root it doesn't matter much, but maybe
-         * people look. */
+        RUN_WITH_UMASK(0000) {
+                /* We create this 0444, to indicate that this isn't really
+                 * something you should ever modify. Of course, since the file
+                 * will be owned by root it doesn't matter much, but maybe
+                 * people look. */
+
+                fd = open("/etc/machine-id", O_RDWR|O_CREAT|O_CLOEXEC|O_NOCTTY, 0444);
+                if (fd >= 0)
+                        writable = true;
+                else {
+                        fd = open("/etc/machine-id", O_RDONLY|O_CLOEXEC|O_NOCTTY);
+                        if (fd < 0) {
+                                log_error("Cannot open /etc/machine-id: %m");
+                                return -errno;
+                        }
 
-        fd = open("/etc/machine-id", O_RDWR|O_CREAT|O_CLOEXEC|O_NOCTTY, 0444);
-        if (fd >= 0)
-                writable = true;
-        else {
-                fd = open("/etc/machine-id", O_RDONLY|O_CLOEXEC|O_NOCTTY);
-                if (fd < 0) {
-                        umask(m);
-                        log_error("Cannot open /etc/machine-id: %m");
-                        return -errno;
+                        writable = false;
                 }
-
-                writable = false;
         }
 
-        umask(m);
-
         if (fstat(fd, &st) < 0) {
                 log_error("fstat() failed: %m");
                 r = -errno;
@@ -214,10 +211,9 @@ int machine_id_setup(void) {
         /* Hmm, we couldn't write it? So let's write it to
          * /run/machine-id as a replacement */
 
-        m = umask(0022);
-        r = write_one_line_file("/run/machine-id", id);
-        umask(m);
-
+        RUN_WITH_UMASK(0022) {
+                r = write_string_file("/run/machine-id", id);
+        }
         if (r < 0) {
                 log_error("Cannot write /run/machine-id: %s", strerror(-r));
 
@@ -234,7 +230,9 @@ int machine_id_setup(void) {
                 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);
+                if (mount(NULL, "/etc/machine-id", NULL,
+                          MS_BIND|MS_RDONLY|MS_REMOUNT, NULL) < 0)
+                        log_warning("Failed to make transient /etc/machine-id read-only");
         }
 
 finish: