public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: pty: Make sure to show system error messages
@ 2019-09-05 16:09 Ken Brown
  0 siblings, 0 replies; only message in thread
From: Ken Brown @ 2019-09-05 16:09 UTC (permalink / raw)
  To: cygwin-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=46d3953d644bd7381c9cc3231b4826c018c51b90

commit 46d3953d644bd7381c9cc3231b4826c018c51b90
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date:   Thu Sep 5 22:22:27 2019 +0900

    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.

Diff:
---
 winsup/cygwin/fhandler_tty.cc | 55 ++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 49 insertions(+), 6 deletions(-)

diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 78c9c91..2533e56 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 ();
+	}
     }
 }


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-09-05 16:09 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-05 16:09 [newlib-cygwin] Cygwin: pty: Make sure to show system error messages Ken Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).