From 5ae4d543cb9b45ad6c6b82b78da1d6abc2291cdb Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 13 Jun 2014 19:45:52 +0200 Subject: os-release: define /usr/lib/os-release as fallback for /etc/os-release The file should have been in /usr/lib/ in the first place, since it describes the OS container in /usr (and not the configuration in /etc), hence, let's support os-release files in /usr/lib as fallback if no version in /etc exists, following the usual override logic. A prior commit already enabled tmpfiles to create /etc/os-release as a symlink to /usr/lib/os-release should it be missing, thus providing nice compatibility with applications only checking in /etc. While it's probably a good idea if all apps check both locations via a fallback logic, it is only necessary in the early boot process, as long as the /etc/os-release symlink has not been restored, in case we boot with an empty /etc. --- src/bootchart/bootchart.c | 8 ++++---- src/core/dbus-manager.c | 2 +- src/core/main.c | 8 +++++++- src/hostname/hostnamed.c | 7 +++++++ src/journal/journal-gatewayd.c | 3 ++- src/kernel-install/90-loaderentry.install | 2 ++ src/nspawn/nspawn.c | 2 +- src/shared/path-util.c | 10 ++++++++-- 8 files changed, 32 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c index 958a668aca..01a5bf18ef 100644 --- a/src/bootchart/bootchart.c +++ b/src/bootchart/bootchart.c @@ -386,10 +386,10 @@ int main(int argc, char *argv[]) { if (sysfd < 0) sysfd = open("/sys", O_RDONLY|O_CLOEXEC); - if (!build) - parse_env_file("/etc/os-release", NEWLINE, - "PRETTY_NAME", &build, - NULL); + if (!build) { + if (parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &build, NULL) == -ENOENT) + parse_env_file("/usr/lib/os-release", NEWLINE, "PRETTY_NAME", &build, NULL); + } /* wait for /proc to become available, discarding samples */ if (graph_start <= 0.0) diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 333c1d46e7..68a68a2d94 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -1191,7 +1191,7 @@ static int method_switch_root(sd_bus *bus, sd_bus_message *message, void *userda /* Safety check */ if (isempty(init)) { if (! path_is_os_tree(root)) - return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified switch root path %s does not seem to be an OS tree. /etc/os-release is missing.", root); + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified switch root path %s does not seem to be an OS tree. os-release file is missing.", root); } else { _cleanup_free_ char *p = NULL; diff --git a/src/core/main.c b/src/core/main.c index d5d1ee2b0c..29f2d5a2a5 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1251,9 +1251,15 @@ static int status_welcome(void) { "PRETTY_NAME", &pretty_name, "ANSI_COLOR", &ansi_color, NULL); + if (r == -ENOENT) { + r = parse_env_file("/usr/lib/os-release", NEWLINE, + "PRETTY_NAME", &pretty_name, + "ANSI_COLOR", &ansi_color, + NULL); + } if (r < 0 && r != -ENOENT) - log_warning("Failed to read /etc/os-release: %s", strerror(-r)); + log_warning("Failed to read os-release file: %s", strerror(-r)); return status_printf(NULL, false, false, "\nWelcome to \x1B[%sm%s\x1B[0m!\n", diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c index a3504904a0..241d296916 100644 --- a/src/hostname/hostnamed.c +++ b/src/hostname/hostnamed.c @@ -108,6 +108,13 @@ static int context_read_data(Context *c) { "PRETTY_NAME", &c->data[PROP_OS_PRETTY_NAME], "CPE_NAME", &c->data[PROP_OS_CPE_NAME], NULL); + if (r == -ENOENT) { + r = parse_env_file("/usr/lib/os-release", NEWLINE, + "PRETTY_NAME", &c->data[PROP_OS_PRETTY_NAME], + "CPE_NAME", &c->data[PROP_OS_CPE_NAME], + NULL); + } + if (r < 0 && r != -ENOENT) return r; diff --git a/src/journal/journal-gatewayd.c b/src/journal/journal-gatewayd.c index 9a88676242..c682666a22 100644 --- a/src/journal/journal-gatewayd.c +++ b/src/journal/journal-gatewayd.c @@ -767,7 +767,8 @@ static int request_handler_machine( if (r < 0) return mhd_respondf(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, "Failed to determine disk usage: %s\n", strerror(-r)); - parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL); + if (parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL) == -ENOENT) + parse_env_file("/usr/lib/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL); get_virtualization(&v); diff --git a/src/kernel-install/90-loaderentry.install b/src/kernel-install/90-loaderentry.install index a6a8abc2bd..c17b8a98d5 100644 --- a/src/kernel-install/90-loaderentry.install +++ b/src/kernel-install/90-loaderentry.install @@ -32,6 +32,8 @@ fi if [[ -f /etc/os-release ]]; then . /etc/os-release +elif [[ -f /usr/lib/os-release ]]; then + . /usr/lib/os-release fi if ! [[ $PRETTY_NAME ]]; then diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 29ddfbb1ff..8270348c17 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -2799,7 +2799,7 @@ int main(int argc, char *argv[]) { if (arg_boot) { if (path_is_os_tree(arg_directory) <= 0) { - log_error("Directory %s doesn't look like an OS root directory (/etc/os-release is missing). Refusing.", arg_directory); + log_error("Directory %s doesn't look like an OS root directory (os-release file is missing). Refusing.", arg_directory); goto finish; } } else { diff --git a/src/shared/path-util.c b/src/shared/path-util.c index 5863429c31..efe464d704 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -526,12 +526,18 @@ int path_is_os_tree(const char *path) { char *p; int r; - /* We use /etc/os-release as flag file if something is an OS */ + /* We use /usr/lib/os-release as flag file if something is an OS */ + p = strappenda(path, "/usr/lib/os-release"); + r = access(p, F_OK); + + if (r >= 0) + return 1; + /* Also check for the old location in /etc, just in case. */ p = strappenda(path, "/etc/os-release"); r = access(p, F_OK); - return r < 0 ? 0 : 1; + return r >= 0; } int find_binary(const char *name, char **filename) { -- cgit v1.2.3-54-g00ecf