Redirect hooks' output.
[nssm.git] / hook.cpp
index 01e3a50..dc9e02f 100644 (file)
--- a/hook.cpp
+++ b/hook.cpp
@@ -344,12 +344,15 @@ int nssm_hook(hook_thread_t *hook_threads, nssm_service_t *service, TCHAR *hook_
   si.cb = sizeof(si);\r
   PROCESS_INFORMATION pi;\r
   ZeroMemory(&pi, sizeof(pi));\r
+  if (service->hook_share_output_handles) (void) use_output_handles(service, &si);\r
+  bool inherit_handles = false;\r
+  if (si.dwFlags & STARTF_USESTDHANDLES) inherit_handles = true;\r
   unsigned long flags = 0;\r
 #ifdef UNICODE\r
   flags |= CREATE_UNICODE_ENVIRONMENT;\r
 #endif\r
   ret = NSSM_HOOK_STATUS_NOTRUN;\r
-  if (CreateProcess(0, cmd, 0, 0, false, flags, 0, service->dir, &si, &pi)) {\r
+  if (CreateProcess(0, cmd, 0, 0, inherit_handles, flags, 0, service->dir, &si, &pi)) {\r
     hook->name = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, HOOK_NAME_LENGTH * sizeof(TCHAR));\r
     if (hook->name) _sntprintf_s(hook->name, HOOK_NAME_LENGTH, _TRUNCATE, _T("%s (%s/%s)"), service->name, hook_event, hook_action);\r
     hook->process_handle = pi.hProcess;\r
@@ -383,6 +386,7 @@ int nssm_hook(hook_thread_t *hook_threads, nssm_service_t *service, TCHAR *hook_
   else {\r
     log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_HOOK_CREATEPROCESS_FAILED, hook_event, hook_action, service->name, cmd, error_string(GetLastError()), 0);\r
     HeapFree(GetProcessHeap(), 0, hook);\r
+    close_output_handles(&si);\r
   }\r
 \r
   /* Restore our environment. */\r