From 4c6f65fc7cb35214eb75198d5a131b0927158688 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 18 Apr 2006 16:24:54 +0000 Subject: * exceptions.cc (ctrl_c_handler): Only exit TRUE on CTRL_LOGOFF_EVENT when we have actually handled the event. --- winsup/cygwin/exceptions.cc | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) (limited to 'winsup/cygwin/exceptions.cc') diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 11058de..b18d82a 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -929,26 +929,18 @@ ctrl_c_handler (DWORD type) } if (!saw_close && type == CTRL_LOGOFF_EVENT) { -#if 0 - /* CV, 2005-09-08: The CTRL_LOGOFF_EVENT is only send to services. - It's send when *any* user logs off. Services generally have - a modified console handler which allows services to survive - also after a user logged out, even if the service has a console - window attached to the visible window station of the user - ("Interact with desktop"). The below code contradicts this - standard behaviour, so for now, we disable it and just return - FALSE to get the default behaviour or the one the application's - own console handler (if any) requires. - In other words: We never send SIGHUP to services and their - child processes on a LOGOFF event. */ - - /* Check if the process is actually associated with a visible - window station, one which actually represents a visible desktop. - If not, the CTRL_LOGOFF_EVENT doesn't concern this process. */ - if (has_visible_window_station ()) - sig_send (myself_nowait, SIGHUP); -#endif - return TRUE; + /* The CTRL_LOGOFF_EVENT is sent when *any* user logs off. + The below code sends a SIGHUP only if it is not performing the + default activity for SIGHUP. Note that it is possible for two + SIGHUP signals to arrive if a process group leader is exiting + too. Getting this 100% right is saved for a future cygwin mailing + list goad. */ + if (global_sigs[SIGHUP].sa_handler != SIG_DFL) + { + sig_send (myself_nowait, SIGHUP); + return TRUE; + } + return FALSE; } } -- cgit v1.1