Don't suicide on exit status 0.
[nssm.git] / registry.cpp
index 4b92696..ed01303 100644 (file)
@@ -3,7 +3,7 @@
 int create_messages() {\r
   HKEY key;\r
 \r
-  char registry[MAX_PATH];\r
+  char registry[KEY_LENGTH];\r
   if (_snprintf(registry, sizeof(registry), "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s", NSSM) < 0) {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "eventlog registry", "create_messages()", 0);\r
     return 1;\r
@@ -28,7 +28,7 @@ int create_messages() {
 \r
 int create_parameters(char *service_name, char *exe, char *flags, char *dir) {\r
   /* Get registry */\r
-  char registry[MAX_PATH];\r
+  char registry[KEY_LENGTH];\r
   if (_snprintf(registry, sizeof(registry), NSSM_REGISTRY, service_name) < 0) {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "NSSM_REGISTRY", "create_parameters()", 0);\r
     return 1;\r
@@ -69,7 +69,7 @@ int create_parameters(char *service_name, char *exe, char *flags, char *dir) {
 \r
 int create_exit_action(char *service_name, const char *action_string) {\r
   /* Get registry */\r
-  char registry[MAX_PATH];\r
+  char registry[KEY_LENGTH];\r
   if (_snprintf(registry, sizeof(registry), NSSM_REGISTRY "\\%s", service_name, NSSM_REG_EXIT) < 0) {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "NSSM_REG_EXIT", "create_exit_action()", 0);\r
     return 1;\r
@@ -104,7 +104,7 @@ int create_exit_action(char *service_name, const char *action_string) {
 \r
 int get_parameters(char *service_name, char *exe, int exelen, char *flags, int flagslen, char *dir, int dirlen) {\r
   /* Get registry */\r
-  char registry[MAX_PATH];\r
+  char registry[KEY_LENGTH];\r
   if (_snprintf(registry, sizeof(registry), NSSM_REGISTRY, service_name) < 0) {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "NSSM_REGISTRY", "get_parameters()", 0);\r
     return 1;\r
@@ -146,9 +146,12 @@ int get_parameters(char *service_name, char *exe, int exelen, char *flags, int f
   return 0;\r
 }\r
 \r
-int get_exit_action(char *service_name, unsigned long *ret, unsigned char *action) {\r
+int get_exit_action(char *service_name, unsigned long *ret, unsigned char *action, bool *default_action) {\r
+  /* Are we returning the default action or a status-specific one? */\r
+  *default_action = ! ret;\r
+\r
   /* Get registry */\r
-  char registry[MAX_PATH];\r
+  char registry[KEY_LENGTH];\r
   if (_snprintf(registry, sizeof(registry), NSSM_REGISTRY "\\%s", service_name, NSSM_REG_EXIT) < 0) {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "NSSM_REG_EXIT", "get_exit_action()", 0);\r
     return 1;\r
@@ -169,12 +172,12 @@ int get_exit_action(char *service_name, unsigned long *ret, unsigned char *actio
   if (! ret) code[0] = '\0';\r
   else if (_snprintf(code, sizeof(code), "%lu", *ret) < 0) {\r
     RegCloseKey(key);\r
-    return get_exit_action(service_name, 0, action);\r
+    return get_exit_action(service_name, 0, action, default_action);\r
   }\r
   if (RegQueryValueEx(key, code, 0, &type, action, &action_len) != ERROR_SUCCESS) {\r
     RegCloseKey(key);\r
     /* Try again with * as the key if an exit code was defined */\r
-    if (ret) return get_exit_action(service_name, 0, action);\r
+    if (ret) return get_exit_action(service_name, 0, action, default_action);\r
     return 0;\r
   }\r
 \r