summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2018-05-31 16:27:07 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2018-05-31 17:57:41 +0900
commit4156e767f68016b45f7927e818e0514628afd43f (patch)
tree2c3bd834ca9afac64df3f53f04d10cb0978fbbac
parentdf4fd2c757a833885c5130136d78db96198bc8b3 (diff)
downloadsystemd-4156e767f68016b45f7927e818e0514628afd43f.tar.gz
locale: assume locale is for LANG= when variable name is not specified
Closes #6070.
-rw-r--r--man/localectl.xml9
-rw-r--r--src/locale/localed.c12
2 files changed, 17 insertions, 4 deletions
diff --git a/man/localectl.xml b/man/localectl.xml
index 0a763f2524..b32c0fb4d6 100644
--- a/man/localectl.xml
+++ b/man/localectl.xml
@@ -121,11 +121,12 @@
</varlistentry>
<varlistentry>
- <term><command>set-locale LOCALE…</command></term>
+ <term><command>set-locale LOCALE</command></term>
+ <term><command>set-locale VARIABLE=LOCALE…</command></term>
- <listitem><para>Set the system locale. This takes one or more
- assignments such as "LANG=de_DE.utf8",
- "LC_MESSAGES=en_GB.utf8", and so on. See
+ <listitem><para>Set the system locale. This takes one locale such as <literal>en_US.UTF-8</literal>, or takes one or more
+ locale assignments such as <literal>LANG=de_DE.utf8</literal>, <literal>LC_MESSAGES=en_GB.utf8</literal>, and so on. If
+ one locale without variable name is provided, then <literal>LANG=</literal> locale variable will be set. See
<citerefentry project='man-pages'><refentrytitle>locale</refentrytitle><manvolnum>7</manvolnum></citerefentry>
for details on the available settings and their meanings. Use
<command>list-locales</command> for a list of available
diff --git a/src/locale/localed.c b/src/locale/localed.c
index 823bcd52b8..d4835eb0a1 100644
--- a/src/locale/localed.c
+++ b/src/locale/localed.c
@@ -284,6 +284,18 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er
if (r < 0)
return r;
+ /* If single locale without variable name is provided, then we assume it is LANG=. */
+ if (strv_length(l) == 1 && !strchr(*l, '=')) {
+ if (!locale_is_valid(*l))
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid Locale data.");
+
+ new_locale[VARIABLE_LANG] = strdup(*l);
+ if (!new_locale[VARIABLE_LANG])
+ return -ENOMEM;
+
+ l = strv_free(l);
+ }
+
/* Check whether a variable is valid */
STRV_FOREACH(i, l) {
bool valid = false;