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:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2019-09-05 16:22:27 +0300
committerKen Brown <kbrown@cornell.edu>2019-09-05 18:42:26 +0300
commit46d3953d644bd7381c9cc3231b4826c018c51b90 (patch)
tree9c219f2ede2baeb84526b50f4d26b36514a6a628
parentb7e429420063264d0be7ee6804f3e6f143f66232 (diff)
Cygwin: pty: Make sure to show system error messages
- Forcibly attach to pseudo console in advance so that the error messages by system_printf() are displayed to screen reliably. This is needed when stdout is redirected to another pty. In this case, process has two ptys opened. However, process can attach to only one console. So it is necessary to change console attached.
-rw-r--r--winsup/cygwin/fhandler_tty.cc55
1 files changed, 49 insertions, 6 deletions
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 78c9c9128..2533e5618 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -88,16 +88,59 @@ set_switch_to_pcon (void)
}
}
+static void
+force_attach_to_pcon (HANDLE h)
+{
+ bool attach_done = false;
+ for (int n = 0; n < 2; n ++)
+ {
+ /* First time, attach to the pty whose handle value is match.
+ Second time, try to attach to any pty. */
+ cygheap_fdenum cfd (false);
+ while (cfd.next () >= 0)
+ if (cfd->get_major () == DEV_PTYS_MAJOR)
+ {
+ fhandler_base *fh = cfd;
+ fhandler_pty_slave *ptys = (fhandler_pty_slave *) fh;
+ if (n != 0
+ || h == ptys->get_handle ()
+ || h == ptys->get_output_handle ())
+ {
+ if (fhandler_console::get_console_process_id
+ (ptys->getHelperProcessId (), true))
+ attach_done = true;
+ else
+ {
+ FreeConsole ();
+ if (AttachConsole (ptys->getHelperProcessId ()))
+ {
+ pcon_attached_to = ptys->get_minor ();
+ attach_done = true;
+ }
+ else
+ pcon_attached_to = -1;
+ }
+ break;
+ }
+ }
+ if (attach_done)
+ break;
+ }
+}
+
void
set_ishybrid_and_switch_to_pcon (HANDLE h)
{
- DWORD dummy;
- if (!isHybrid
- && GetFileType (h) == FILE_TYPE_CHAR
- && GetConsoleMode (h, &dummy))
+ if (GetFileType (h) == FILE_TYPE_CHAR)
{
- isHybrid = true;
- set_switch_to_pcon ();
+ force_attach_to_pcon (h);
+ DWORD dummy;
+ if (!isHybrid && (GetConsoleMode (h, &dummy)
+ || GetLastError () != ERROR_INVALID_HANDLE))
+ {
+ isHybrid = true;
+ set_switch_to_pcon ();
+ }
}
}