Cygwin: pty: Fix transferring type-ahead input between input pipes.

After the commit e5fcc5837c, transferring type-ahead input between
the pipe for cygwin app and the pipe for non-cygwin app will not be
done appropriately when the stdin of the non-cygwin app is not pty.
Due to this issue, sometimes the keyboard input might be lost which
should be sent to cygwin app. This patch fixes the issue.

Fixes: e5fcc5837c ("Cygwin: pty: Fix reading CONIN$ when stdin is not a pty.")
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
This commit is contained in:
Takashi Yano 2023-06-01 19:44:41 +09:00
parent 28489b0702
commit 9fc746d17d
1 changed files with 3 additions and 17 deletions

View File

@ -1297,17 +1297,7 @@ fhandler_pty_slave::mask_switch_to_nat_pipe (bool mask, bool xfer)
else if (InterlockedDecrement (&num_reader) == 0) else if (InterlockedDecrement (&num_reader) == 0)
CloseHandle (slave_reading); CloseHandle (slave_reading);
/* This is needed when cygwin-app is started from non-cygwin app if if (!!masked != mask && xfer && get_ttyp ()->switch_to_nat_pipe)
pseudo console is disabled. */
bool need_xfer = get_ttyp ()->nat_fg (get_ttyp ()->getpgid ())
&& get_ttyp ()->switch_to_nat_pipe && !get_ttyp ()->pcon_activated;
/* In GDB, transfer input based on setpgid() does not work because
GDB may not set terminal process group properly. Therefore,
transfer input here if isHybrid is set. */
bool need_gdb_xfer =
isHybrid && GetStdHandle (STD_INPUT_HANDLE) == get_handle ();
if (!!masked != mask && xfer && (need_gdb_xfer || need_xfer))
{ {
if (mask && get_ttyp ()->pty_input_state_eq (tty::to_nat)) if (mask && get_ttyp ()->pty_input_state_eq (tty::to_nat))
{ {
@ -2238,11 +2228,7 @@ fhandler_pty_master::write (const void *ptr, size_t len)
if (!get_ttyp ()->pcon_start) if (!get_ttyp ()->pcon_start)
{ /* Pseudo console initialization has been done in above code. */ { /* Pseudo console initialization has been done in above code. */
pinfo pp (get_ttyp ()->pcon_start_pid); pinfo pp (get_ttyp ()->pcon_start_pid);
bool pcon_fg = (pp && get_ttyp ()->getpgid () == pp->pgid); if (get_ttyp ()->switch_to_nat_pipe
/* GDB may set WINPID rather than cygwin PID to process group
when the debugged process is a non-cygwin process.*/
pcon_fg |= !pinfo (get_ttyp ()->getpgid ());
if (get_ttyp ()->switch_to_nat_pipe && pcon_fg
&& get_ttyp ()->pty_input_state_eq (tty::to_cyg)) && get_ttyp ()->pty_input_state_eq (tty::to_cyg))
{ {
/* This accept_input() call is needed in order to transfer input /* This accept_input() call is needed in order to transfer input
@ -4089,7 +4075,7 @@ fhandler_pty_slave::cleanup_for_non_cygwin_app (handle_set_t *p, tty *ttyp,
DWORD force_switch_to) DWORD force_switch_to)
{ {
ttyp->wait_fwd (); ttyp->wait_fwd ();
if (ttyp->getpgid () == myself->pgid && stdin_is_ptys if ((ttyp->pcon_activated || stdin_is_ptys)
&& ttyp->pty_input_state_eq (tty::to_nat)) && ttyp->pty_input_state_eq (tty::to_nat))
{ {
WaitForSingleObject (p->input_mutex, mutex_timeout); WaitForSingleObject (p->input_mutex, mutex_timeout);