Fixed bug when installing from the command line.
[nssm.git] / service.cpp
index dffd7aa..0a95ccf 100644 (file)
@@ -5,8 +5,7 @@ bool use_critical_section;
 \r
 extern imports_t imports;\r
 \r
-static enum { NSSM_EXIT_RESTART, NSSM_EXIT_IGNORE, NSSM_EXIT_REALLY, NSSM_EXIT_UNCLEAN } exit_actions;\r
-static const char *exit_action_strings[] = { "Restart", "Ignore", "Exit", "Suicide", 0 };\r
+const char *exit_action_strings[] = { "Restart", "Ignore", "Exit", "Suicide", 0 };\r
 \r
 static inline int throttle_milliseconds(unsigned long throttle) {\r
   /* pow() operates on doubles. */\r
@@ -33,6 +32,26 @@ SC_HANDLE open_service_manager() {
   return ret;\r
 }\r
 \r
+/* Set default values which aren't zero. */\r
+void set_nssm_service_defaults(nssm_service_t *service) {\r
+  if (! service) return;\r
+\r
+  service->stdin_sharing = NSSM_STDIN_SHARING;\r
+  service->stdin_disposition = NSSM_STDIN_DISPOSITION;\r
+  service->stdin_flags = NSSM_STDIN_FLAGS;\r
+  service->stdout_sharing = NSSM_STDOUT_SHARING;\r
+  service->stdout_disposition = NSSM_STDOUT_DISPOSITION;\r
+  service->stdout_flags = NSSM_STDOUT_FLAGS;\r
+  service->stderr_sharing = NSSM_STDERR_SHARING;\r
+  service->stderr_disposition = NSSM_STDERR_DISPOSITION;\r
+  service->stderr_flags = NSSM_STDERR_FLAGS;\r
+  service->throttle_delay = NSSM_RESET_THROTTLE_RESTART;\r
+  service->stop_method = ~0;\r
+  service->kill_console_delay = NSSM_KILL_CONSOLE_GRACE_PERIOD;\r
+  service->kill_window_delay = NSSM_KILL_WINDOW_GRACE_PERIOD;\r
+  service->kill_threads_delay = NSSM_KILL_THREADS_GRACE_PERIOD;\r
+}\r
+\r
 /* Allocate and zero memory for a service. */\r
 nssm_service_t *alloc_nssm_service() {\r
   nssm_service_t *service = (nssm_service_t *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(nssm_service_t));\r
@@ -44,6 +63,7 @@ nssm_service_t *alloc_nssm_service() {
 void cleanup_nssm_service(nssm_service_t *service) {\r
   if (! service) return;\r
   if (service->env) HeapFree(GetProcessHeap(), 0, service->env);\r
+  if (service->env_extra) HeapFree(GetProcessHeap(), 0, service->env_extra);\r
   if (service->handle) CloseServiceHandle(service->handle);\r
   if (service->process_handle) CloseHandle(service->process_handle);\r
   if (service->wait_handle) UnregisterWait(service->process_handle);\r
@@ -63,13 +83,14 @@ int pre_install_service(int argc, char **argv) {
     return 1;\r
   }\r
 \r
+  set_nssm_service_defaults(service);\r
   memmove(service->name, argv[0], strlen(argv[0]));\r
   memmove(service->exe, argv[1], strlen(argv[1]));\r
 \r
   /* Arguments are optional */\r
   size_t flagslen = 0;\r
   size_t s = 0;\r
-  size_t i;\r
+  int i;\r
   for (i = 2; i < argc; i++) flagslen += strlen(argv[i]) + 1;\r
   if (! flagslen) flagslen = 1;\r
 \r
@@ -87,10 +108,8 @@ int pre_install_service(int argc, char **argv) {
   }\r
 \r
   /* Work out directory name */\r
-  size_t len = strlen(service->exe);\r
-  for (i = len; i && service->exe[i] != '\\' && service->exe[i] != '/'; i--);\r
-  memmove(service->dir, service->exe, i);\r
-  service->dir[i] = '\0';\r
+  memmove(service->dir, service->exe, sizeof(service->dir));\r
+  strip_basename(service->dir);\r
 \r
   int ret = install_service(service);\r
   cleanup_nssm_service(service);\r