From: Zbigniew Jędrzejewski-Szmek Date: Wed, 10 Dec 2025 14:20:47 +0000 (+0100) Subject: homectl: split out helper parse_language_field X-Git-Tag: v260-rc1~391^2~13 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=873d38eac92e794d791552831d8d3fff3effafc0;p=thirdparty%2Fsystemd.git homectl: split out helper parse_language_field --- diff --git a/src/home/homectl.c b/src/home/homectl.c index 67f492d11cb..fc5d92feb06 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -3419,6 +3419,43 @@ static int parse_environment_field(sd_json_variant **identity, const char *field return 0; } +static int parse_language_field(char ***languages, const char *arg) { + int r; + + if (isempty(arg)) { + FOREACH_STRING(prop, "preferredLanguage", "additionalLanguages") { + r = drop_from_identity(prop); + if (r < 0) + return r; + } + + strv_freep(languages); + return 0; + } + + for (const char *p = arg;;) { + _cleanup_free_ char *word = NULL; + + r = extract_first_word(&p, &word, ",:", 0); + if (r < 0) + return log_error_errno(r, "Failed to parse locale list: %m"); + if (r == 0) + return 0; + + if (!locale_is_valid(word)) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Locale '%s' is not valid.", word); + + if (locale_is_installed(word) <= 0) + log_warning("Locale '%s' is not installed, accepting anyway.", word); + + r = strv_consume(languages, TAKE_PTR(word)); + if (r < 0) + return log_oom(); + + strv_uniq(*languages); + } +} + static int help(int argc, char *argv[], void *userdata) { _cleanup_free_ char *link = NULL; int r; @@ -4105,46 +4142,11 @@ static int parse_argv(int argc, char *argv[]) { return r; break; - case ARG_LANGUAGE: { - const char *p = optarg; - - if (isempty(p)) { - r = drop_from_identity("preferredLanguage"); - if (r < 0) - return r; - - r = drop_from_identity("additionalLanguages"); - if (r < 0) - return r; - - arg_languages = strv_free(arg_languages); - break; - } - - for (;;) { - _cleanup_free_ char *word = NULL; - - r = extract_first_word(&p, &word, ",:", 0); - if (r < 0) - return log_error_errno(r, "Failed to parse locale list: %m"); - if (r == 0) - break; - - if (!locale_is_valid(word)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Locale '%s' is not valid.", word); - - if (locale_is_installed(word) <= 0) - log_warning("Locale '%s' is not installed, accepting anyway.", word); - - r = strv_consume(&arg_languages, TAKE_PTR(word)); - if (r < 0) - return log_oom(); - - strv_uniq(arg_languages); - } - + case ARG_LANGUAGE: + r = parse_language_field(&arg_languages, optarg); + if (r < 0) + return r; break; - } case ARG_NOSUID: case ARG_NODEV: