X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=service.cpp;h=21726df7f90ad7b2b661791b6e5fa75796730487;hb=40792fac2ef98e69c331b9cd5a9279dc3e1eb730;hp=81e46efec92e2ca227466a5e58f7210e05adfe44;hpb=9884e231415258809dfb1ef117b6bc9a5b011514;p=nssm.git diff --git a/service.cpp b/service.cpp index 81e46ef..21726df 100644 --- a/service.cpp +++ b/service.cpp @@ -319,6 +319,10 @@ void log_service_control(char *service_name, unsigned long control, bool handled /* Service control handler */ unsigned long WINAPI service_control_handler(unsigned long control, unsigned long event, void *data, void *context) { switch (control) { + case SERVICE_CONTROL_INTERROGATE: + /* We always keep the service status up-to-date so this is a no-op. */ + return NO_ERROR; + case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: log_service_control(service_name, control, true); @@ -368,7 +372,7 @@ int start_service() { /* Get startup parameters */ char *env = 0; - int ret = get_parameters(service_name, exe, sizeof(exe), flags, sizeof(flags), dir, sizeof(dir), &env, &throttle_delay); + int ret = get_parameters(service_name, exe, sizeof(exe), flags, sizeof(flags), dir, sizeof(dir), &env, &throttle_delay, &si); if (ret) { log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_GET_PARAMETERS_FAILED, service_name, 0); return stop_service(2, true, true); @@ -378,15 +382,18 @@ int start_service() { char cmd[CMD_LENGTH]; if (_snprintf(cmd, sizeof(cmd), "\"%s\" %s", exe, flags) < 0) { log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, "command line", "start_service", 0); + close_output_handles(&si); return stop_service(2, true, true); } throttle_restart(); - if (! CreateProcess(0, cmd, 0, 0, false, 0, env, dir, &si, &pi)) { + bool inherit_handles = (si.dwFlags & STARTF_USESTDHANDLES); + if (! CreateProcess(0, cmd, 0, 0, inherit_handles, 0, env, dir, &si, &pi)) { unsigned long error = GetLastError(); if (error == ERROR_INVALID_PARAMETER && env) log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CREATEPROCESS_FAILED_INVALID_ENVIRONMENT, service_name, exe, NSSM_REG_ENV, 0); else log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CREATEPROCESS_FAILED, service_name, exe, error_string(error), 0); + close_output_handles(&si); return stop_service(3, true, true); } process_handle = pi.hProcess; @@ -394,6 +401,8 @@ int start_service() { if (get_process_creation_time(process_handle, &creation_time)) ZeroMemory(&creation_time, sizeof(creation_time)); + close_output_handles(&si); + /* Signal successful start */ service_status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(service_handle, &service_status);