X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=service.cpp;h=8c4297271334ad8c1085b5a1802c2e50ebcc2e37;hb=b465216f3ec97443952f64ba5d068354c1296d3c;hp=ccc8e8968404b1e8a9bac0c924fa1bbf27175711;hpb=37215c1032c46095fe52808ef7c6efa98abf4159;p=nssm.git diff --git a/service.cpp b/service.cpp index ccc8e89..8c42972 100644 --- a/service.cpp +++ b/service.cpp @@ -225,7 +225,7 @@ unsigned long WINAPI service_control_handler(unsigned long control, unsigned lon switch (control) { case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: - stop_service(0, true); + stop_service(0, true, true); return NO_ERROR; } @@ -250,11 +250,11 @@ 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); - return stop_service(2, true); + return stop_service(2, true, true); } if (! CreateProcess(0, cmd, 0, 0, 0, 0, 0, dir, &si, &pi)) { log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_CREATEPROCESS_FAILED, service_name, exe, GetLastError(), 0); - return stop_service(3, true); + return stop_service(3, true, true); } pid = pi.hProcess; @@ -266,7 +266,12 @@ int start_service() { } /* Stop the service */ -int stop_service(unsigned long exitcode, bool graceful) { +int stop_service(unsigned long exitcode, bool graceful, bool default_action) { + if (default_action && ! exitcode && ! graceful) { + log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_GRACEFUL_SUICIDE, service_name, exe, exit_action_strings[NSSM_EXIT_UNCLEAN], exit_action_strings[NSSM_EXIT_UNCLEAN], exit_action_strings[NSSM_EXIT_UNCLEAN], exit_action_strings[NSSM_EXIT_REALLY] ,0); + graceful = true; + } + /* Signal we are stopping */ if (graceful) { service_status.dwCurrentState = SERVICE_STOP_PENDING; @@ -312,7 +317,8 @@ void CALLBACK end_service(void *arg, unsigned char why) { /* What action should we take? */ int action = NSSM_EXIT_RESTART; unsigned char action_string[ACTION_LEN]; - if (! get_exit_action(service_name, &ret, action_string)) { + bool default_action; + if (! get_exit_action(service_name, &ret, action_string, &default_action)) { for (int i = 0; exit_action_strings[i]; i++) { if (! _strnicmp((const char *) action_string, exit_action_strings[i], ACTION_LEN)) { action = i; @@ -341,13 +347,13 @@ void CALLBACK end_service(void *arg, unsigned char why) { /* Tell the service manager we are finished */ case NSSM_EXIT_REALLY: log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_EXIT_REALLY, service_name, code, exit_action_strings[action], 0); - stop_service(ret, true); + stop_service(ret, true, default_action); break; /* Fake a crash so pre-Vista service managers will run recovery actions. */ case NSSM_EXIT_UNCLEAN: log_event(EVENTLOG_INFORMATION_TYPE, NSSM_EVENT_EXIT_UNCLEAN, service_name, code, exit_action_strings[action], 0); - exit(stop_service(ret, false)); + exit(stop_service(ret, false, default_action)); break; } }