summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-11-18 04:46:28 +0100
committerLennart Poettering <lennart@poettering.net>2010-11-18 04:46:28 +0100
commit10aa703482a20489c061d76acb040b54fca89c6b (patch)
treea7431248d28d2e39824198bc2f47804455e0defa
parentf81c701649044712b75a7c3cdbbf2cb54fc03a0b (diff)
util: introduce /etc/os-release so that distros don't need to patch systemd to get a welcome message
-rw-r--r--TODO4
-rw-r--r--src/util.c129
2 files changed, 82 insertions, 51 deletions
diff --git a/TODO b/TODO
index 96ef50c001..17e12de1ba 100644
--- a/TODO
+++ b/TODO
@@ -53,7 +53,7 @@
* readahead: btrfs/LVM SSD detection
-* man pages for: locale.conf, vconsole.conf modules-load.d
+* man pages for: locale.conf, vconsole.conf, modules-load.d, /etc/os-release
* when processes remain in a service even though the start command failed enter active
@@ -71,8 +71,6 @@
* automatically determine TERM= based on tty name even for /dev/console
-* declare /etc/os-release cross-distro standard
-
* fix hotplug transactions
* isolate multi-user.target doesn't start a getty@tty1 if we run it from graphical.target
diff --git a/src/util.c b/src/util.c
index fb2eea341c..861f9eaa43 100644
--- a/src/util.c
+++ b/src/util.c
@@ -2979,80 +2979,113 @@ void status_printf(const char *format, ...) {
}
void status_welcome(void) {
+ char *pretty_name = NULL, *ansi_color = NULL;
+ const char *const_pretty = NULL, *const_color = NULL;
+ int r;
-#if defined(TARGET_FEDORA)
- char *r;
+ if ((r = parse_env_file("/etc/os-release", NEWLINE,
+ "PRETTY_NAME", &pretty_name,
+ "ANSI_COLOR", &ansi_color,
+ NULL)) < 0) {
- if (read_one_line_file("/etc/system-release", &r) < 0)
- return;
+ if (r != -ENOENT)
+ log_warning("Failed to read /etc/os-release: %s", strerror(-r));
+ }
- truncate_nl(r);
+#if defined(TARGET_FEDORA)
+ if (!pretty_name) {
+ if ((r = read_one_line_file("/etc/system-release", &pretty_name)) < 0) {
- /* This tries to mimic the color magic the old Red Hat sysinit
- * script did. */
+ if (r != -ENOENT)
+ log_warning("Failed to read /etc/system-release: %s", strerror(-r));
+ } else
+ truncate_nl(pretty_name);
+ }
- if (startswith(r, "Red Hat"))
- status_printf("Welcome to \x1B[0;31m%s\x1B[0m!\n", r); /* Red for RHEL */
- else if (startswith(r, "Fedora"))
- status_printf("Welcome to \x1B[0;34m%s\x1B[0m!\n", r); /* Blue for Fedora */
- else
- status_printf("Welcome to \x1B[1m%s\x1B[0m!\n", r); /* Highlight for everything else */
+ if (!ansi_color && pretty_name) {
- free(r);
+ /* This tries to mimic the color magic the old Red Hat sysinit
+ * script did. */
+
+ if (startswith(pretty_name, "Red Hat"))
+ const_color = "0;31"; /* Red for RHEL */
+ else if (startswith(pretty_name, "Fedora"))
+ const_color = "0;34"; /* Blue for Fedora */
+ }
#elif defined(TARGET_SUSE)
- char *r;
- if (read_one_line_file("/etc/SuSE-release", &r) < 0)
- return;
+ if (!pretty_name) {
+ if ((r = read_one_line_file("/etc/SuSE-release", &pretty_name)) < 0) {
- truncate_nl(r);
+ if (r != -ENOENT)
+ log_warning("Failed to read /etc/SuSE-release: %s", strerror(-r));
+ } else
+ truncate_nl(pretty_name);
+ }
- status_printf("Welcome to \x1B[0;32m%s\x1B[0m!\n", r); /* Green for SUSE */
- free(r);
+ if (!ansi_color)
+ const_color = "0;32"; /* Green for openSUSE */
#elif defined(TARGET_GENTOO)
- char *r;
-
- if (read_one_line_file("/etc/gentoo-release", &r) < 0)
- return;
- truncate_nl(r);
+ if (!pretty_name) {
+ if ((r = read_one_line_file("/etc/gentoo-release", &pretty_name)) < 0) {
- status_printf("Welcome to \x1B[1;34m%s\x1B[0m!\n", r); /* Light Blue for Gentoo */
+ if (r != -ENOENT)
+ log_warning("Failed to read /etc/gentoo-release: %s", strerror(-r));
+ } else
+ truncate_nl(pretty_name);
+ }
- free(r);
+ if (!ansi_color)
+ const_color = "1;34"; /* Light Blue for Gentoo */
#elif defined(TARGET_DEBIAN)
- char *r;
- if (read_one_line_file("/etc/debian_version", &r) < 0)
- return;
+ if (!pretty_name) {
+ if ((r = read_one_line_file("/etc/debian_version", &pretty_name)) < 0) {
- truncate_nl(r);
+ if (r != -ENOENT)
+ log_warning("Failed to read /etc/debian_version: %s", strerror(-r));
+ } else
+ truncate_nl(pretty_name);
+ }
- status_printf("Welcome to Debian \x1B[1;31m%s\x1B[0m!\n", r); /* Light Red for Debian */
+ if (!ansi_color)
+ const_color = "1;31"; /* Light Red for Debian */
- free(r);
#elif defined(TARGET_UBUNTU)
- char *desc = NULL;
- char *codename = NULL;
- if (parse_env_file("/etc/lsb-release", NEWLINE,
- "DISTRIB_DESCRIPTION", &desc,
- "DISTRIB_CODENAME", &codename, NULL) < 0)
- return;
- if (desc && codename)
- /* Light Red for Ubuntu */
- status_printf("Welcome to \x1B[1;31m%s\x1B[0m (%s)\n",
- desc, codename);
- free(desc);
- free(codename);
+ if ((r = parse_env_file("/etc/lsb-release", NEWLINE,
+ "DISTRIB_DESCRIPTION", &pretty_name,
+ NULL)) < 0) {
+
+ if (r != -ENOENT)
+ log_warning("Failed to read /etc/lsb-release: %s", strerror(-r));
+ }
+
+ if (!ansi_color)
+ const_color = "0;33"; /* Orange/Brown for Ubuntu */
+
#elif defined(TARGET_ARCH)
- status_printf("Welcome to \x1B[1;36mArch Linux\x1B[0m!\n"); /* Cyan for Arch */
-#else
-#warning "You probably should add a welcome text logic here."
+
+ if (!pretty_name)
+ const_pretty = "Arch Linux";
+
+ if (!ansi_color)
+ const_color = "1;36"; /* Cyan for Arch */
#endif
+
+ if (!pretty_name && !const_pretty)
+ const_pretty = "Linux";
+
+ if (!ansi_color && !const_color)
+ const_color = "1";
+
+ status_printf("Welcome to \x1B[%sm%s\x1B[0m!\n",
+ const_color ? const_color : ansi_color,
+ const_pretty ? const_pretty : pretty_name);
}
char *replace_env(const char *format, char **env) {