diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index d1c9abe6f..d911e23ed 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2003-04-19 Christopher Faylor + + * wincap.h (wincaps:pty_needs_alloc_console): New element. + (wincapc:pty_needs_alloc_console): New function. + * wincap.cc: Add pty_needs_alloc_console throughout. + * fhandler_tty.cc (fhandler_tty_slave::open): Open an "invisible" + console on first pty allocation. + 2003-04-18 Christopher Faylor * fhandler_tty.cc (fhandler_tty_slave::open): Allocate a console diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 00147103a..6285b24bd 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -9,6 +9,8 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ #include "winsup.h" +#include +#include #include #include #include @@ -554,9 +556,19 @@ fhandler_tty_slave::open (path_conv *, int flags, mode_t) set_open_status (); if (!output_done_event) { - if (fhandler_console::open_fhs++ == 0) + if (fhandler_console::open_fhs++ == 0 + && wincap.pty_needs_alloc_console ()) { - BOOL b = AllocConsole (); + BOOL b; + HWINSTA h = CreateWindowStation (NULL, 0, GENERIC_READ | GENERIC_WRITE, &sec_none_nih); + termios_printf ("CreateWindowStation %p, %E", h); + if (h) + { + b = SetProcessWindowStation (h); + termios_printf ("SetProcessWindowStation %d, %E", b); + } + b = AllocConsole (); // will cause flashing if workstation + // stuff fails termios_printf ("%d = AllocConsole ()", b); } termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs); diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc index e70a362da..b5385f29c 100644 --- a/winsup/cygwin/wincap.cc +++ b/winsup/cygwin/wincap.cc @@ -47,7 +47,8 @@ static NO_COPY wincaps wincap_unknown = { has_64bit_file_access:false, has_process_io_counters:false, supports_reading_modem_output_lines:false, - needs_memory_protection:false + needs_memory_protection:false, + pty_needs_alloc_console:false }; static NO_COPY wincaps wincap_95 = { @@ -86,7 +87,8 @@ static NO_COPY wincaps wincap_95 = { has_64bit_file_access:false, has_process_io_counters:false, supports_reading_modem_output_lines:false, - needs_memory_protection:false + needs_memory_protection:false, + pty_needs_alloc_console:false }; static NO_COPY wincaps wincap_95osr2 = { @@ -125,7 +127,8 @@ static NO_COPY wincaps wincap_95osr2 = { has_64bit_file_access:false, has_process_io_counters:false, supports_reading_modem_output_lines:false, - needs_memory_protection:false + needs_memory_protection:false, + pty_needs_alloc_console:false }; static NO_COPY wincaps wincap_98 = { @@ -164,7 +167,8 @@ static NO_COPY wincaps wincap_98 = { has_64bit_file_access:false, has_process_io_counters:false, supports_reading_modem_output_lines:false, - needs_memory_protection:false + needs_memory_protection:false, + pty_needs_alloc_console:false }; static NO_COPY wincaps wincap_98se = { @@ -203,7 +207,8 @@ static NO_COPY wincaps wincap_98se = { has_64bit_file_access:false, has_process_io_counters:false, supports_reading_modem_output_lines:false, - needs_memory_protection:false + needs_memory_protection:false, + pty_needs_alloc_console:false }; static NO_COPY wincaps wincap_me = { @@ -242,7 +247,8 @@ static NO_COPY wincaps wincap_me = { has_64bit_file_access:false, has_process_io_counters:false, supports_reading_modem_output_lines:false, - needs_memory_protection:false + needs_memory_protection:false, + pty_needs_alloc_console:false }; static NO_COPY wincaps wincap_nt3 = { @@ -281,7 +287,8 @@ static NO_COPY wincaps wincap_nt3 = { has_64bit_file_access:true, has_process_io_counters:false, supports_reading_modem_output_lines:true, - needs_memory_protection:true + needs_memory_protection:true, + pty_needs_alloc_console:true }; static NO_COPY wincaps wincap_nt4 = { @@ -320,7 +327,8 @@ static NO_COPY wincaps wincap_nt4 = { has_64bit_file_access:true, has_process_io_counters:false, supports_reading_modem_output_lines:true, - needs_memory_protection:true + needs_memory_protection:true, + pty_needs_alloc_console:true }; static NO_COPY wincaps wincap_nt4sp4 = { @@ -359,7 +367,8 @@ static NO_COPY wincaps wincap_nt4sp4 = { has_64bit_file_access:true, has_process_io_counters:false, supports_reading_modem_output_lines:true, - needs_memory_protection:true + needs_memory_protection:true, + pty_needs_alloc_console:true }; static NO_COPY wincaps wincap_2000 = { @@ -398,7 +407,8 @@ static NO_COPY wincaps wincap_2000 = { has_64bit_file_access:true, has_process_io_counters:true, supports_reading_modem_output_lines:true, - needs_memory_protection:true + needs_memory_protection:true, + pty_needs_alloc_console:true }; static NO_COPY wincaps wincap_xp = { @@ -437,7 +447,8 @@ static NO_COPY wincaps wincap_xp = { has_64bit_file_access:true, has_process_io_counters:true, supports_reading_modem_output_lines:true, - needs_memory_protection:true + needs_memory_protection:true, + pty_needs_alloc_console:true }; wincapc wincap; diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h index a89f0a5ad..066374fd8 100644 --- a/winsup/cygwin/wincap.h +++ b/winsup/cygwin/wincap.h @@ -49,6 +49,7 @@ struct wincaps unsigned has_process_io_counters : 1; unsigned supports_reading_modem_output_lines : 1; unsigned needs_memory_protection : 1; + unsigned pty_needs_alloc_console : 1; }; class wincapc @@ -102,6 +103,7 @@ public: bool IMPLEMENT (has_process_io_counters) bool IMPLEMENT (supports_reading_modem_output_lines) bool IMPLEMENT (needs_memory_protection) + bool IMPLEMENT (pty_needs_alloc_console) #undef IMPLEMENT };