Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_termios.cc')
-rw-r--r--winsup/cygwin/fhandler_termios.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
index bd75ee804..1383d5e37 100644
--- a/winsup/cygwin/fhandler_termios.cc
+++ b/winsup/cygwin/fhandler_termios.cc
@@ -114,14 +114,23 @@ fhandler_pty_master::tcgetpgrp ()
return tc ()->pgid;
}
+static inline bool
+is_flush_sig (int sig)
+{
+ return sig == SIGINT || sig == SIGQUIT || sig == SIGTSTP;
+}
+
void
tty_min::kill_pgrp (int sig)
{
bool killself = false;
+ if (is_flush_sig (sig) && cygheap->ctty)
+ cygheap->ctty->sigflush ();
winpids pids ((DWORD) PID_MAP_RW);
siginfo_t si = {0};
si.si_signo = sig;
si.si_code = SI_KERNEL;
+
for (unsigned i = 0; i < pids.npids; i++)
{
_pinfo *p = pids[i];
@@ -163,7 +172,7 @@ tty_min::is_orphaned_process_group (int pgid)
bg_check_types
fhandler_termios::bg_check (int sig)
{
- if (!myself->pgid || tc ()->getpgid () == myself->pgid ||
+ if (!myself->pgid || !tc () || tc ()->getpgid () == myself->pgid ||
myself->ctty != tc ()->ntty ||
((sig == SIGTTOU) && !(tc ()->ti.c_lflag & TOSTOP)))
return bg_ok;
@@ -396,8 +405,9 @@ fhandler_termios::sigflush ()
/* FIXME: Checking get_ttyp() for NULL is not right since it should not
be NULL while this is alive. However, we can conceivably close a
ctty while exiting and that will zero this. */
- if ((!have_execed || have_execed_cygwin) && get_ttyp ()
- && !(get_ttyp ()->ti.c_lflag & NOFLSH))
+ if ((!have_execed || have_execed_cygwin) && tc ()
+ && (tc ()->getpgid () == myself->pgid)
+ && !(tc ()->ti.c_lflag & NOFLSH))
tcflush (TCIFLUSH);
}