diff options
Diffstat (limited to 'src/cryptsetup')
-rw-r--r-- | src/cryptsetup/cryptsetup-generator.c | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c index 38c746b8bb..d2e055431e 100644 --- a/src/cryptsetup/cryptsetup-generator.c +++ b/src/cryptsetup/cryptsetup-generator.c @@ -33,11 +33,9 @@ static const char *arg_dest = "/tmp"; static bool arg_enabled = true; static bool arg_read_crypttab = true; - -static char **arg_disks; -static char **arg_options; -static char *arg_keyfile; - +static char **arg_disks = NULL; +static char **arg_options = NULL; +static char *arg_keyfile = NULL; static bool has_option(const char *haystack, const char *needle) { const char *f = haystack; @@ -74,9 +72,11 @@ static int create_disk( const char *password, const char *options) { - _cleanup_free_ char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *from = NULL, *to = NULL, *e = NULL; + _cleanup_free_ char *p = NULL, *n = NULL, *d = NULL, *u = NULL, *to = NULL, *e = NULL; _cleanup_fclose_ FILE *f = NULL; bool noauto, nofail, tmp, swap; + char *from; + int r; assert(name); assert(device); @@ -91,7 +91,11 @@ static int create_disk( return -EINVAL; } - n = unit_name_from_path_instance("systemd-cryptsetup", name, ".service"); + e = unit_name_escape(name); + if (!e) + return log_oom(); + + n = unit_name_build("systemd-cryptsetup", e, ".service"); if (!n) return log_oom(); @@ -119,8 +123,8 @@ static int create_disk( "Description=Cryptography Setup for %I\n" "Documentation=man:systemd-cryptsetup@.service(8) man:crypttab(5)\n" "SourcePath=/etc/crypttab\n" - "Conflicts=umount.target\n" "DefaultDependencies=no\n" + "Conflicts=umount.target\n" "BindsTo=dev-mapper-%i.device\n" "IgnoreOnIsolate=true\n" "After=systemd-readahead-collect.service systemd-readahead-replay.service\n", @@ -131,19 +135,20 @@ static int create_disk( "Before=cryptsetup.target\n"); if (password) { - if (streq(password, "/dev/urandom") || - streq(password, "/dev/random") || - streq(password, "/dev/hw_random")) + if (STR_IN_SET(password, "/dev/urandom", "/dev/random", "/dev/hw_random")) fputs("After=systemd-random-seed.service\n", f); - else if (!streq(password, "-") && !streq(password, "none")) { - _cleanup_free_ char *uu = fstab_node_to_udev_node(password); - if (uu == NULL) + _cleanup_free_ char *uu; + + uu = fstab_node_to_udev_node(password); + if (!uu) return log_oom(); if (is_device_path(uu)) { - _cleanup_free_ char *dd = unit_name_from_path(uu, ".device"); - if (dd == NULL) + _cleanup_free_ char *dd; + + dd = unit_name_from_path(uu, ".device"); + if (!dd) return log_oom(); fprintf(f, "After=%1$s\nRequires=%1$s\n", dd); @@ -184,14 +189,12 @@ static int create_disk( name); fflush(f); - if (ferror(f)) { log_error("Failed to write file %s: %m", p); return -errno; } - if (asprintf(&from, "../%s", n) < 0) - return log_oom(); + from = strappenda("../", n); if (!noauto) { @@ -220,10 +223,6 @@ static int create_disk( } } - e = unit_name_escape(name); - if (!e) - return log_oom(); - free(to); to = strjoin(arg_dest, "/dev-mapper-", e, ".device.requires/", n, NULL); if (!to) @@ -236,20 +235,21 @@ static int create_disk( } if (!noauto && !nofail) { - int r; + free(p); p = strjoin(arg_dest, "/dev-mapper-", e, ".device.d/50-job-timeout-sec-0.conf", NULL); if (!p) return log_oom(); mkdir_parents_label(p, 0755); - r = write_string_file(p, "# Automatically generated by systemd-cryptsetup-generator\n\n" "[Unit]\n" "JobTimeoutSec=0\n"); /* the binary handles timeouts anyway */ - if (r) + if (r < 0) { + log_error("Failed to write device drop-in: %s", strerror(-r)); return r; + } } return 0; @@ -509,13 +509,9 @@ next: k = sscanf(s, "%m[0-9a-fA-F-]=%ms", &proc_uuid, &proc_options); if (k == 2) { if (streq(proc_uuid, device + 5)) { - if (options) - free(options); - options = strdup(proc_options); - if (!options) { - log_oom(); - goto cleanup; - } + free(options); + options = proc_options; + proc_options = NULL; } } else if (!options) { /* |