systemd/handle-root_uses_lang-value-in-etc-sysconfig-language.patch

73 lines
3.0 KiB
Diff

From: Frederic Crozat <fcrozat@suse.com>
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++) {