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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user