Commit 46a2911b authored by Lennart Poettering's avatar Lennart Poettering

core: drop support for old per-distro configuration files for console, hostname, locale, timezone

This simplifies the upstream system code quite a bit. If downstream distributions want to maintain compatibility with their old configuration files, they are welcome to do so, but need to maintain this as patches downstream. The burden needs to be on the distributions to maintain differences here. Our suggestion however is to just convert the old configuration files on upgrade, as multiple distributions already do.
parent 1328f66a
......@@ -30,14 +30,6 @@
#include "util.h"
#include "log.h"
#if defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
#define FILENAME "/etc/sysconfig/network"
#elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
#define FILENAME "/etc/HOSTNAME"
#elif defined(TARGET_GENTOO)
#define FILENAME "/etc/conf.d/hostname"
#endif
static int read_and_strip_hostname(const char *path, char **hn) {
char *s;
int r;
......@@ -57,103 +49,23 @@ static int read_and_strip_hostname(const char *path, char **hn) {
}
*hn = s;
return 0;
}
static int read_distro_hostname(char **hn) {
#if defined(TARGET_GENTOO) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
int r;
_cleanup_fclose_ FILE *f = NULL;
assert(hn);
f = fopen(FILENAME, "re");
if (!f)
return -errno;
for (;;) {
char line[LINE_MAX];
char *s, *k;
if (!fgets(line, sizeof(line), f)) {
if (feof(f))
break;
r = -errno;
goto finish;
}
s = strstrip(line);
if (!startswith_no_case(s, "HOSTNAME="))
continue;
k = strdup(s+9);
if (!k) {
r = -ENOMEM;
goto finish;
}
hostname_cleanup(k);
if (isempty(k)) {
free(k);
r = -ENOENT;
goto finish;
}
*hn = k;
r = 0;
goto finish;
}
r = -ENOENT;
finish:
return r;
#elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE)
return read_and_strip_hostname(FILENAME, hn);
#else
return -ENOENT;
#endif
}
static int read_hostname(char **hn) {
int r;
assert(hn);
/* First, try to load the generic hostname configuration file,
* that we support on all distributions */
r = read_and_strip_hostname("/etc/hostname", hn);
if (r < 0) {
if (r == -ENOENT)
return read_distro_hostname(hn);
return r;
}
return 0;
}
int hostname_setup(void) {
int r;
char *b = NULL;
const char *hn = NULL;
_cleanup_free_ char *b = NULL;
const char *hn;
bool enoent = false;
r = read_hostname(&b);
r = read_and_strip_hostname("/etc/hostname", &b);
if (r < 0) {
hn = NULL;
if (r == -ENOENT)
enoent = true;
else
log_warning("Failed to read configured hostname: %s", strerror(-r));
hn = NULL;
} else
hn = b;
......@@ -161,7 +73,7 @@ int hostname_setup(void) {
/* Don't override the hostname if it is already set
* and not explicitly configured */
if (hostname_is_set())
goto finish;
return 0;
if (enoent)
log_info("No hostname configured.");
......@@ -171,12 +83,9 @@ int hostname_setup(void) {
if (sethostname(hn, strlen(hn)) < 0) {
log_warning("Failed to set hostname to <%s>: %m", hn);
r = -errno;
} else
log_info("Set hostname to <%s>.", hn);
finish:
free(b);
return -errno;
}
return r;
log_info("Set hostname to <%s>.", hn);
return 0;
}
......@@ -74,9 +74,6 @@ int locale_setup(void) {
if (detect_container(NULL) <= 0) {
r = parse_env_file("/proc/cmdline", WHITESPACE,
#if defined(TARGET_FEDORA)
"LANG", &variables[VARIABLE_LANG],
#endif
"locale.LANG", &variables[VARIABLE_LANG],
"locale.LANGUAGE", &variables[VARIABLE_LANGUAGE],
"locale.LC_CTYPE", &variables[VARIABLE_LC_CTYPE],
......@@ -121,99 +118,6 @@ int locale_setup(void) {
log_warning("Failed to read /etc/locale.conf: %s", strerror(-r));
}
#if defined(TARGET_ALTLINUX)
if (r <= 0) {
r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
"LANG", &variables[VARIABLE_LANG],
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
}
#elif defined(TARGET_SUSE)
if (r <= 0) {
r = parse_env_file("/etc/sysconfig/language", NEWLINE,
"RC_LANG", &variables[VARIABLE_LANG],
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/language: %s", strerror(-r));
}
#elif defined(TARGET_DEBIAN) || defined(TARGET_ANGSTROM)
if (r <= 0) {
r = parse_env_file("/etc/default/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);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/default/locale: %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);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/profile.env: %s", strerror(-r));
}
#elif defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
if (r <= 0) {
r = parse_env_file("/etc/sysconfig/i18n", 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);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
}
#endif
if (!variables[VARIABLE_LANG]) {
variables[VARIABLE_LANG] = strdup("C");
if (!variables[VARIABLE_LANG]) {
......
......@@ -199,19 +199,10 @@ static int write_data_timezone(void) {
int r = 0;
_cleanup_free_ char *p = NULL;
#ifdef TARGET_DEBIAN
struct stat st;
#endif
if (!tz.zone) {
if (unlink("/etc/localtime") < 0 && errno != ENOENT)
r = -errno;
#ifdef TARGET_DEBIAN
if (unlink("/etc/timezone") < 0 && errno != ENOENT)
r = -errno;
#endif
return r;
}
......@@ -223,14 +214,6 @@ static int write_data_timezone(void) {
if (r < 0)
return r;
#ifdef TARGET_DEBIAN
if (stat("/etc/timezone", &st) == 0 && S_ISREG(st.st_mode)) {
r = write_one_line_file_atomic("/etc/timezone", tz.zone);
if (r < 0)
return r;
}
#endif
return 0;
}
......
......@@ -164,12 +164,6 @@ int main(int argc, char **argv) {
char *vc_font = NULL;
char *vc_font_map = NULL;
char *vc_font_unimap = NULL;
#ifdef TARGET_GENTOO
char *vc_unicode = NULL;
#endif
#if defined(TARGET_MANDRIVA) || defined(TARGET_MAGEIA)
char *vc_keytable = NULL;
#endif
int fd = -1;
bool utf8;
int r = EXIT_FAILURE;
......@@ -230,135 +224,6 @@ int main(int argc, char **argv) {
}
if (r <= 0) {
#if defined(TARGET_SUSE)
r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
"KEYTABLE", &vc_keymap,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/keyboard: %s", strerror(-r));
r = parse_env_file("/etc/sysconfig/console", NEWLINE,
"CONSOLE_FONT", &vc_font,
"CONSOLE_SCREENMAP", &vc_font_map,
"CONSOLE_UNICODEMAP", &vc_font_unimap,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/console: %s", strerror(-r));
#elif defined(TARGET_ALTLINUX)
r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
"KEYTABLE", &vc_keymap,
NULL)
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/keyboard: %s", strerror(-r));
r = parse_env_file("/etc/sysconfig/consolefont", NEWLINE,
"SYSFONT", &vc_font,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/consolefont: %s", strerror(-r));
#elif defined(TARGET_GENTOO)
r = parse_env_file("/etc/rc.conf", NEWLINE,
"unicode", &vc_unicode,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/rc.conf: %s", strerror(-r));
if (vc_unicode) {
int rc_unicode;
rc_unicode = parse_boolean(vc_unicode);
if (rc_unicode < 0)
log_warning("Unknown value for /etc/rc.conf unicode=%s", vc_unicode);
else {
if (rc_unicode && !utf8)
log_warning("/etc/rc.conf wants unicode, but current locale is not UTF-8 capable!");
else if (!rc_unicode && utf8) {
log_debug("/etc/rc.conf does not want unicode, leave it on in kernel but does not apply to vconsole.");
utf8 = false;
}
}
}
/* /etc/conf.d/consolefont comments and gentoo
* documentation mention uppercase, but the actual
* contents are lowercase. the existing
* /etc/init.d/consolefont tries both
*/
r = parse_env_file("/etc/conf.d/consolefont", NEWLINE,
"CONSOLEFONT", &vc_font,
"consolefont", &vc_font,
"consoletranslation", &vc_font_map,
"CONSOLETRANSLATION", &vc_font_map,
"unicodemap", &vc_font_unimap,
"UNICODEMAP", &vc_font_unimap,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/conf.d/consolefont: %s", strerror(-r));
r = parse_env_file("/etc/conf.d/keymaps", NEWLINE,
"keymap", &vc_keymap,
"KEYMAP", &vc_keymap,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/conf.d/keymaps: %s", strerror(-r));
#elif defined(TARGET_MANDRIVA) || defined (TARGET_MAGEIA)
r = parse_env_file("/etc/sysconfig/i18n", NEWLINE,
"SYSFONT", &vc_font,
"SYSFONTACM", &vc_font_map,
"UNIMAP", &vc_font_unimap,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r));
r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE,
"KEYTABLE", &vc_keytable,
"KEYMAP", &vc_keymap,
"UNIKEYTABLE", &vc_keymap,
"GRP_TOGGLE", &vc_keymap_toggle,
NULL);
if (r < 0 && r != -ENOENT)
log_warning("Failed to read /etc/sysconfig/keyboard: %s", strerror(-r));
if (vc_keytable) {
free(vc_keymap);
if (utf8) {
if (endswith(vc_keytable, ".uni") || strstr(vc_keytable, ".uni."))
vc_keymap = strdup(vc_keytable);
else {
char *s;
s = strstr(vc_keytable, ".map");
if (s)
vc_keytable[s-vc_keytable+1] = '\0';
vc_keymap = strappend(vc_keytable, ".uni");
}
} else
vc_keymap = strdup(vc_keytable);
free(vc_keytable);
if (!vc_keymap) {
log_oom();
goto finish;
}
}
if (access("/etc/sysconfig/console/default.kmap", F_OK) >= 0) {
char *t;
t = strdup("/etc/sysconfig/console/default.kmap");
if (!t) {
log_oom();
goto finish;
}
free(vc_keymap);
vc_keymap = t;
}
#endif
}
r = EXIT_FAILURE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment