From b04aea00f1bb503dcc364c83ee3ef3da3bc1305e Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Sat, 12 Feb 2022 17:51:55 +0900 Subject: [PATCH] Cygwin: pty: Pass Ctrl-Z (EOF) to non-cygwin apps with disable_pcon. - Previously, non-cygwin app running in pty started without pseudo console support was suspended by Ctrl-Z rather than sending EOF. Even worse, suspended app could not be resumed by fg command. With this patch, Ctrl-Z (EOF for non-cygwin apps) is passed to non-cygwin app instead of suspending that app. This patch also handles Ctrl-\ (QUIT) and Ctrl-D (EOF) as well. --- winsup/cygwin/fhandler_termios.cc | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc index fe1021520..b935a70bc 100644 --- a/winsup/cygwin/fhandler_termios.cc +++ b/winsup/cygwin/fhandler_termios.cc @@ -329,6 +329,7 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti, if (ti.c_iflag & ISTRIP) c &= 0x7f; winpids pids ((DWORD) 0); + bool need_check_sigs = get_ttyp ()->pcon_input_state_eq (tty::to_cyg); if (get_ttyp ()->pcon_input_state_eq (tty::to_nat)) { bool need_discard_input = false; @@ -349,11 +350,15 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti, GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0); need_discard_input = true; } + if (p->ctty == get_ttyp ()->ntty + && p->pgid == get_ttyp ()->getpgid () && !p->cygstarted) + need_check_sigs = true; } - if (need_discard_input - && !CCEQ (ti.c_cc[VINTR], c) + if (!CCEQ (ti.c_cc[VINTR], c) && !CCEQ (ti.c_cc[VQUIT], c) && !CCEQ (ti.c_cc[VSUSP], c)) + need_check_sigs = false; + if (need_discard_input && !need_check_sigs) { if (!(ti.c_lflag & NOFLSH)) { @@ -364,7 +369,7 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti, continue; } } - if (ti.c_lflag & ISIG) + if ((ti.c_lflag & ISIG) && need_check_sigs) { int sig; if (CCEQ (ti.c_cc[VINTR], c)) @@ -469,7 +474,7 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti, } continue; } - else if (CCEQ (ti.c_cc[VEOF], c)) + else if (CCEQ (ti.c_cc[VEOF], c) && need_check_sigs) { termios_printf ("EOF"); accept_input ();