Bläddra i källkod

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.
Iain Patterson 12 år sedan
förälder
incheckning
39d56be3b1
2 ändrade filer med 20 tillägg och 2 borttagningar
  1. 13 0
      messages.mc
  2. 7 2
      service.cpp

+ 13 - 0
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é:
+.
+

+ 7 - 2
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() {