From: Frederic Crozat Date: Tue, 4 Dec 2012 16:51:32 +0000 Subject: handle root_uses_lang value in /etc/sysconfig/language handle ROOT_USES_LANG=ctype (boo#792182). --- src/core/locale-setup.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) Index: systemd-228/src/core/locale-setup.c =================================================================== --- systemd-228.orig/src/core/locale-setup.c +++ systemd-228/src/core/locale-setup.c @@ -30,11 +30,16 @@ #include "strv.h" #include "util.h" #include "virt.h" +#include "alloc-util.h" int locale_setup(char ***environment) { char **add; char *variables[_VARIABLE_LC_MAX] = {}; int r = 0, i; +#ifdef HAVE_SYSV_COMPAT + char _cleanup_free_ *rc_lang = NULL, *rc_lc_ctype = NULL; + char _cleanup_free_ *root_uses_lang = NULL; +#endif if (detect_container() <= 0) { r = parse_env_file("/proc/cmdline", WHITESPACE, @@ -81,6 +86,41 @@ int locale_setup(char ***environment) { if (r < 0 && r != -ENOENT) log_warning_errno(r, "Failed to read /etc/locale.conf: %m"); } +#ifdef HAVE_SYSV_COMPAT + r = parse_env_file("/etc/sysconfig/language", NEWLINE, + "RC_LANG", &rc_lang, + "RC_LC_CTYPE", &rc_lc_ctype, + "ROOT_USES_LANG", &root_uses_lang, + NULL); + + if (r < 0 && r != -ENOENT) + log_warning("Failed to read /etc/sysconfig/language: %s", strerror(-r)); + + /* + * Use the values of the interactive locale configuration in /etc/sysconfig/language + * as fallback if /etc/locale.conf does not exist and no locale was specified on the + * kernel's command line. The special case ROOT_USES_LANG=ctype allows to set LC_CTYPE + * even if LANG for root is set to e.g. POSIX. But do this only if no LC_CTYPE has been + * set in /etc/locale.conf and on the kernel's command line. + */ + if (root_uses_lang) { + if (strcaseeq(root_uses_lang, "yes") && !variables[VARIABLE_LANG]) { + variables[VARIABLE_LANG] = rc_lang; + rc_lang = NULL; + } + if (strcaseeq(root_uses_lang, "ctype") && !variables[VARIABLE_LC_CTYPE]) { + if (variables[VARIABLE_LANG]) + variables[VARIABLE_LC_CTYPE] = strdup(variables[VARIABLE_LANG]); + else if (rc_lc_ctype && *rc_lc_ctype) { + variables[VARIABLE_LC_CTYPE] = rc_lc_ctype; + rc_lc_ctype = NULL; + } else if (rc_lang && *rc_lang) { + variables[VARIABLE_LC_CTYPE] = rc_lang; + rc_lang = NULL; + } + } + } +#endif add = NULL; for (i = 0; i < _VARIABLE_LC_MAX; i++) {