From fb3dd716764e26ddfd105cec227a689b97ddae91 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Fri, 12 Sep 2003 06:41:53 +0000 Subject: [PATCH] * dcrt0.cc (_dll_crt0): Accommodate breaking apart of early_stuff_init. * exceptions.cc (early_stuff_init): Delete. (init_console_handler): New function - top half of early_stuff_init. (init_global_security): New function - bottom half of early_stuff_init. (sig_handle): Avoid special hExeced test for SIGINT. Just terminate the captive process. (signal_exit): Add debugging output. * fhandler_tty.cc (fhandler_tty_slave::open): Don't allocate a console if one already seems to exist. Properly initialize ctrl-c handling if we do allocate a console. * winsup.h (early_stuff_init): Delete declaration. (init_console_handler): New declaration. (init_global_security): New declaration. --- winsup/cygwin/ChangeLog | 16 ++++++++++++++++ winsup/cygwin/dcrt0.cc | 3 ++- winsup/cygwin/exceptions.cc | 13 ++++++++++--- winsup/cygwin/fhandler_tty.cc | 10 ++++++---- winsup/cygwin/winsup.h | 3 ++- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c9cdc2669..a730fbc2c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,19 @@ +2003-09-12 Christopher Faylor + + * dcrt0.cc (_dll_crt0): Accommodate breaking apart of early_stuff_init. + * exceptions.cc (early_stuff_init): Delete. + (init_console_handler): New function - top half of early_stuff_init. + (init_global_security): New function - bottom half of early_stuff_init. + (sig_handle): Avoid special hExeced test for SIGINT. Just terminate + the captive process. + (signal_exit): Add debugging output. + * fhandler_tty.cc (fhandler_tty_slave::open): Don't allocate a console + if one already seems to exist. Properly initialize ctrl-c handling if + we do allocate a console. + * winsup.h (early_stuff_init): Delete declaration. + (init_console_handler): New declaration. + (init_global_security): New declaration. + 2003-09-11 Christopher Faylor * fhandler_disk_file.cc (path_conv::ndisk_links): Rename from diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index d8141dd06..d5817fb3e 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -859,7 +859,8 @@ _dll_crt0 () main_environ = user_data->envptr; *main_environ = NULL; - early_stuff_init (); + init_console_handler (); + init_global_security (); if (!DuplicateHandle (GetCurrentProcess (), GetCurrentProcess (), GetCurrentProcess (), &hMainProc, 0, FALSE, DUPLICATE_SAME_ACCESS)) diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 8105eb653..c1743d239 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -115,12 +115,16 @@ init_exception_handler (exception_list *el) #endif void -early_stuff_init () +init_console_handler () { (void) SetConsoleCtrlHandler (ctrl_c_handler, FALSE); if (!SetConsoleCtrlHandler (ctrl_c_handler, TRUE)) system_printf ("SetConsoleCtrlHandler failed, %E"); +} +void +init_global_security () +{ /* Initialize global security attribute stuff */ sec_none.nLength = sec_none_nih.nLength = @@ -1024,7 +1028,7 @@ sig_handle (int sig) if (handler == (void *) SIG_DFL) { if (sig == SIGCHLD || sig == SIGIO || sig == SIGCONT || sig == SIGWINCH - || sig == SIGURG || (hExeced && sig == SIGINT)) + || sig == SIGURG) { sigproc_printf ("default signal %d ignored", sig); goto done; @@ -1107,7 +1111,10 @@ signal_exit (int rc) user_data->resourcelocks->Init (); if (hExeced) - TerminateProcess (hExeced, rc); + { + sigproc_printf ("terminating captive process"); + TerminateProcess (hExeced, rc); + } sigproc_printf ("about to call do_exit (%x)", rc); (void) SetEvent (signal_arrived); diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc index 8ba843e17..9a1db30da 100644 --- a/winsup/cygwin/fhandler_tty.cc +++ b/winsup/cygwin/fhandler_tty.cc @@ -555,8 +555,8 @@ fhandler_tty_slave::open (path_conv *, int flags, mode_t) set_output_handle (to_master_local); set_open_status (); - if (fhandler_console::open_fhs++ == 0 && !output_done_event - && wincap.pty_needs_alloc_console ()) + if (fhandler_console::open_fhs++ == 0 && !GetConsoleCP () + && !output_done_event && wincap.pty_needs_alloc_console ()) { BOOL b; HWINSTA h = CreateWindowStation (NULL, 0, GENERIC_READ | GENERIC_WRITE, &sec_none_nih); @@ -567,8 +567,10 @@ fhandler_tty_slave::open (path_conv *, int flags, mode_t) termios_printf ("SetProcessWindowStation %d, %E", b); } b = AllocConsole (); // will cause flashing if workstation - // stuff fails - termios_printf ("%d = AllocConsole ()", b); + // stuff fails + termios_printf ("%d = AllocConsole (), %E", b); + if (b) + init_console_handler (); } termios_printf ("incremented open_fhs %d", fhandler_console::open_fhs); termios_printf ("tty%d opened", ttynum); diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 83db260ab..55c0fe8a1 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -223,7 +223,8 @@ void __stdcall to_timestruc_t (FILETIME * ptr, timestruc_t * out); void __stdcall time_as_timestruc_t (timestruc_t * out); void __stdcall set_console_title (char *); -void early_stuff_init (); +void init_console_handler (); +void init_global_security (); int __stdcall check_null_str (const char *name) __attribute__ ((regparm(1))); int __stdcall check_null_empty_str (const char *name) __attribute__ ((regparm(1)));