From f57705d67d13593a05c95ef082ce85caeb18b062 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Fri, 19 Apr 2024 21:58:18 +0200 Subject: [PATCH] terminal-util: Enable line wrapping in reset_terminal_fd() The qemu seabios firmware disables serial console line wrapping. Let's make sure we re-enable it again when we reset a terminal to some sane defaults. To avoid potentially blocking on writing to the terminal, we put it in nonblocking mode and add a timeout of 50ms. --- src/basic/terminal-util.c | 22 ++++++++++++++++++++++ test/TEST-08-INITRD/test.sh | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 9470c9fb1a..11c0da870c 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -306,7 +306,29 @@ int reset_terminal_fd(int fd, bool switch_to_text) { termios.c_cc[VMIN] = 1; r = RET_NERRNO(tcsetattr(fd, TCSANOW, &termios)); + if (r < 0) { + log_debug_errno(r, "Failed to set terminal parameters: %m"); + goto finish; + } + + if (!terminal_is_dumb()) { + r = fd_nonblock(fd, true); + if (r < 0) { + log_debug_errno(r, "Failed to set terminal to non-blocking mode: %m"); + goto finish; + } + + /* Enable line wrapping. */ + (void) loop_write_full(fd, "\033[?7h", SIZE_MAX, 50 * USEC_PER_MSEC); + if (r > 0) { + r = fd_nonblock(fd, false); + if (r < 0) { + log_debug_errno(r, "Failed to set terminal back to blocking mode: %m"); + goto finish; + } + } + } finish: /* Just in case, flush all crap out */ (void) tcflush(fd, TCIOFLUSH); diff --git a/test/TEST-08-INITRD/test.sh b/test/TEST-08-INITRD/test.sh index e8dbb2c36c..3ad60f1a94 100755 --- a/test/TEST-08-INITRD/test.sh +++ b/test/TEST-08-INITRD/test.sh @@ -70,7 +70,7 @@ check_result_qemu_hook() { fi # Check if the shutdown initrd was executed at all - if ! grep -qE "^Hello from shutdown initrd\s*$" "$console_log"; then + if ! grep -q "Hello from shutdown initrd" "$console_log"; then derror "Missing 'hello' message from shutdown initrd" return 1 fi -- 2.25.1