chiark / gitweb /
util: introduce /etc/os-release so that distros don't need to patch systemd to get...
authorLennart Poettering <lennart@poettering.net>
Thu, 18 Nov 2010 03:46:28 +0000 (04:46 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 18 Nov 2010 03:46:28 +0000 (04:46 +0100)
TODO
src/util.c

diff --git a/TODO b/TODO
index 96ef50c001c0c2c1c72b68b7a6f480fa2940ef84..17e12de1ba7b6cdbb2930e6fbe5407c1c6156248 100644 (file)
--- a/TODO
+++ b/TODO
@@ -53,7 +53,7 @@
 
 * readahead: btrfs/LVM SSD detection
 
 
 * 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
 
 
 * 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
 
 
 * 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
 * fix hotplug transactions
 
 * isolate multi-user.target doesn't start a getty@tty1 if we run it from graphical.target
index fb2eea341c9b36188633c7f14b6a28061a08aa30..861f9eaa437ba8c5fbe7f768979473cabfc8ee82 100644 (file)
@@ -2979,80 +2979,113 @@ void status_printf(const char *format, ...) {
 }
 
 void status_welcome(void) {
 }
 
 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)
 
 #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)
 
 #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)
 
 #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)
 #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)
 #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
 #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) {
 }
 
 char *replace_env(const char *format, char **env) {