mirror of
https://github.com/systemd/systemd.git
synced 2025-02-01 09:47:35 +03:00
locale: make sure we don't merge configuration settings from different sources
This commit is contained in:
parent
8780d48d86
commit
ce8a6aa1a0
@ -69,71 +69,6 @@ int locale_setup(void) {
|
||||
|
||||
zero(variables);
|
||||
|
||||
#ifdef TARGET_FEDORA
|
||||
if ((r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
|
||||
"LANG", &variables[VARIABLE_LANG],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
|
||||
}
|
||||
#elif defined(TARGET_ARCH)
|
||||
if ((r = parse_env_file("/etc/rc.conf", NEWLINE,
|
||||
"LOCALE", &variables[VARIABLE_LANG],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
|
||||
}
|
||||
#elif defined(TARGET_GENTOO)
|
||||
/* Gentoo's openrc expects locale variables in /etc/env.d/
|
||||
* These files are later compiled by env-update into shell
|
||||
* export commands at /etc/profile.env, with variables being
|
||||
* exported by openrc's runscript (so /etc/init.d/)
|
||||
*/
|
||||
if ((r = parse_env_file("/etc/profile.env", NEWLINE,
|
||||
"export LANG", &variables[VARIABLE_LANG],
|
||||
"export LC_CTYPE", &variables[VARIABLE_LC_CTYPE],
|
||||
"export LC_NUMERIC", &variables[VARIABLE_LC_NUMERIC],
|
||||
"export LC_TIME", &variables[VARIABLE_LC_TIME],
|
||||
"export LC_COLLATE", &variables[VARIABLE_LC_COLLATE],
|
||||
"export LC_MONETARY", &variables[VARIABLE_LC_MONETARY],
|
||||
"export LC_MESSAGES", &variables[VARIABLE_LC_MESSAGES],
|
||||
"export LC_PAPER", &variables[VARIABLE_LC_PAPER],
|
||||
"export LC_NAME", &variables[VARIABLE_LC_NAME],
|
||||
"export LC_ADDRESS", &variables[VARIABLE_LC_ADDRESS],
|
||||
"export LC_TELEPHONE", &variables[VARIABLE_LC_TELEPHONE],
|
||||
"export LC_MEASUREMENT", &variables[VARIABLE_LC_MEASUREMENT],
|
||||
"export LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/profile.env: %s", strerror(-r));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Override distribution-specific options with the
|
||||
* distribution-independent configuration */
|
||||
if ((r = parse_env_file("/etc/locale", NEWLINE,
|
||||
"LANG", &variables[VARIABLE_LANG],
|
||||
"LC_CTYPE", &variables[VARIABLE_LC_CTYPE],
|
||||
"LC_NUMERIC", &variables[VARIABLE_LC_NUMERIC],
|
||||
"LC_TIME", &variables[VARIABLE_LC_TIME],
|
||||
"LC_COLLATE", &variables[VARIABLE_LC_COLLATE],
|
||||
"LC_MONETARY", &variables[VARIABLE_LC_MONETARY],
|
||||
"LC_MESSAGES", &variables[VARIABLE_LC_MESSAGES],
|
||||
"LC_PAPER", &variables[VARIABLE_LC_PAPER],
|
||||
"LC_NAME", &variables[VARIABLE_LC_NAME],
|
||||
"LC_ADDRESS", &variables[VARIABLE_LC_ADDRESS],
|
||||
"LC_TELEPHONE", &variables[VARIABLE_LC_TELEPHONE],
|
||||
"LC_MEASUREMENT", &variables[VARIABLE_LC_MEASUREMENT],
|
||||
"LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/locale: %s", strerror(-r));
|
||||
}
|
||||
|
||||
if ((r = parse_env_file("/proc/cmdline", WHITESPACE,
|
||||
#ifdef TARGET_FEDORA
|
||||
"LANG", &variables[VARIABLE_LANG],
|
||||
@ -157,6 +92,76 @@ int locale_setup(void) {
|
||||
log_warning("Failed to read /proc/cmdline: %s", strerror(-r));
|
||||
}
|
||||
|
||||
/* Hmm, nothing set on the kernel cmd line? Then let's
|
||||
* try /etc/locale */
|
||||
|
||||
if (r <= 0 &&
|
||||
(r = parse_env_file("/etc/locale", NEWLINE,
|
||||
"LANG", &variables[VARIABLE_LANG],
|
||||
"LC_CTYPE", &variables[VARIABLE_LC_CTYPE],
|
||||
"LC_NUMERIC", &variables[VARIABLE_LC_NUMERIC],
|
||||
"LC_TIME", &variables[VARIABLE_LC_TIME],
|
||||
"LC_COLLATE", &variables[VARIABLE_LC_COLLATE],
|
||||
"LC_MONETARY", &variables[VARIABLE_LC_MONETARY],
|
||||
"LC_MESSAGES", &variables[VARIABLE_LC_MESSAGES],
|
||||
"LC_PAPER", &variables[VARIABLE_LC_PAPER],
|
||||
"LC_NAME", &variables[VARIABLE_LC_NAME],
|
||||
"LC_ADDRESS", &variables[VARIABLE_LC_ADDRESS],
|
||||
"LC_TELEPHONE", &variables[VARIABLE_LC_TELEPHONE],
|
||||
"LC_MEASUREMENT", &variables[VARIABLE_LC_MEASUREMENT],
|
||||
"LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/locale: %s", strerror(-r));
|
||||
}
|
||||
|
||||
#ifdef TARGET_FEDORA
|
||||
if (r <= 0 &&
|
||||
(r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
|
||||
"LANG", &variables[VARIABLE_LANG],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
|
||||
}
|
||||
#elif defined(TARGET_ARCH)
|
||||
if (r <= 0 &&
|
||||
(r = parse_env_file("/etc/rc.conf", NEWLINE,
|
||||
"LOCALE", &variables[VARIABLE_LANG],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
|
||||
}
|
||||
#elif defined(TARGET_GENTOO)
|
||||
/* Gentoo's openrc expects locale variables in /etc/env.d/
|
||||
* These files are later compiled by env-update into shell
|
||||
* export commands at /etc/profile.env, with variables being
|
||||
* exported by openrc's runscript (so /etc/init.d/)
|
||||
*/
|
||||
if (r <= 0 &&
|
||||
(r = parse_env_file("/etc/profile.env", NEWLINE,
|
||||
"export LANG", &variables[VARIABLE_LANG],
|
||||
"export LC_CTYPE", &variables[VARIABLE_LC_CTYPE],
|
||||
"export LC_NUMERIC", &variables[VARIABLE_LC_NUMERIC],
|
||||
"export LC_TIME", &variables[VARIABLE_LC_TIME],
|
||||
"export LC_COLLATE", &variables[VARIABLE_LC_COLLATE],
|
||||
"export LC_MONETARY", &variables[VARIABLE_LC_MONETARY],
|
||||
"export LC_MESSAGES", &variables[VARIABLE_LC_MESSAGES],
|
||||
"export LC_PAPER", &variables[VARIABLE_LC_PAPER],
|
||||
"export LC_NAME", &variables[VARIABLE_LC_NAME],
|
||||
"export LC_ADDRESS", &variables[VARIABLE_LC_ADDRESS],
|
||||
"export LC_TELEPHONE", &variables[VARIABLE_LC_TELEPHONE],
|
||||
"export LC_MEASUREMENT", &variables[VARIABLE_LC_MEASUREMENT],
|
||||
"export LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION],
|
||||
NULL)) < 0) {
|
||||
|
||||
if (r != -ENOENT)
|
||||
log_warning("Failed to read /etc/profile.env: %s", strerror(-r));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!variables[VARIABLE_LANG]) {
|
||||
if (!(variables[VARIABLE_LANG] = strdup("C"))) {
|
||||
r = -ENOMEM;
|
||||
|
@ -602,7 +602,7 @@ int parse_env_file(
|
||||
const char *fname,
|
||||
const char *seperator, ...) {
|
||||
|
||||
int r;
|
||||
int r = 0;
|
||||
char *contents, *p;
|
||||
|
||||
assert(fname);
|
||||
@ -657,6 +657,8 @@ int parse_env_file(
|
||||
*value = v;
|
||||
|
||||
p += n;
|
||||
|
||||
r ++;
|
||||
break;
|
||||
}
|
||||
va_end(ap);
|
||||
@ -666,8 +668,6 @@ int parse_env_file(
|
||||
p += strcspn(p, seperator);
|
||||
}
|
||||
|
||||
r = 0;
|
||||
|
||||
fail:
|
||||
free(contents);
|
||||
return r;
|
||||
|
Loading…
x
Reference in New Issue
Block a user