From 7bc41a82f696699aface2103f277e7ebf1808b2f Mon Sep 17 00:00:00 2001 From: Iain Patterson Date: Thu, 28 Jul 2016 15:53:52 +0100 Subject: [PATCH] Let the dump command copy a service. If an optional second argument is given to dump, the name of the service in the output will be set to the argument's value. In any case, an "install" line will be written, replacing the Application dump line. Thus a service can be copied by running: nssm dump | %COMSPEC% /k --- README.txt | 8 ++++++++ service.cpp | 18 ++++++++++++++++-- settings.cpp | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/README.txt b/README.txt index d771faa..f8906d3 100644 --- a/README.txt +++ b/README.txt @@ -882,6 +882,14 @@ quoted or escaped from the command prompt, NSSM tries hard to produce output which will work correctly when run as a script, by adding quotes and caret escapes as appropriate. +To facilitate copying a service, the dump command accepts a second +argument which specifies the name of the service to be used in the output. + + nssm dump + +Lines in the dump will reference the service while showing the +configuration of . + Example usage ------------- diff --git a/service.cpp b/service.cpp index 8561616..f18626c 100644 --- a/service.cpp +++ b/service.cpp @@ -906,7 +906,11 @@ int pre_edit_service(int argc, TCHAR **argv) { mandatory = 3; mode = MODE_RESETTING; } - else if (str_equiv(verb, _T("dump"))) mode = MODE_DUMPING; + else if (str_equiv(verb, _T("dump"))) { + mandatory = 1; + remainder = 2; + mode = MODE_DUMPING; + } if (argc < mandatory) return usage(1); const TCHAR *parameter = 0; @@ -1056,17 +1060,27 @@ int pre_edit_service(int argc, TCHAR **argv) { int ret; if (mode == MODE_DUMPING) { + TCHAR *service_name = service->name; + if (argc > remainder) service_name = argv[remainder]; if (service->native) key = 0; else { key = open_registry(service->name, KEY_READ); if (! key) return 4; } + TCHAR quoted_service_name[SERVICE_NAME_LENGTH * 2]; + TCHAR quoted_exe[EXE_LENGTH * 2]; + TCHAR quoted_nssm[EXE_LENGTH * 2]; + if (quote(service_name, quoted_service_name, _countof(quoted_service_name))) return 5; + if (quote(service->exe, quoted_exe, _countof(quoted_exe))) return 6; + if (quote(nssm_exe(), quoted_nssm, _countof(quoted_nssm))) return 6; + _tprintf(_T("%s install %s %s\n"), quoted_nssm, quoted_service_name, quoted_exe); + ret = 0; for (i = 0; settings[i].name; i++) { setting = &settings[i]; if (! setting->native && service->native) continue; - if (dump_setting(service->name, key, service->handle, setting)) ret++; + if (dump_setting(service_name, key, service->handle, setting)) ret++; } if (! service->native) RegCloseKey(key); diff --git a/settings.cpp b/settings.cpp index f22a04d..f7346cb 100644 --- a/settings.cpp +++ b/settings.cpp @@ -1386,7 +1386,7 @@ int dump_setting(const TCHAR *service_name, HKEY key, SC_HANDLE service_handle, } settings_t settings[] = { - { NSSM_REG_EXE, REG_EXPAND_SZ, (void *) _T(""), false, 0, setting_set_string, setting_get_string, 0 }, + { NSSM_REG_EXE, REG_EXPAND_SZ, (void *) _T(""), false, 0, setting_set_string, setting_get_string, setting_not_dumpable }, { NSSM_REG_FLAGS, REG_EXPAND_SZ, (void *) _T(""), false, 0, setting_set_string, setting_get_string, 0 }, { NSSM_REG_DIR, REG_EXPAND_SZ, (void *) _T(""), false, 0, setting_set_string, setting_get_string, 0 }, { NSSM_REG_EXIT, REG_SZ, (void *) exit_action_strings[NSSM_EXIT_RESTART], false, ADDITIONAL_MANDATORY, setting_set_exit_action, setting_get_exit_action, setting_dump_exit_action }, -- 2.7.4