cryptsetup: Add dependency for detached header

Fixes #12650

cryptsetup: Extract dependency check to a separate function

cryptsetup: style improvements, error checking
Return early on failure/nothing to do
Removed braces from single-line ifs
Check return value of  fstab_filter_options

cryptsetup: code style
This commit is contained in:
Roberto Santalla
2019-05-30 09:42:50 +02:00
committed by Zbigniew Jędrzejewski-Szmek
parent 6bd1457afe
commit 38ab1ec9c8
+56 -24
View File
@@ -106,6 +106,47 @@ static int generate_keydev_mount(const char *name, const char *keydev, char **un
return 0;
}
static int print_dependencies(FILE *f, const char* device_path) {
int r;
if (STR_IN_SET(device_path, "-", "none"))
/* None, nothing to do */
return 0;
if (PATH_IN_SET(device_path, "/dev/urandom", "/dev/random", "/dev/hw_random")) {
/* RNG device, add random dep */
fputs("After=systemd-random-seed.service\n", f);
return 0;
}
_cleanup_free_ char *udev_node = fstab_node_to_udev_node(device_path);
if (!udev_node)
return log_oom();
if (path_equal(udev_node, "/dev/null"))
return 0;
if (path_startswith(udev_node, "/dev/")) {
/* We are dealing with a block device, add dependency for correspoding unit */
_cleanup_free_ char *unit = NULL;
r = unit_name_from_path(udev_node, ".device", &unit);
if (r < 0)
return log_error_errno(r, "Failed to generate unit name: %m");
fprintf(f, "After=%1$s\nRequires=%1$s\n", unit);
} else {
/* Regular file, add mount dependency */
_cleanup_free_ char *escaped_path = specifier_escape(device_path);
if (!escaped_path)
return log_oom();
fprintf(f, "RequiresMountsFor=%s\n", escaped_path);
}
return 0;
}
static int create_disk(
const char *name,
const char *device,
@@ -114,11 +155,11 @@ static int create_disk(
const char *options) {
_cleanup_free_ char *n = NULL, *d = NULL, *u = NULL, *e = NULL,
*filtered = NULL, *u_escaped = NULL, *password_escaped = NULL, *filtered_escaped = NULL, *name_escaped = NULL, *keydev_mount = NULL;
*filtered = NULL, *u_escaped = NULL, *password_escaped = NULL, *filtered_escaped = NULL, *name_escaped = NULL, *keydev_mount = NULL, *header_path = NULL;
_cleanup_fclose_ FILE *f = NULL;
const char *dmname;
bool noauto, nofail, tmp, swap, netdev;
int r;
int r, detached_header;
assert(name);
assert(device);
@@ -129,6 +170,10 @@ static int create_disk(
swap = fstab_test_option(options, "swap\0");
netdev = fstab_test_option(options, "_netdev\0");
detached_header = fstab_filter_options(options, "header\0", NULL, &header_path, NULL);
if (detached_header < 0)
return log_error_errno(detached_header, "Failed to parse header= option value: %m");
if (tmp && swap)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Device '%s' cannot be both 'tmp' and 'swap'. Ignoring.",
@@ -203,29 +248,16 @@ static int create_disk(
netdev ? "remote-cryptsetup.target" : "cryptsetup.target");
if (password) {
if (PATH_IN_SET(password, "/dev/urandom", "/dev/random", "/dev/hw_random"))
fputs("After=systemd-random-seed.service\n", f);
else if (!STR_IN_SET(password, "-", "none")) {
_cleanup_free_ char *uu;
r = print_dependencies(f, password);
if (r < 0)
return r;
}
uu = fstab_node_to_udev_node(password);
if (!uu)
return log_oom();
if (!path_equal(uu, "/dev/null")) {
if (path_startswith(uu, "/dev/")) {
_cleanup_free_ char *dd = NULL;
r = unit_name_from_path(uu, ".device", &dd);
if (r < 0)
return log_error_errno(r, "Failed to generate unit name: %m");
fprintf(f, "After=%1$s\nRequires=%1$s\n", dd);
} else
fprintf(f, "RequiresMountsFor=%s\n", password_escaped);
}
}
/* Check if a header option was specified */
if (detached_header > 0) {
r = print_dependencies(f, header_path);
if (r < 0)
return r;
}
if (path_startswith(u, "/dev/")) {