summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_tty.cc
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2015-06-08 14:07:42 +0200
committerCorinna Vinschen <corinna@vinschen.de>2015-06-08 14:07:42 +0200
commit511eb2f264c582ac753650b4848edae5b6d8c968 (patch)
tree502d89d71de538e411ae1484fd6693c0a7fe495f /winsup/cygwin/fhandler_tty.cc
parent4c3946c350aa74ab36c5eea3f49a888ac0662561 (diff)
downloadcygnal-511eb2f264c582ac753650b4848edae5b6d8c968.tar.gz
cygnal-511eb2f264c582ac753650b4848edae5b6d8c968.tar.bz2
cygnal-511eb2f264c582ac753650b4848edae5b6d8c968.zip
Generate SIGHUP for terminal process group on tty master close
* fhandler_tty.cc (fhandler_pty_slave::write): Move causing of SIGHUP into fhandler_pty_master::close(). (fhandler_pty_slave::read): Ditto. (fhandler_pty_master::close): Ditto. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/fhandler_tty.cc')
-rw-r--r--winsup/cygwin/fhandler_tty.cc24
1 files changed, 18 insertions, 6 deletions
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 1b5c18bc7..f22998f9f 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -622,7 +622,6 @@ fhandler_pty_slave::write (const void *ptr, size_t len)
default:
__seterrno_from_win_error (err);
}
- raise (SIGHUP); /* FIXME: Should this be SIGTTOU? */
towrite = -1;
}
return towrite;
@@ -749,7 +748,12 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
goto out;
}
if (!bytes_available (bytes_in_pipe))
- raise (SIGHUP);
+ {
+ ReleaseMutex (input_mutex);
+ set_errno (EIO);
+ totalread = -1;
+ goto out;
+ }
/* On first peek determine no. of bytes to flush. */
if (!ptr && len == UINT_MAX)
@@ -779,9 +783,10 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
if (!ReadFile (get_handle (), buf, readlen, &n, NULL))
{
termios_printf ("read failed, %E");
- raise (SIGHUP);
- bytes_in_pipe = 0;
- ptr = NULL;
+ ReleaseMutex (input_mutex);
+ set_errno (EIO);
+ totalread = -1;
+ goto out;
}
else
{
@@ -790,7 +795,12 @@ fhandler_pty_slave::read (void *ptr, size_t& len)
change after successful read. So we have to peek into the pipe
again to see if input is still available */
if (!bytes_available (bytes_in_pipe))
- raise (SIGHUP);
+ {
+ ReleaseMutex (input_mutex);
+ set_errno (EIO);
+ totalread = -1;
+ goto out;
+ }
if (n)
{
len -= n;
@@ -1269,6 +1279,8 @@ fhandler_pty_master::close ()
else if (obi.HandleCount == 1)
{
termios_printf("Closing last master of pty%d", get_minor ());
+ if (get_ttyp ()->getsid () > 0)
+ kill (get_ttyp ()->getsid (), SIGHUP);
SetEvent (input_available_event);
}