From: Lennart Poettering Date: Wed, 14 Feb 2018 16:30:37 +0000 (+0100) Subject: terminal-util: make resolve_dev_console() less weird X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=18344601acc263daef6008a4a0f2e8791fd20db7;p=elogind.git 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. --- diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 3c2c145b6..17548ddf0 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -682,37 +682,55 @@ int vtnr_from_tty(const char *tty) { } #if 0 /// UNNEEDED by elogind -char *resolve_dev_console(char **active) { + int resolve_dev_console(char **ret) { + _cleanup_free_ char *active = NULL; char *tty; + int r; + + 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) */ + /* 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) { @@ -787,16 +805,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 b115ad95e..21ca41eff 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -87,8 +87,8 @@ int ask_string(char **ret, const char *text, ...) _printf_(2, 3); int vt_disallocate(const char *name); -char *resolve_dev_console(char **active); #endif // 0 +int resolve_dev_console(char **ret); int get_kernel_consoles(char ***ret); bool tty_is_vc(const char *tty); #if 0 /// UNNEEDED by elogind