From: Iain Patterson <me@iain.cx>
Date: Tue, 15 May 2012 10:05:57 +0000 (+0100)
Subject: Fixed incomplete set_service_recovery().
X-Git-Tag: v2.13~5
X-Git-Url: http://git.iain.cx/?a=commitdiff_plain;h=39d56be3b1cbecfb903617a63355b57f61424a73;p=nssm.git

Fixed incomplete set_service_recovery().

A rogue return prevented set_service_recovery() from actually doing anything.
Also we weren't checking for failure in ChangeServiceConfig2().  We expect
ERROR_INVALID_LEVEL on pre-Vista Windows but other errors were not detected.

French translation by François-Régis Tardy.
---

diff --git a/messages.mc b/messages.mc
index f939c20..2172a72 100644
--- a/messages.mc
+++ b/messages.mc
@@ -495,3 +495,16 @@ Language = French
 Le service %1 a reçu le code de contrôle inconnu %2, qui sera donc ignoré.
 .
 
+MessageId = +1
+SymbolicName = NSSM_EVENT_CHANGESERVICECONFIG2_FAILED
+Severity = Informational
+Language = English
+Error configuring service failure actions for service %1.  The service will not be subject to recovery actions if it exits gracefully with a non-zero exit code.
+ChangeServiceConfig2() failed:
+%2
+.
+Language = French
+Erreur lors de la configuration des actions en cas d'échec du service %1.  Le service ne déclenchera aucune action de récupération s'il se termine normalement avec un code retour non nul.
+ChangeServiceConfig2() a échoué:
+.
+
diff --git a/service.cpp b/service.cpp
index fd25163..7e9a9d7 100644
--- a/service.cpp
+++ b/service.cpp
@@ -225,14 +225,19 @@ void set_service_recovery(char *service_name) {
 
   SC_HANDLE service = OpenService(services, service_name, SC_MANAGER_ALL_ACCESS);
   if (! service) return;
-  return;
 
   SERVICE_FAILURE_ACTIONS_FLAG flag;
   ZeroMemory(&flag, sizeof(flag));
   flag.fFailureActionsOnNonCrashFailures = true;
 
   /* This functionality was added in Vista so the call may fail */
-  ChangeServiceConfig2(service, SERVICE_CONFIG_FAILURE_ACTIONS_FLAG, &flag);
+  if (! ChangeServiceConfig2(service, SERVICE_CONFIG_FAILURE_ACTIONS_FLAG, &flag)) {
+    unsigned long error = GetLastError();
+    /* Pre-Vista we expect to fail with ERROR_INVALID_LEVEL */
+    if (error != ERROR_INVALID_LEVEL) {
+      log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CHANGESERVICECONFIG2_FAILED, service_name, error_string(error), 0);
+    }
+  }
 }
 
 int monitor_service() {