aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/tty.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/tty.cc')
-rw-r--r--winsup/cygwin/tty.cc34
1 files changed, 28 insertions, 6 deletions
diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc
index f831a53..624805f 100644
--- a/winsup/cygwin/tty.cc
+++ b/winsup/cygwin/tty.cc
@@ -147,8 +147,6 @@ tty_list::terminate ()
if (ttynum != -1 && tty_master && ttys[ttynum].master_pid == myself->pid)
{
tty *t = ttys + ttynum;
- CloseHandle (tty_master->from_master);
- CloseHandle (tty_master->to_master);
/* Wait for children which rely on tty handling in this process to
go away */
for (int i = 0; ; i++)
@@ -166,6 +164,8 @@ tty_list::terminate ()
}
lock_ttys here ();
+ CloseHandle (tty_master->from_master);
+ CloseHandle (tty_master->to_master);
termios_printf ("tty %d master about to finish", ttynum);
CloseHandle (tty_master->get_io_handle ());
@@ -209,7 +209,7 @@ tty_list::init ()
/* Search for tty class for our console. Allocate new tty if our process is
the only cygwin process in the current console.
Return tty number or -1 if error.
- If flag == 0, just find a free tty.
+ If with_console == 0, just find a free tty.
*/
int
tty_list::allocate (bool with_console)
@@ -218,8 +218,6 @@ tty_list::allocate (bool with_console)
int freetty = -1;
HANDLE hmaster = NULL;
- /* FIXME: This whole function needs a protective mutex. */
-
lock_ttys here;
if (!with_console)
@@ -261,7 +259,7 @@ tty_list::allocate (bool with_console)
}
}
- /* There is no tty allocated to console, allocate the first free found */
+ /* There is no tty allocated to console; allocate the first free found */
if (freetty == -1)
goto out;
@@ -295,6 +293,30 @@ tty::slave_alive ()
}
bool
+tty::exists ()
+{
+ /* Attempt to open the from-master side of the tty. If it is accessible
+ then it exists although it may have been privileges to actually use it. */
+ char pipename[sizeof("ttyNNNN-from-master")];
+ __small_sprintf (pipename, "tty%d-from-master", ntty);
+ HANDLE r, w;
+ int res = fhandler_pipe::create_selectable (&sec_none_nih, r, w, 0, pipename);
+ if (res)
+ return true;
+
+ CloseHandle (r);
+ CloseHandle (w);
+
+ HANDLE h = open_output_mutex ();
+ if (h)
+ {
+ CloseHandle (h);
+ return true;
+ }
+ return slave_alive ();
+}
+
+bool
tty::alive (const char *fmt)
{
HANDLE ev;