chardev/char-win-stdio: Pass Ctrl+C to guest with a multiplexed monitor

At present when pressing Ctrl+C from a guest running on QEMU Windows
with a multiplexed monitor, e.g.: -serial mon:stdio, QEMU executable
just exits. This behavior is inconsistent with the Linux version.

Such behavior is caused by unconditionally setting the input mode
ENABLE_PROCESSED_INPUT for a console's input buffer. Fix this by
testing whether the chardev is allowed to do so.

Signed-off-by: Bin Meng <bin.meng@windriver.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20221025141015.612291-1-bin.meng@windriver.com>
This commit is contained in:
Bin Meng 2022-10-25 22:10:15 +08:00 committed by Marc-André Lureau
parent a082fab9d2
commit 06639f8ff5

View File

@ -146,6 +146,8 @@ static void qemu_chr_open_stdio(Chardev *chr,
bool *be_opened, bool *be_opened,
Error **errp) Error **errp)
{ {
ChardevStdio *opts = backend->u.stdio.data;
bool stdio_allow_signal = !opts->has_signal || opts->signal;
WinStdioChardev *stdio = WIN_STDIO_CHARDEV(chr); WinStdioChardev *stdio = WIN_STDIO_CHARDEV(chr);
DWORD dwMode; DWORD dwMode;
int is_console = 0; int is_console = 0;
@ -193,7 +195,11 @@ static void qemu_chr_open_stdio(Chardev *chr,
if (is_console) { if (is_console) {
/* set the terminal in raw mode */ /* set the terminal in raw mode */
/* ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS */ /* ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS */
dwMode |= ENABLE_PROCESSED_INPUT; if (stdio_allow_signal) {
dwMode |= ENABLE_PROCESSED_INPUT;
} else {
dwMode &= ~ENABLE_PROCESSED_INPUT;
}
} }
SetConsoleMode(stdio->hStdIn, dwMode); SetConsoleMode(stdio->hStdIn, dwMode);