From 4c6f65fc7cb35214eb75198d5a131b0927158688 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 18 Apr 2006 16:24:54 +0000 Subject: [PATCH] * exceptions.cc (ctrl_c_handler): Only exit TRUE on CTRL_LOGOFF_EVENT when we have actually handled the event. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/exceptions.cc | 32 ++++++++++++-------------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 960d728e0..e182fc84b 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2006-04-18 Christopher Faylor + + * exceptions.cc (ctrl_c_handler): Only exit TRUE on CTRL_LOGOFF_EVENT + when we have actually handled the event. + 2006-04-17 Eric Blake * mktemp.cc (_gettemp): Open temp files in binary mode. diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 11058deef..b18d82a82 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; } }