#include "log.h"
#include "mkdir.h"
#include "path-util.h"
+#include "fstab-util.h"
#include "strv.h"
#include "unit-name.h"
#include "util.h"
typedef struct crypto_device {
char *uuid;
char *keyfile;
+ char *name;
char *options;
bool create;
} crypto_device;
static char *arg_default_options = NULL;
static char *arg_default_keyfile = NULL;
-static bool has_option(const char *haystack, const char *needle) {
- const char *f = haystack;
- size_t l;
-
- assert(needle);
-
- if (!haystack)
- return false;
-
- l = strlen(needle);
-
- while ((f = strstr(f, needle))) {
-
- if (f > haystack && f[-1] != ',') {
- f++;
- continue;
- }
-
- if (f[l] != 0 && f[l] != ',') {
- f++;
- continue;
- }
-
- return true;
- }
-
- return false;
-}
-
static int create_disk(
const char *name,
const char *device,
assert(name);
assert(device);
- noauto = has_option(options, "noauto");
- nofail = has_option(options, "nofail");
- tmp = has_option(options, "tmp");
- swap = has_option(options, "swap");
+ noauto = fstab_test_yes_no_option(options, "noauto\0" "auto\0");
+ nofail = fstab_test_yes_no_option(options, "nofail\0" "fail\0");
+ tmp = fstab_test_option(options, "tmp\0");
+ swap = fstab_test_option(options, "swap\0");
if (tmp && swap) {
log_error("Device '%s' cannot be both 'tmp' and 'swap'. Ignoring.", name);
if (ferror(f))
return log_error_errno(errno, "Failed to write file %s: %m", p);
- from = strappenda("../", n);
+ from = strjoina("../", n);
if (!noauto) {
while ((d = hashmap_steal_first(arg_disks))) {
free(d->uuid);
free(d->keyfile);
+ free(d->name);
free(d->options);
free(d);
}
return NULL;
d->create = false;
- d->keyfile = d->options = NULL;
+ d->keyfile = d->options = d->name = NULL;
d->uuid = strdup(uuid);
if (!d->uuid) {
} else if (free_and_strdup(&arg_default_keyfile, value))
return log_oom();
+ } else if (STR_IN_SET(key, "luks.name", "rd.luks.name") && value) {
+
+ r = sscanf(value, "%m[0-9a-fA-F-]=%ms", &uuid, &uuid_value);
+ if (r == 2) {
+ d = get_crypto_device(uuid);
+ if (!d)
+ return log_oom();
+
+ d->create = arg_whitelist = true;
+
+ free(d->name);
+ d->name = uuid_value;
+ uuid_value = NULL;
+ } else
+ log_warning("Failed to parse luks name switch %s. Ignoring.", value);
+
}
return 0;
HASHMAP_FOREACH(d, arg_disks, i) {
const char *options;
- _cleanup_free_ char *name = NULL, *device = NULL;
+ _cleanup_free_ char *device = NULL;
if (!d->create)
continue;
- name = strappend("luks-", d->uuid);
- if (!name)
- return log_oom();
+ if (!d->name) {
+ d->name = strappend("luks-", d->uuid);
+ if (!d->name)
+ return log_oom();
+ }
device = strappend("UUID=", d->uuid);
if (!device)
else
options = "timeout=0";
- r = create_disk(name, device, d->keyfile ?: arg_default_keyfile, options);
+ r = create_disk(d->name, device, d->keyfile ?: arg_default_keyfile, options);
if (r < 0)
return r;
}