From 7b91264852f63ba7f775dfb4a82cc2b64d4a61bc Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 14 Feb 2018 17:30:37 +0100 Subject: [PATCH] terminal-util: make resolve_dev_console() less weird Let's normalize the behaviour: return a negative errno style error code, and return the resolved string directly as argument. --- src/basic/terminal-util.c | 57 ++++++++++++++++++++++++++------------- src/basic/terminal-util.h | 2 +- src/core/execute.c | 11 +++----- 3 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 34878d3192..a897a6367d 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -672,37 +672,55 @@ int vtnr_from_tty(const char *tty) { return i; } -char *resolve_dev_console(char **active) { + int resolve_dev_console(char **ret) { + _cleanup_free_ char *active = NULL; char *tty; + int r; - /* Resolve where /dev/console is pointing to, if /sys is actually ours - * (i.e. not read-only-mounted which is a sign for container setups) */ + assert(ret); + + /* Resolve where /dev/console is pointing to, if /sys is actually ours (i.e. not read-only-mounted which is a + * sign for container setups) */ if (path_is_read_only_fs("/sys") > 0) - return NULL; + return -ENOMEDIUM; - if (read_one_line_file("/sys/class/tty/console/active", active) < 0) - return NULL; + r = read_one_line_file("/sys/class/tty/console/active", &active); + if (r < 0) + return r; - /* If multiple log outputs are configured the last one is what - * /dev/console points to */ - tty = strrchr(*active, ' '); + /* If multiple log outputs are configured the last one is what /dev/console points to */ + tty = strrchr(active, ' '); if (tty) tty++; else - tty = *active; + tty = active; if (streq(tty, "tty0")) { - char *tmp; + active = mfree(active); /* Get the active VC (e.g. tty1) */ - if (read_one_line_file("/sys/class/tty/tty0/active", &tmp) >= 0) { - free(*active); - tty = *active = tmp; - } + r = read_one_line_file("/sys/class/tty/tty0/active", &active); + if (r < 0) + return r; + + tty = active; } - return tty; + if (tty == active) { + *ret = active; + active = NULL; + } else { + char *tmp; + + tmp = strdup(tty); + if (!tmp) + return -ENOMEM; + + *ret = tmp; + } + + return 0; } int get_kernel_consoles(char ***ret) { @@ -777,16 +795,17 @@ fallback: } bool tty_is_vc_resolve(const char *tty) { - _cleanup_free_ char *active = NULL; + _cleanup_free_ char *resolved = NULL; assert(tty); tty = skip_dev_prefix(tty); if (streq(tty, "console")) { - tty = resolve_dev_console(&active); - if (!tty) + if (resolve_dev_console(&resolved) < 0) return false; + + tty = resolved; } return tty_is_vc(tty); diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index e13d441a25..f6e6020b66 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -82,7 +82,7 @@ int ask_string(char **ret, const char *text, ...) _printf_(2, 3); int vt_disallocate(const char *name); -char *resolve_dev_console(char **active); +int resolve_dev_console(char **ret); int get_kernel_consoles(char ***ret); bool tty_is_vc(const char *tty); bool tty_is_vc_resolve(const char *tty); diff --git a/src/core/execute.c b/src/core/execute.c index 1381ab4091..bebd4eca80 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -3871,8 +3871,7 @@ static int exec_context_load_environment(const Unit *unit, const ExecContext *c, } static bool tty_may_match_dev_console(const char *tty) { - _cleanup_free_ char *active = NULL; - char *console; + _cleanup_free_ char *resolved = NULL; if (!tty) return true; @@ -3883,13 +3882,11 @@ static bool tty_may_match_dev_console(const char *tty) { if (streq(tty, "console")) return true; - console = resolve_dev_console(&active); - /* if we could not resolve, assume it may */ - if (!console) - return true; + if (resolve_dev_console(&resolved) < 0) + return true; /* if we could not resolve, assume it may */ /* "tty0" means the active VC, so it may be the same sometimes */ - return streq(console, tty) || (streq(console, "tty0") && tty_is_vc(tty)); + return streq(resolved, tty) || (streq(resolved, "tty0") && tty_is_vc(tty)); } bool exec_context_may_touch_console(const ExecContext *ec) {