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.
This commit is contained in:
parent
b7e4294200
commit
46d3953d64
|
@ -88,17 +88,60 @@ 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)
|
||||
{
|
||||
if (GetFileType (h) == FILE_TYPE_CHAR)
|
||||
{
|
||||
force_attach_to_pcon (h);
|
||||
DWORD dummy;
|
||||
if (!isHybrid
|
||||
&& GetFileType (h) == FILE_TYPE_CHAR
|
||||
&& GetConsoleMode (h, &dummy))
|
||||
if (!isHybrid && (GetConsoleMode (h, &dummy)
|
||||
|| GetLastError () != ERROR_INVALID_HANDLE))
|
||||
{
|
||||
isHybrid = true;
|
||||
set_switch_to_pcon ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define DEF_HOOK(name) static __typeof__ (name) *name##_Orig
|
||||
|
|
Loading…
Reference in New Issue