X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;ds=sidebyside;f=registry.cpp;h=b526ee510e185fdaee20c90b2c82805d5939971e;hb=143238dfe314c16bc90a6807ab0f00220efd34a2;hp=c6189fea3b8d0206393d51e04ebcd374ad773a3f;hpb=53371f115d94fbbc7e5cb60853b9e4a5d356d4b0;p=nssm.git diff --git a/registry.cpp b/registry.cpp index c6189fe..b526ee5 100644 --- a/registry.cpp +++ b/registry.cpp @@ -69,6 +69,8 @@ int create_parameters(nssm_service_t *service, bool editing) { if (stop_method_skip) set_number(key, NSSM_REG_STOP_METHOD_SKIP, stop_method_skip); else if (editing) RegDeleteValue(key, NSSM_REG_STOP_METHOD_SKIP); if (service->default_exit_action < NSSM_NUM_EXIT_ACTIONS) create_exit_action(service->name, exit_action_strings[service->default_exit_action], editing); + if (service->restart_delay) set_number(key, NSSM_REG_RESTART_DELAY, service->restart_delay); + else if (editing) RegDeleteValue(key, NSSM_REG_RESTART_DELAY); if (service->throttle_delay != NSSM_RESET_THROTTLE_RESTART) set_number(key, NSSM_REG_THROTTLE, service->throttle_delay); else if (editing) RegDeleteValue(key, NSSM_REG_THROTTLE); if (service->kill_console_delay != NSSM_KILL_CONSOLE_GRACE_PERIOD) set_number(key, NSSM_REG_KILL_CONSOLE_GRACE_PERIOD, service->kill_console_delay); @@ -109,6 +111,8 @@ int create_parameters(nssm_service_t *service, bool editing) { } if (service->rotate_files) set_number(key, NSSM_REG_ROTATE, 1); else if (editing) RegDeleteValue(key, NSSM_REG_ROTATE); + if (service->rotate_stdout_online) set_number(key, NSSM_REG_ROTATE_ONLINE, 1); + else if (editing) RegDeleteValue(key, NSSM_REG_ROTATE_ONLINE); if (service->rotate_seconds) set_number(key, NSSM_REG_ROTATE_SECONDS, service->rotate_seconds); else if (editing) RegDeleteValue(key, NSSM_REG_ROTATE_SECONDS); if (service->rotate_bytes_low) set_number(key, NSSM_REG_ROTATE_BYTES_LOW, service->rotate_bytes_low); @@ -498,38 +502,63 @@ int get_parameters(nssm_service_t *service, STARTUPINFO *si) { if (si) { if (service->env_extra) { - /* Append these to any other environment variables set. */ + TCHAR *env; + unsigned long envlen; + + /* Copy our environment for the application. */ + if (! service->env) { + TCHAR *rawenv = GetEnvironmentStrings(); + env = rawenv; + if (env) { + /* + The environment block starts with variables of the form + =C:=C:\Windows\System32 which we ignore. + */ + while (*env == _T('=')) { + for ( ; *env; env++); + env++; + } + envlen = 0; + if (*env) { + while (true) { + for ( ; env[envlen]; envlen++); + if (! env[++envlen]) break; + } + envlen++; + + service->envlen = envlen * sizeof(TCHAR); + service->env = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, service->envlen); + memmove(service->env, env, service->envlen); + FreeEnvironmentStrings(rawenv); + } + } + } + + /* Append extra variables to configured variables. */ if (service->env) { - /* Append extra variables to configured variables. */ - unsigned long envlen = service->envlen + service->env_extralen - 1; - TCHAR *env = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, envlen); + envlen = service->envlen + service->env_extralen - sizeof(TCHAR)/*?*/; + env = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, envlen); if (env) { memmove(env, service->env, service->envlen - sizeof(TCHAR)); - /* envlen is in bytes. */ + /* envlen is in bytes but env[i] is in characters. */ memmove(env + (service->envlen / sizeof(TCHAR)) - 1, service->env_extra, service->env_extralen); HeapFree(GetProcessHeap(), 0, service->env); + HeapFree(GetProcessHeap(), 0, service->env_extra); service->env = env; service->envlen = envlen; } else log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("get_parameters()"), 0); } else { - /* Append extra variables to our environment. */ - TCHAR *env, *s; - size_t envlen, len; - - env = service->env_extra; - len = 0; - while (*env) { - envlen = _tcslen(env) + 1; - for (s = env; *s && *s != _T('='); s++); - if (*s == _T('=')) *s++ = _T('\0'); - if (! SetEnvironmentVariable(env, s)) log_event(EVENTLOG_WARNING_TYPE, NSSM_EVENT_SETENVIRONMENTVARIABLE_FAILED, env, s, error_string(GetLastError()), 0); - env += envlen; - } + /* Huh? No environment at all? */ + service->env = service->env_extra; + service->envlen = service->env_extralen; } } + + service->env_extra = 0; + service->env_extralen = 0; } /* Try to get priority - may fail. */ @@ -546,6 +575,11 @@ int get_parameters(nssm_service_t *service, STARTUPINFO *si) { else service->rotate_files = false; } else service->rotate_files = false; + if (get_number(key, NSSM_REG_ROTATE_ONLINE, &rotate_files, false) == 1) { + if (rotate_files) service->rotate_stdout_online = service->rotate_stderr_online = true; + else service->rotate_stdout_online = service->rotate_stderr_online = false; + } + else service->rotate_stdout_online = service->rotate_stderr_online = false; if (get_number(key, NSSM_REG_ROTATE_SECONDS, &service->rotate_seconds, false) != 1) service->rotate_seconds = 0; if (get_number(key, NSSM_REG_ROTATE_BYTES_LOW, &service->rotate_bytes_low, false) != 1) service->rotate_bytes_low = 0; if (get_number(key, NSSM_REG_ROTATE_BYTES_HIGH, &service->rotate_bytes_high, false) != 1) service->rotate_bytes_high = 0; @@ -566,6 +600,9 @@ int get_parameters(nssm_service_t *service, STARTUPINFO *si) { /* Change back in case the startup directory needs to be deleted. */ SetCurrentDirectory(cwd); + /* Try to get mandatory restart delay */ + override_milliseconds(service->name, key, NSSM_REG_RESTART_DELAY, &service->restart_delay, 0, NSSM_EVENT_BOGUS_RESTART_DELAY); + /* Try to get throttle restart delay */ override_milliseconds(service->name, key, NSSM_REG_THROTTLE, &service->throttle_delay, NSSM_RESET_THROTTLE_RESTART, NSSM_EVENT_BOGUS_THROTTLE);