diff options
author | Richard Phibel <rphibel@googlemail.com> | 2022-08-11 20:20:40 +0200 |
---|---|---|
committer | Richard Phibel <rphibel@googlemail.com> | 2022-08-12 18:05:18 +0200 |
commit | 224c853fdf1c0dfb918b1f9eaa79987dda2d9b60 (patch) | |
tree | c823807a60a00145bb461b3b3e73e1ba8887d7a6 /src | |
parent | c94887f10d516d57975770269fcbea76fa0a3838 (diff) | |
download | systemd-224c853fdf1c0dfb918b1f9eaa79987dda2d9b60.tar.gz |
repart: add support for list of definitions directories
Diffstat (limited to 'src')
-rw-r--r-- | src/partition/repart.c | 22 | ||||
-rwxr-xr-x | src/partition/test-repart.sh | 57 |
2 files changed, 70 insertions, 9 deletions
diff --git a/src/partition/repart.c b/src/partition/repart.c index b250be71c8..0c0c0de794 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -95,7 +95,7 @@ static bool arg_dry_run = true; static const char *arg_node = NULL; static char *arg_root = NULL; static char *arg_image = NULL; -static char *arg_definitions = NULL; +static char **arg_definitions = NULL; static bool arg_discard = true; static bool arg_can_factory_reset = false; static int arg_factory_reset = -1; @@ -114,7 +114,7 @@ static uint32_t arg_tpm2_pcr_mask = UINT32_MAX; STATIC_DESTRUCTOR_REGISTER(arg_root, freep); STATIC_DESTRUCTOR_REGISTER(arg_image, freep); -STATIC_DESTRUCTOR_REGISTER(arg_definitions, freep); +STATIC_DESTRUCTOR_REGISTER(arg_definitions, strv_freep); STATIC_DESTRUCTOR_REGISTER(arg_key, erase_and_freep); STATIC_DESTRUCTOR_REGISTER(arg_tpm2_device, freep); @@ -1404,7 +1404,7 @@ static int partition_read_definition(Partition *p, const char *path, const char static int context_read_definitions( Context *context, - const char *directory, + char **directories, const char *root) { _cleanup_strv_free_ char **files = NULL; @@ -1414,11 +1414,9 @@ static int context_read_definitions( assert(context); - dirs = directory ? - STRV_MAKE_CONST(directory) : - (const char* const*)CONF_PATHS_STRV("repart.d"); + dirs = (const char* const*) (directories ?: CONF_PATHS_STRV("repart.d")); - r = conf_files_list_strv(&files, ".conf", directory ? NULL : root, CONF_FILES_REGULAR|CONF_FILES_FILTER_MASKED, dirs); + r = conf_files_list_strv(&files, ".conf", directories ? NULL : root, CONF_FILES_REGULAR|CONF_FILES_FILTER_MASKED, dirs); if (r < 0) return log_error_errno(r, "Failed to enumerate *.conf files: %m"); @@ -4281,11 +4279,15 @@ static int parse_argv(int argc, char *argv[]) { arg_pretty = r; break; - case ARG_DEFINITIONS: - r = parse_path_argument(optarg, false, &arg_definitions); + case ARG_DEFINITIONS: { + _cleanup_free_ char *path = NULL; + r = parse_path_argument(optarg, false, &path); if (r < 0) return r; + if (strv_consume(&arg_definitions, TAKE_PTR(path)) < 0) + return log_oom(); break; + } case ARG_SIZE: { uint64_t parsed, rounded; @@ -4904,6 +4906,8 @@ static int run(int argc, char *argv[]) { if (!context) return log_oom(); + strv_uniq(arg_definitions); + r = context_read_definitions(context, arg_definitions, arg_root); if (r < 0) return r; diff --git a/src/partition/test-repart.sh b/src/partition/test-repart.sh index 13df482e00..1aac7ac108 100755 --- a/src/partition/test-repart.sh +++ b/src/partition/test-repart.sh @@ -272,3 +272,60 @@ diff <(echo "$JSON_OUTPUT") - <<EOF } ] EOF + +echo "### Testing list of definitions directories ###" + +mkdir -p "$D/definitions1" + +cat >"$D/definitions1/root1.conf" <<EOF +[Partition] +Type=swap +SizeMaxBytes=32M +UUID=7b93d1f2-595d-4ce3-b0b9-837fbd9e63b0 +Label=label1 +EOF + +mkdir -p "$D/definitions2" + +cat >"$D/definitions2/root2.conf" <<EOF +[Partition] +Type=swap +SizeMaxBytes=32M +UUID=837c3d67-21b3-478e-be82-7e7f83bf96d3 +Label=label2 +EOF + +rm -f test-definitions + +JSON_OUTPUT=$("$repart" --definitions="$D/definitions1" --definitions="$D/definitions2" --dry-run=yes --empty=create --size=100M --json=pretty test-definitions) + +diff <(echo "$JSON_OUTPUT") - <<EOF +[ + { + "type" : "swap", + "label" : "label1", + "uuid" : "7b93d1f2-595d-4ce3-b0b9-837fbd9e63b0", + "file" : "root1.conf", + "node" : "test-definitions1", + "offset" : 1048576, + "old_size" : 0, + "raw_size" : 33554432, + "old_padding" : 0, + "raw_padding" : 0, + "activity" : "create" + }, + { + "type" : "swap", + "label" : "label2", + "uuid" : "837c3d67-21b3-478e-be82-7e7f83bf96d3", + "file" : "root2.conf", + "node" : "test-definitions2", + "offset" : 34603008, + "old_size" : 0, + "raw_size" : 33554432, + "old_padding" : 0, + "raw_padding" : 0, + "activity" : "create" + } +] +EOF |