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 },