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.
This commit is contained in:
Takashi Yano 2022-02-12 17:51:55 +09:00
parent c05c36a7c8
commit b04aea00f1
1 changed files with 9 additions and 4 deletions

View File

@ -329,6 +329,7 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
if (ti.c_iflag & ISTRIP) if (ti.c_iflag & ISTRIP)
c &= 0x7f; c &= 0x7f;
winpids pids ((DWORD) 0); 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)) if (get_ttyp ()->pcon_input_state_eq (tty::to_nat))
{ {
bool need_discard_input = false; 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); GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0);
need_discard_input = true; 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 if (!CCEQ (ti.c_cc[VINTR], c)
&& !CCEQ (ti.c_cc[VINTR], c)
&& !CCEQ (ti.c_cc[VQUIT], c) && !CCEQ (ti.c_cc[VQUIT], c)
&& !CCEQ (ti.c_cc[VSUSP], c)) && !CCEQ (ti.c_cc[VSUSP], c))
need_check_sigs = false;
if (need_discard_input && !need_check_sigs)
{ {
if (!(ti.c_lflag & NOFLSH)) if (!(ti.c_lflag & NOFLSH))
{ {
@ -364,7 +369,7 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
continue; continue;
} }
} }
if (ti.c_lflag & ISIG) if ((ti.c_lflag & ISIG) && need_check_sigs)
{ {
int sig; int sig;
if (CCEQ (ti.c_cc[VINTR], c)) if (CCEQ (ti.c_cc[VINTR], c))
@ -469,7 +474,7 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
} }
continue; continue;
} }
else if (CCEQ (ti.c_cc[VEOF], c)) else if (CCEQ (ti.c_cc[VEOF], c) && need_check_sigs)
{ {
termios_printf ("EOF"); termios_printf ("EOF");
accept_input (); accept_input ();