X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcryptsetup%2Fcryptsetup-generator.c;h=fd2080b539b75fdfd5457819c0bbeec9b25151a4;hb=737563e4bb1606cae1dd0e9484f9e82da466fe76;hp=0a51db8939dcfe5e123106fe436bd70907d73f94;hpb=24a988e9aa17a476cb5381e2334aaa2a9972ddd2;p=elogind.git diff --git a/src/cryptsetup/cryptsetup-generator.c b/src/cryptsetup/cryptsetup-generator.c index 0a51db893..fd2080b53 100644 --- a/src/cryptsetup/cryptsetup-generator.c +++ b/src/cryptsetup/cryptsetup-generator.c @@ -102,29 +102,44 @@ static int create_disk( return -errno; } - fprintf(f, + fputs( "# Automatically generated by systemd-cryptsetup-generator\n\n" "[Unit]\n" - "Description=Cryptography Setup for %%I\n" + "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" - "BindsTo=%s dev-mapper-%%i.device\n" - "After=systemd-readahead-collect.service systemd-readahead-replay.service %s\n" - "Before=umount.target\n", - d, d); + "BindsTo=dev-mapper-%i.device\n" + "After=systemd-readahead-collect.service systemd-readahead-replay.service\n", + f); if (!nofail) fprintf(f, "Before=cryptsetup.target\n"); - if (password && (streq(password, "/dev/urandom") || - streq(password, "/dev/random") || - streq(password, "/dev/hw_random"))) - fputs("After=systemd-random-seed-load.service\n", f); + if (password) { + if (streq(password, "/dev/urandom") || + streq(password, "/dev/random") || + streq(password, "/dev/hw_random")) + fputs("After=systemd-random-seed-load.service\n", f); + else if (!streq(password, "-") && + !streq(password, "none")) + fprintf(f, + "RequiresMountsFor=%s\n", + password); + } + + if (is_device_path(u)) + fprintf(f, + "BindsTo=%s\n" + "After=%s\n" + "Before=umount.target\n", + d, d); else - fputs("Before=local-fs.target\n", f); + fprintf(f, + "RequiresMountsFor=%s\n", + u); fprintf(f, "\n[Service]\n" @@ -169,8 +184,6 @@ static int create_disk( } free(to); - to = NULL; - if (!nofail) to = strjoin(arg_dest, "/cryptsetup.target.requires/", n, NULL); else @@ -183,12 +196,13 @@ static int create_disk( log_error("Failed to create symlink '%s' to '%s': %m", from, to); return -errno; } - - free(to); - to = NULL; } 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) return log_oom(); @@ -199,6 +213,23 @@ static int create_disk( return -errno; } + 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) + return r; + } + return 0; } @@ -259,26 +290,14 @@ static int parse_proc_cmdline(char ***arg_proc_cmdline_disks) { } } else if (startswith(word, "luks.uuid=")) { - char **t; - - t = strv_append(*arg_proc_cmdline_disks, word + 10); - if (!t) + if (strv_extend(arg_proc_cmdline_disks, word + 10) < 0) return log_oom(); - strv_free(*arg_proc_cmdline_disks); - *arg_proc_cmdline_disks = t; - } else if (startswith(word, "rd.luks.uuid=")) { if (in_initrd()) { - char **t; - - t = strv_append(*arg_proc_cmdline_disks, word + 13); - if (!t) + if (strv_extend(arg_proc_cmdline_disks, word + 13) < 0) return log_oom(); - - strv_free(*arg_proc_cmdline_disks); - *arg_proc_cmdline_disks = t; } } else if (startswith(word, "luks.") || @@ -371,17 +390,11 @@ int main(int argc, char *argv[]) { return log_oom(); if (streq(proc_device, device) || streq(proc_name, name)) { - char **t; - if (create_disk(name, device, password, options) < 0) r = EXIT_FAILURE; - t = strv_append(arg_proc_cmdline_disks_done, p); - if (!t) + if (strv_extend(&arg_proc_cmdline_disks_done, p) < 0) return log_oom(); - - strv_free(arg_proc_cmdline_disks_done); - arg_proc_cmdline_disks_done = t; } } } else {