summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_console.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_console.cc')
-rw-r--r--winsup/cygwin/fhandler_console.cc32
1 files changed, 24 insertions, 8 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 5082da316..690930453 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -131,8 +131,18 @@ bool
fhandler_console::set_unit ()
{
bool created;
+ fh_devices devset;
if (shared_console_info)
- created = false;
+ {
+ fh_devices this_unit = dev ();
+ fh_devices shared_unit =
+ (fh_devices) shared_console_info->tty_min_state.getntty ();
+ created = false;
+ devset = (shared_unit == this_unit || this_unit == FH_CONSOLE
+ || this_unit == FH_CONIN || this_unit == FH_CONOUT
+ || this_unit == FH_TTY) ?
+ shared_unit : FH_ERROR;
+ }
else
{
HWND me = GetConsoleWindow ();
@@ -144,14 +154,15 @@ fhandler_console::set_unit ()
lock_ttys here;
shared_console_info->tty_min_state.setntty (DEV_CONS_MAJOR, console_unit (me));
}
+ devset = (fh_devices) shared_console_info->tty_min_state.getntty ();
}
+ dev ().parse (devset);
return created;
}
-/* Allocate and initialize the shared record for the current console.
- Returns a pointer to shared_console_info. */
-tty_min *
+/* Allocate and initialize the shared record for the current console. */
+void
fhandler_console::get_tty_stuff ()
{
if (set_unit ())
@@ -182,8 +193,6 @@ fhandler_console::get_tty_stuff ()
dev_state.backspace_keycode = CERASE;
shared_console_info->tty_min_state.sethwnd ((HWND) INVALID_HANDLE_VALUE);
}
-
- return &shared_console_info->tty_min_state;
}
/* Return the tty structure associated with a given tty number. If the
@@ -756,6 +765,12 @@ fhandler_console::open (int flags, mode_t)
{
HANDLE h;
+ if (dev () == FH_ERROR)
+ {
+ set_errno (EPERM); /* constructor found an error */
+ return 0;
+ }
+
tcinit (false);
set_io_handle (NULL);
@@ -1033,11 +1048,12 @@ fhandler_console::tcgetattr (struct termios *t)
return res;
}
-fhandler_console::fhandler_console () :
+fhandler_console::fhandler_console (fh_devices unit) :
fhandler_termios ()
{
+ if (unit > 0)
+ dev ().parse (unit);
get_tty_stuff ();
- dev ().parse (shared_console_info->tty_min_state.getntty ());
trunc_buf.len = 0;
}