From: Lennart Poettering Date: Tue, 16 Jun 2020 09:43:11 +0000 (+0200) Subject: repart: add simple specifier expansion in Label= X-Git-Tag: v246-rc1~136^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e031166e15184d861bcfc0dfe8d6378178b89e74;p=thirdparty%2Fsystemd.git repart: add simple specifier expansion in Label= Strictly speaking this is a compat breakage, but given the tool was added only in the last release, let's try to sail under the radar, and fix this early before anyone notices it wasn't supported always. --- diff --git a/man/repart.d.xml b/man/repart.d.xml index f2c155e2002..648d32625f8 100644 --- a/man/repart.d.xml +++ b/man/repart.d.xml @@ -1,7 +1,8 @@ - + repart.d @@ -214,7 +215,7 @@ setting is not used for matching. It is also not used when a label is already set for an existing partition. It is thus only used when a partition is newly created or when an existing one had a no label set (that is: an empty label). If not specified a label derived from the partition type is - automatically used. + automatically used. Simple specifier expansion is supported, see below. @@ -315,6 +316,40 @@ + + Specifiers + + Specifiers may be used in the Label= setting. The following expansions are understood: + + Specifiers available + + + + + + + Specifier + Meaning + Details + + + + + + + + + + + + + + + + +
+
+ Examples diff --git a/src/partition/repart.c b/src/partition/repart.c index 4c6e4595299..76fc8bd1c96 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -41,6 +41,7 @@ #include "pretty-print.h" #include "proc-cmdline.h" #include "sort-util.h" +#include "specifier.h" #include "stat-util.h" #include "stdio-util.h" #include "string-util.h" @@ -857,20 +858,42 @@ static int config_parse_label( void *data, void *userdata) { + static const Specifier specifier_table[] = { + { 'm', specifier_machine_id, NULL }, + { 'b', specifier_boot_id, NULL }, + { 'H', specifier_host_name, NULL }, + { 'l', specifier_short_host_name, NULL }, + { 'v', specifier_kernel_release, NULL }, + { 'a', specifier_architecture, NULL }, + { 'o', specifier_os_id, NULL }, + { 'w', specifier_os_version_id, NULL }, + { 'B', specifier_os_build_id, NULL }, + { 'W', specifier_os_variant_id, NULL }, + {} + }; + _cleanup_free_ char16_t *recoded = NULL; + _cleanup_free_ char *resolved = NULL; char **label = data; int r; assert(rvalue); assert(label); - if (!utf8_is_valid(rvalue)) { + r = specifier_printf(rvalue, specifier_table, NULL, &resolved); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to expand specifiers in Label=, ignoring: %s", rvalue); + return 0; + } + + if (!utf8_is_valid(resolved)) { log_syntax(unit, LOG_WARNING, filename, line, 0, "Partition label not valid UTF-8, ignoring: %s", rvalue); return 0; } - recoded = utf8_to_utf16(rvalue, strlen(rvalue)); + recoded = utf8_to_utf16(resolved, strlen(resolved)); if (!recoded) return log_oom(); @@ -880,10 +903,7 @@ static int config_parse_label( return 0; } - r = free_and_strdup(label, rvalue); - if (r < 0) - return log_oom(); - + free_and_replace(*label, resolved); return 0; } diff --git a/src/partition/test-repart.sh b/src/partition/test-repart.sh index e1ff357929d..897f11411a9 100755 --- a/src/partition/test-repart.sh +++ b/src/partition/test-repart.sh @@ -33,6 +33,7 @@ ln -s root.conf $D/definitions/root2.conf cat >$D/definitions/home.conf < $D/definitions/swap.conf <$D/populated +UNAME=`uname -r` + cmp $D/populated - <