8000
Skip to content

Latest commit

 

History

History
1367 lines (1175 loc) · 57.4 KB

File metadata and controls

1367 lines (1175 loc) · 57.4 KB
/* Override stdout and/or stderr. */
if (SendDlgItemMessage(tablist[NSSM_TAB_ROTATION], IDC_TRUNCATE, BM_GETCHECK, 0, 0) & BST_CHECKED) {
if (service->stdout_path[0]) service->stdout_disposition = CREATE_ALWAYS;
if (service->stderr_path[0]) service->stderr_disposition = CREATE_ALWAYS;
}
/* Get rotation stuff. */
if (SendDlgItemMessage(tablist[NSSM_TAB_ROTATION], IDC_ROTATE, BM_GETCHECK, 0, 0) & BST_CHECKED) {
service->rotate_files = true;
if (SendDlgItemMessage(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_ONLINE, BM_GETCHECK, 0, 0) & BST_CHECKED) service->rotate_stdout_online = service->rotate_stderr_online = NSSM_ROTATE_ONLINE;
check_number(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_SECONDS, &service->rotate_seconds);
check_number(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_BYTES_LOW, &service->rotate_bytes_low);
}
/* Get hook stuff. */
if (SendDlgItemMessage(tablist[NSSM_TAB_HOOKS], IDC_REDIRECT_HOOK, BM_GETCHECK, 0, 0) & BST_CHECKED) service->hook_share_output_handles = true;
/* Get environment. */
unsigned long envlen = (unsigned long) SendMessage(GetDlgItem(tablist[NSSM_TAB_ENVIRONMENT], IDC_ENVIRONMENT), WM_GETTEXTLENGTH, 0, 0);
if (envlen) {
TCHAR *env = (TCHAR *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (envlen + 2) * sizeof(TCHAR));
if (! env) {
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("install()"));
cleanup_nssm_service(service);
return 5;
}
if (! GetDlgItemText(tablist[NSSM_TAB_ENVIRONMENT], IDC_ENVIRONMENT, env, envlen + 1)) {
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_ENVIRONMENT);
HeapFree(GetProcessHeap(), 0, env);
cleanup_nssm_service(service);
return 5;
}
TCHAR *newenv;
unsigned long newlen;
if (unformat_double_null(env, envlen, &newenv, &newlen)) {
HeapFree(GetProcessHeap(), 0, env);
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("environment"), _T("install()"));
cleanup_nssm_service(service);
return 5;
}
HeapFree(GetProcessHeap(), 0, env);
env = newenv;
envlen = newlen;
/* Test the environment is valid. */
if (test_environment(env)) {
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_ENVIRONMENT);
HeapFree(GetProcessHeap(), 0, env);
cleanup_nssm_service(service);
return 5;
}
if (SendDlgItemMessage(tablist[NSSM_TAB_ENVIRONMENT], IDC_ENVIRONMENT_REPLACE, BM_GETCHECK, 0, 0) & BST_CHECKED) {
service->env = env;
service->envlen = envlen;
}
else {
service->env_extra = env;
service->env_extralen = envlen;
}
}
return 0;
}
/* Install the service. */
int install(HWND window) {
if (! window) return 1;
nssm_service_t *service = alloc_nssm_service();
if (service) {
int ret = configure(window, service, 0);
if (ret) return ret;
}
/* See if it works. */
switch (install_service(service)) {
case 1:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("service"), _T("install()"));
cleanup_nssm_service(service);
return 1;
case 2:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_OPEN_SERVICE_MANAGER_FAILED);
cleanup_nssm_service(service);
return 2;
case 3:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_PATH_TOO_LONG, NSSM);
cleanup_nssm_service(service);
return 3;
case 4:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_OUT_OF_MEMORY_FOR_IMAGEPATH);
cleanup_nssm_service(service);
return 4;
case 5:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INSTALL_SERVICE_FAILED);
cleanup_nssm_service(service);
return 5;
case 6:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_CREATE_PARAMETERS_FAILED);
cleanup_nssm_service(service);
return 6;
}
update_hooks(service->name);
popup_message(window, MB_OK, NSSM_MESSAGE_SERVICE_INSTALLED, service->name);
cleanup_nssm_service(service);
return 0;
}
/* Remove the service */
int remove(HWND window) {
if (! window) return 1;
/* See if it works */
nssm_service_t *service = alloc_nssm_service();
if (service) {
/* Get service name */
if (! GetDlgItemText(window, IDC_NAME, service->name, _countof(service->name))) {
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME);
cleanup_nssm_service(service);
return 2;
}
/* Confirm */
if (popup_message(window, MB_YESNO, NSSM_GUI_ASK_REMOVE_SERVICE, service->name) != IDYES) {
cleanup_nssm_service(service);
return 0;
}
}
switch (remove_service(service)) {
case 1:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("service"), _T("remove()"));
cleanup_nssm_service(service);
return 1;
case 2:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_OPEN_SERVICE_MANAGER_FAILED);
cleanup_nssm_service(service);
return 2;
case 3:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_SERVICE_NOT_INSTALLED);
cleanup_nssm_service(service);
return 3;
case 4:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_REMOVE_SERVICE_FAILED);
cleanup_nssm_service(service);
return 4;
}
popup_message(window, MB_OK, NSSM_MESSAGE_SERVICE_REMOVED, service->name);
cleanup_nssm_service(service);
return 0;
}
int edit(HWND window, nssm_service_t *orig_service) {
if (! window) return 1;
nssm_service_t *service = alloc_nssm_service();
if (service) {
int ret = configure(window, service, orig_service);
if (ret) return ret;
}
switch (edit_service(service, true)) {
case 1:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, _T("service"), _T("edit()"));
cleanup_nssm_service(service);
return 1;
case 3:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_PATH_TOO_LONG, NSSM);
cleanup_nssm_service(service);
return 3;
case 4:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_OUT_OF_MEMORY_FOR_IMAGEPATH);
cleanup_nssm_service(service);
return 4;
case 5:
case 6:
popup_message(window, MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_EDIT_PARAMETERS_FAILED);
cleanup_nssm_service(service);
return 6;
}
update_hooks(service->name);
popup_message(window, MB_OK, NSSM_MESSAGE_SERVICE_EDITED, service->name);
cleanup_nssm_service(service);
return 0;
}
static TCHAR *browse_filter(int message) {
switch (message) {
case NSSM_GUI_BROWSE_FILTER_APPLICATIONS: return _T("*.exe;*.bat;*.cmd");
case NSSM_GUI_BROWSE_FILTER_DIRECTORIES: return _T(".");
case NSSM_GUI_BROWSE_FILTER_ALL_FILES: /* Fall through. */
default: return _T("*.*");
}
}
UINT_PTR CALLBACK browse_hook(HWND dlg, UINT message, WPARAM w, LPARAM l) {
switch (message) {
case WM_INITDIALOG:
return 1;
}
return 0;
}
/* Browse for application */
void browse(HWND window, TCHAR *current, unsigned long flags, ...) {
if (! window) return;
va_list arg;
size_t bufsize = 256;
size_t len = bufsize;
int i;
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFilter = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, bufsize * sizeof(TCHAR));
/* XXX: Escaping nulls with FormatMessage is tricky */
if (ofn.lpstrFilter) {
ZeroMemory((void *) ofn.lpstrFilter, bufsize);
len = 0;
/* "Applications" + NULL + "*.exe" + NULL */
va_start(arg, flags);
while (i = va_arg(arg, int)) {
TCHAR *localised = message_string(i);
_sntprintf_s((TCHAR *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, localised);
len += _tcslen(localised) + 1;
LocalFree(localised);
TCHAR *filter = browse_filter(i);
_sntprintf_s((TCHAR *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, _T("%s"), filter);
len += _tcslen(filter) + 1;
}
va_end(arg);
/* Remainder of the buffer is already zeroed */
}
ofn.lpstrFile = (TCHAR *) HeapAlloc(GetProcessHeap(), 0, PATH_LENGTH * sizeof(TCHAR));
if (ofn.lpstrFile) {
if (flags & OFN_NOVALIDATE) {
/* Directory hack. */
_sntprintf_s(ofn.lpstrFile, PATH_LENGTH, _TRUNCATE, _T(":%s:"), message_string(NSSM_GUI_BROWSE_FILTER_DIRECTORIES));
ofn.nMaxFile = DIR_LENGTH;
}
else {
_sntprintf_s(ofn.lpstrFile, PATH_LENGTH, _TRUNCATE, _T("%s"), current);
ofn.nMaxFile = PATH_LENGTH;
}
}
ofn.lpstrTitle = message_string(NSSM_GUI_BROWSE_TITLE);
ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | flags;
if (GetOpenFileName(&ofn)) {
/* Directory hack. */
if (flags & OFN_NOVALIDATE) strip_basename(ofn.lpstrFile);
SendMessage(window, WM_SETTEXT, 0, (LPARAM) ofn.lpstrFile);
}
if (ofn.lpstrFilter) HeapFree(GetProcessHeap(), 0, (void *) ofn.lpstrFilter);
if (ofn.lpstrFile) HeapFree(GetProcessHeap(), 0, ofn.lpstrFile);
}
INT_PTR CALLBACK tab_dlg(HWND tab, UINT message, WPARAM w, LPARAM l) {
switch (message) {
case WM_INITDIALOG:
return 1;
/* Button was pressed or control was controlled. */
case WM_COMMAND:
HWND dlg;
TCHAR buffer[PATH_LENGTH];
unsigned char enabled;
switch (LOWORD(w)) {
/* Browse for application. */
case IDC_BROWSE:
dlg = GetDlgItem(tab, IDC_PATH);
GetDlgItemText(tab, IDC_PATH, buffer, _countof(buffer));
browse(dlg, buffer, OFN_FILEMUSTEXIST, NSSM_GUI_BROWSE_FILTER_APPLICATIONS, NSSM_GUI_BROWSE_FILTER_ALL_FILES, 0);
/* Fill in startup directory if it wasn't already specified. */
GetDlgItemText(tab, IDC_DIR, buffer, _countof(buffer));
if (! buffer[0]) {
GetDlgItemText(tab, IDC_PATH, buffer, _countof(buffer));
strip_basename(buffer);
SetDlgItemText(tab, IDC_DIR, buffer);
}
break;
/* Browse for startup directory. */
case IDC_BROWSE_DIR:
dlg = GetDlgItem(tab, IDC_DIR);
GetDlgItemText(tab, IDC_DIR, buffer, _countof(buffer));
browse(dlg, buffer, OFN_NOVALIDATE, NSSM_GUI_BROWSE_FILTER_DIRECTORIES, 0);
break;
/* Log on. */
case IDC_LOCALSYSTEM:
set_logon_enabled(1, 0);
break;
case IDC_VIRTUAL_SERVICE:
set_logon_enabled(0, 0);
0