chiark / gitweb /
log: make sure generators never log into the journal to avoid activation deadlocks
[elogind.git] / src / cryptsetup / cryptsetup-generator.c
index ba59b49b014380ccb107fe885e69418981c636bd..7eb122d27618794ba52c4783450a26eac251c212 100644 (file)
@@ -6,16 +6,16 @@
   Copyright 2010 Lennart Poettering
 
   systemd is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
   (at your option) any later version.
 
   systemd is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
+  Lesser General Public License for more details.
 
-  You should have received a copy of the GNU General Public License
+  You should have received a copy of the GNU Lesser General Public License
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
@@ -26,6 +26,7 @@
 #include "log.h"
 #include "util.h"
 #include "unit-name.h"
+#include "mkdir.h"
 
 const char *arg_dest = "/tmp";
 
@@ -75,37 +76,43 @@ static int create_disk(
         noauto = has_option(options, "noauto");
         nofail = has_option(options, "nofail");
 
-        if (!(n = unit_name_build_escape("cryptsetup", name, ".service"))) {
+        n = unit_name_build_escape("cryptsetup", name, ".service");
+        if (!n) {
                 r = -ENOMEM;
                 log_error("Failed to allocate unit name.");
                 goto fail;
         }
 
-        if (asprintf(&p, "%s/%s", arg_dest, n) < 0) {
+        p = join(arg_dest, "/", n, NULL);
+        if (!p) {
                 r = -ENOMEM;
                 log_error("Failed to allocate unit file name.");
                 goto fail;
         }
 
-        if (!(u = fstab_node_to_udev_node(device))) {
+        u = fstab_node_to_udev_node(device);
+        if (!u) {
                 r = -ENOMEM;
                 log_error("Failed to allocate device node.");
                 goto fail;
         }
 
-        if (!(d = unit_name_from_path(u, ".device"))) {
+        d = unit_name_from_path(u, ".device");
+        if (!d) {
                 r = -ENOMEM;
                 log_error("Failed to allocate device name.");
                 goto fail;
         }
 
-        if (!(f = fopen(p, "wxe"))) {
+        f = fopen(p, "wxe");
+        if (!f) {
                 r = -errno;
                 log_error("Failed to create unit file: %m");
                 goto fail;
         }
 
         fprintf(f,
+                "# Automatically generated by systemd-cryptsetup-generator\n\n"
                 "[Unit]\n"
                 "Description=Cryptography Setup for %%I\n"
                 "Conflicts=umount.target\n"
@@ -163,13 +170,13 @@ static int create_disk(
 
         if (!noauto) {
 
-                if (asprintf(&to, "%s/%s.wants/%s", arg_dest, d, n) < 0) {
+                to = join(arg_dest, "/", d, ".wants/", n, NULL);
+                if (!to) {
                         r = -ENOMEM;
                         goto fail;
                 }
 
                 mkdir_parents(to, 0755);
-
                 if (symlink(from, to) < 0) {
                         log_error("Failed to create symlink '%s' to '%s': %m", from, to);
                         r = -errno;
@@ -177,38 +184,35 @@ static int create_disk(
                 }
 
                 free(to);
-                to = NULL;
 
                 if (!nofail)
-                        asprintf(&to, "%s/cryptsetup.target.requires/%s", arg_dest, n);
+                        to = join(arg_dest, "/cryptsetup.target.requires/", n, NULL);
                 else
-                        asprintf(&to, "%s/cryptsetup.target.wants/%s", arg_dest, n);
-
+                        to = join(arg_dest, "/cryptsetup.target.wants/", n, NULL);
                 if (!to) {
                         r = -ENOMEM;
                         goto fail;
                 }
 
                 mkdir_parents(to, 0755);
-
                 if (symlink(from, to) < 0) {
                         log_error("Failed to create symlink '%s' to '%s': %m", from, to);
                         r = -errno;
                         goto fail;
                 }
-        }
 
-        free(to);
-        to = NULL;
+                free(to);
+                to = NULL;
+        }
 
         e = unit_name_escape(name);
-        if (asprintf(&to, "%s/dev-mapper-%s.device.requires/%s", arg_dest, e, n) < 0) {
+        to = join(arg_dest, "/dev-mapper-", e, ".device.requires/", n, NULL);
+        if (!to) {
                 r = -ENOMEM;
                 goto fail;
         }
 
         mkdir_parents(to, 0755);
-
         if (symlink(from, to) < 0) {
                 log_error("Failed to create symlink '%s' to '%s': %m", from, to);
                 r = -errno;
@@ -245,13 +249,14 @@ int main(int argc, char *argv[]) {
         if (argc > 1)
                 arg_dest = argv[1];
 
-        log_set_target(LOG_TARGET_AUTO);
+        log_set_target(LOG_TARGET_SAFE);
         log_parse_environment();
         log_open();
 
         umask(0022);
 
-        if (!(f = fopen("/etc/crypttab", "re"))) {
+        f = fopen("/etc/crypttab", "re");
+        if (!f) {
 
                 if (errno == ENOENT)
                         r = EXIT_SUCCESS;
@@ -268,7 +273,7 @@ int main(int argc, char *argv[]) {
                 char *name = NULL, *device = NULL, *password = NULL, *options = NULL;
                 int k;
 
-                if (!(fgets(line, sizeof(line), f)))
+                if (!fgets(line, sizeof(line), f))
                         break;
 
                 n++;
@@ -277,7 +282,8 @@ int main(int argc, char *argv[]) {
                 if (*l == '#' || *l == 0)
                         continue;
 
-                if ((k = sscanf(l, "%ms %ms %ms %ms", &name, &device, &password, &options)) < 2 || k > 4) {
+                k = sscanf(l, "%ms %ms %ms %ms", &name, &device, &password, &options);
+                if (k < 2 || k > 4) {
                         log_error("Failed to parse /etc/crypttab:%u, ignoring.", n);
                         r = EXIT_FAILURE;
                         goto next;