Fixed argument parsing for setting ObjectName.
[nssm.git] / service.cpp
index e9fd109..91e726f 100644 (file)
@@ -791,6 +791,10 @@ int pre_edit_service(int argc, TCHAR **argv) {
       additional = argv[3];\r
       remainder = 4;\r
     }\r
+    else if (str_equiv(setting->name, NSSM_NATIVE_OBJECTNAME) && mode == MODE_SETTING) {\r
+      additional = argv[3];\r
+      remainder = 4;\r
+    }\r
     else {\r
       additional = argv[remainder];\r
       if (argc < mandatory) return usage(1);\r
@@ -933,6 +937,9 @@ int pre_edit_service(int argc, TCHAR **argv) {
     /* Unset the parameter. */\r
     value.string = 0;\r
   }\r
+  else if (remainder == argc) {\r
+    value.string = 0;\r
+  }\r
   else {\r
     /* Set the parameter. */\r
     size_t len = 0;\r
@@ -1517,7 +1524,6 @@ int start_service(nssm_service_t *service) {
   TCHAR cmd[CMD_LENGTH];\r
   if (_sntprintf_s(cmd, _countof(cmd), _TRUNCATE, _T("\"%s\" %s"), service->exe, service->flags) < 0) {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("command line"), _T("start_service"), 0);\r
-    close_output_handles(&si);\r
     return stop_service(service, 2, true, true);\r
   }\r
 \r
@@ -1527,6 +1533,14 @@ int start_service(nssm_service_t *service) {
   if (service->env) duplicate_environment(service->env);\r
   if (service->env_extra) set_environment_block(service->env_extra);\r
 \r
+  /* Set up I/O redirection. */\r
+  if (get_output_handles(service, &si)) {\r
+    log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_GET_OUTPUT_HANDLES_FAILED, service->name, 0);\r
+    if (! service->no_console) FreeConsole();\r
+    close_output_handles(&si);\r
+    return stop_service(service, 4, true, true);\r
+  }\r
+\r
   bool inherit_handles = false;\r
   if (si.dwFlags & STARTF_USESTDHANDLES) inherit_handles = true;\r
   unsigned long flags = service->priority & priority_mask();\r
@@ -1673,15 +1687,18 @@ void CALLBACK end_service(void *arg, unsigned char why) {
 \r
   service->rotate_stdout_online = service->rotate_stderr_online = NSSM_ROTATE_OFFLINE;\r
 \r
+  /* Use now as a dummy exit time. */\r
+  GetSystemTimeAsFileTime(&service->exit_time);\r
+\r
   /* Check exit code */\r
   unsigned long exitcode = 0;\r
   TCHAR code[16];\r
   if (service->process_handle) {\r
     GetExitCodeProcess(service->process_handle, &exitcode);\r
-    if (exitcode == STILL_ACTIVE || get_process_exit_time(service->process_handle, &service->exit_time)) GetSystemTimeAsFileTime(&service->exit_time);\r
+    /* Check real exit time. */\r
+    if (exitcode != STILL_ACTIVE) get_process_exit_time(service->process_handle, &service->exit_time);\r
     CloseHandle(service->process_handle);\r
   }\r
-  else GetSystemTimeAsFileTime(&service->exit_time);\r
 \r
   service->process_handle = 0;\r
 \r