mirror of
https://github.com/systemd/systemd.git
synced 2025-02-02 13:47:27 +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);
|
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,
|
if ((r = parse_env_file("/proc/cmdline", WHITESPACE,
|
||||||
#ifdef TARGET_FEDORA
|
#ifdef TARGET_FEDORA
|
||||||
"LANG", &variables[VARIABLE_LANG],
|
"LANG", &variables[VARIABLE_LANG],
|
||||||
@ -157,6 +92,76 @@ int locale_setup(void) {
|
|||||||
log_warning("Failed to read /proc/cmdline: %s", strerror(-r));
|
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]) {
|
||||||
if (!(variables[VARIABLE_LANG] = strdup("C"))) {
|
if (!(variables[VARIABLE_LANG] = strdup("C"))) {
|
||||||
r = -ENOMEM;
|
r = -ENOMEM;
|
||||||
|
@ -602,7 +602,7 @@ int parse_env_file(
|
|||||||
const char *fname,
|
const char *fname,
|
||||||
const char *seperator, ...) {
|
const char *seperator, ...) {
|
||||||
|
|
||||||
int r;
|
int r = 0;
|
||||||
char *contents, *p;
|
char *contents, *p;
|
||||||
|
|
||||||
assert(fname);
|
assert(fname);
|
||||||
@ -657,6 +657,8 @@ int parse_env_file(
|
|||||||
*value = v;
|
*value = v;
|
||||||
|
|
||||||
p += n;
|
p += n;
|
||||||
|
|
||||||
|
r ++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -666,8 +668,6 @@ int parse_env_file(
|
|||||||
p += strcspn(p, seperator);
|
p += strcspn(p, seperator);
|
||||||
}
|
}
|
||||||
|
|
||||||
r = 0;
|
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
free(contents);
|
free(contents);
|
||||||
return r;
|
return r;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user