aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/exceptions.cc32
2 files changed, 17 insertions, 20 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 960d728..e182fc8 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2006-04-18 Christopher Faylor <cgf@timesys.com>
+
+ * exceptions.cc (ctrl_c_handler): Only exit TRUE on CTRL_LOGOFF_EVENT
+ when we have actually handled the event.
+
2006-04-17 Eric Blake <ebb9@byu.net>
* mktemp.cc (_gettemp): Open temp files in binary mode.
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;
}
}