terminal-util: handle the case where no system console is active (#40630)

/dev/console might have no backing driver, in which case
/sys/class/tty/console/active is empty. Unlike get_kernel_consoles()
resolve_dev_console() currently proceeds with empty devnode, resulting
in setup_input() -> acquire_terminal() emitting -EISDIR as we're trying
to open /dev/. Let's catch this and report -ENXIO.
This commit is contained in:
Mike Yuan
2026-02-10 23:59:07 +01:00
committed by GitHub
+9 -1
View File
@@ -1116,7 +1116,7 @@ int resolve_dev_console(char **ret) {
* is a sign for container setups). */
_cleanup_free_ char *chased = NULL;
r = chase("/dev/console", /* root= */ NULL, /* flags= */ 0, &chased, /* ret_fd= */ NULL);
r = chase("/dev/console", /* root= */ NULL, /* flags= */ 0, &chased, /* ret_fd= */ NULL);
if (r < 0)
return r;
if (!path_equal(chased, "/dev/console")) {
@@ -1134,6 +1134,8 @@ int resolve_dev_console(char **ret) {
r = read_one_line_file("/sys/class/tty/console/active", &active);
if (r < 0)
return r;
if (r == 0)
return -ENXIO;
/* If multiple log outputs are configured the last one is what /dev/console points to */
const char *tty = strrchr(active, ' ');
@@ -1149,6 +1151,8 @@ int resolve_dev_console(char **ret) {
r = read_one_line_file("/sys/class/tty/tty0/active", &active);
if (r < 0)
return r;
if (r == 0)
return -ENXIO;
tty = active;
}
@@ -1192,6 +1196,10 @@ int get_kernel_consoles(char ***ret) {
r = read_one_line_file("/sys/class/tty/tty0/active", &tty);
if (r < 0)
return r;
if (r == 0) {
log_debug("No VT active, skipping /dev/tty0.");
continue;
}
}
path = path_join("/dev", tty);