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