--- src/fstab-generator/fstab-generator.c | 46 +++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) Index: systemd-218/src/fstab-generator/fstab-generator.c =================================================================== --- systemd-218.orig/src/fstab-generator/fstab-generator.c +++ systemd-218/src/fstab-generator/fstab-generator.c @@ -47,6 +47,50 @@ static char *arg_usr_what = NULL; static char *arg_usr_fstype = NULL; static char *arg_usr_options = NULL; +static int check_crypttab(const char *what) { + _cleanup_fclose_ FILE *f = NULL; + unsigned n = 0; + + f = fopen("/etc/crypttab", "re"); + if (!f) { + if (errno != ENOENT) + log_error("Failed to open /etc/crypttab: %m"); + + return 1; + } + + + for (;;) { + char line[LINE_MAX], *l; + _cleanup_free_ char *name = NULL, *device = NULL, *password = NULL, *options = NULL; + int k; + + if (!fgets(line, sizeof(line), f)) + break; + + n++; + + l = strstrip(line); + if (*l == '#' || *l == 0) + continue; + + 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); + continue; + } + + if (strcmp((what + 12), name) == 0) { + if (options && strstr(options, "noauto")) + return 0; + + return 1; + } + } + return 1; +} + + static int mount_find_pri(struct mntent *me, int *ret) { char *end, *opt; unsigned long r; @@ -141,7 +185,7 @@ static int add_swap( if (r < 0) return r; - if (!noauto) { + if (!noauto && check_crypttab(what) != 0) { lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET, nofail ? ".wants/" : ".requires/", name, NULL); if (!lnk)