Technically we should stop ignoring Control-C.
authorIain Patterson <me@iain.cx>
Thu, 31 Mar 2016 07:34:33 +0000 (08:34 +0100)
committerIain Patterson <me@iain.cx>
Thu, 31 Mar 2016 07:34:33 +0000 (08:34 +0100)
Before signalling our application we implement a null Control-C handler
so we don't get killed ourselves when signalling the process group.  We
should probably restore the default behaviour after signalling.

process.cpp

index d1a9a49..62a46af 100644 (file)
@@ -241,7 +241,8 @@ int kill_console(nssm_service_t *service, kill_t *k) {
 \r
   /* Ignore the event ourselves. */\r
   ret = 0;\r
-  if (! SetConsoleCtrlHandler(0, TRUE)) {\r
+  bool ignored = SetConsoleCtrlHandler(0, TRUE);\r
+  if (! ignored) {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_SETCONSOLECTRLHANDLER_FAILED, k->name, error_string(GetLastError()), 0);\r
     ret = 4;\r
   }\r
@@ -262,6 +263,11 @@ int kill_console(nssm_service_t *service, kill_t *k) {
   /* Wait for process to exit. */\r
   if (await_single_handle(k->status_handle, k->status, k->process_handle, k->name, _T(__FUNCTION__), k->kill_console_delay)) ret = 6;\r
 \r
+  /* Remove our handler. */\r
+  if (ignored && ! SetConsoleCtrlHandler(0, FALSE)) {\r
+    log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_SETCONSOLECTRLHANDLER_FAILED, k->name, error_string(GetLastError()), 0);\r
+  }\r
+\r
   return ret;\r
 }\r
 \r