#include "nssm.h"\r
\r
+static void strip_basename(char *buffer) {\r
+ size_t len = strlen(buffer);\r
+ size_t i;\r
+ for (i = len; i && buffer[i] != '\\' && buffer[i] != '/'; i--);\r
+ /* X:\ is OK. */\r
+ if (i && buffer[i-1] == ':') i++;\r
+ buffer[i] = '\0';\r
+}\r
+\r
int nssm_gui(int resource, char *name) {\r
/* Create window */\r
HWND dlg = CreateDialog(0, MAKEINTRESOURCE(resource), 0, install_dlg);\r
/* Go! */\r
MSG message;\r
while (GetMessage(&message, 0, 0, 0)) {\r
+ if (IsDialogMessage(dlg, &message)) continue;\r
TranslateMessage(&message);\r
DispatchMessage(&message);\r
}\r
int install(HWND window) {\r
if (! window) return 1;\r
\r
- /* Check parameters in the window */\r
- char name[VALUE_LENGTH];\r
- char exe[EXE_LENGTH];\r
- char flags[VALUE_LENGTH];\r
+ nssm_service_t *service = alloc_nssm_service();\r
+ if (service) {\r
+ /* Get service name. */\r
+ if (! GetDlgItemText(window, IDC_NAME, service->name, sizeof(service->name))) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME);\r
+ cleanup_nssm_service(service);\r
+ return 2;\r
+ }\r
\r
- /* Get service name */\r
- if (! GetDlgItemText(window, IDC_NAME, name, sizeof(name))) {\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME);\r
- return 2;\r
- }\r
+ /* Get executable name */\r
+ if (! GetDlgItemText(window, IDC_PATH, service->exe, sizeof(service->exe))) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PATH);\r
+ return 3;\r
+ }\r
+ \r
+ /* Get flags */\r
+ if (SendMessage(GetDlgItem(window, IDC_FLAGS), WM_GETTEXTLENGTH, 0, 0)) {\r
+ if (! GetDlgItemText(window, IDC_FLAGS, service->flags, sizeof(service->flags))) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_OPTIONS);\r
+ return 4;\r
+ }
+ }\r
\r
- /* Get executable name */\r
- if (! GetDlgItemText(window, IDC_PATH, exe, sizeof(exe))) {\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_PATH);\r
- return 3;\r
+ memmove(service->dir, service->exe, strlen(service->exe));\r
+ strip_basename(service->dir);\r
}\r
\r
- /* Get flags */\r
- if (SendMessage(GetDlgItem(window, IDC_FLAGS), WM_GETTEXTLENGTH, 0, 0)) {\r
- if (! GetDlgItemText(window, IDC_FLAGS, flags, sizeof(flags))) {\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INVALID_OPTIONS);\r
- return 4;\r
- }\r
- }\r
- else ZeroMemory(&flags, sizeof(flags));\r
+ /* See if it works. */\r
+ switch (install_service(service)) {\r
+ case 1:\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, "service", "install()");\r
+ cleanup_nssm_service(service);\r
+ return 1;\r
\r
- /* See if it works */\r
- switch (install_service(name, exe, flags)) {\r
case 2:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_OPEN_SERVICE_MANAGER_FAILED);\r
+ cleanup_nssm_service(service);\r
return 2;\r
\r
case 3:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_PATH_TOO_LONG, NSSM);\r
+ cleanup_nssm_service(service);\r
return 3;\r
\r
case 4:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_OUT_OF_MEMORY_FOR_IMAGEPATH);\r
+ cleanup_nssm_service(service);\r
return 4;\r
\r
case 5:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_INSTALL_SERVICE_FAILED);\r
+ cleanup_nssm_service(service);\r
return 5;\r
\r
case 6:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_CREATE_PARAMETERS_FAILED);\r
+ cleanup_nssm_service(service);\r
return 6;\r
}\r
\r
- popup_message(MB_OK, NSSM_MESSAGE_SERVICE_INSTALLED, name);\r
+ popup_message(MB_OK, NSSM_MESSAGE_SERVICE_INSTALLED, service->name);\r
+ cleanup_nssm_service(service);\r
return 0;\r
}\r
\r
int remove(HWND window) {\r
if (! window) return 1;\r
\r
- /* Check parameters in the window */\r
- char name[VALUE_LENGTH];\r
+ /* See if it works */\r
+ nssm_service_t *service = alloc_nssm_service();\r
+ if (service) {\r
+ /* Get service name */\r
+ if (! GetDlgItemText(window, IDC_NAME, service->name, sizeof(service->name))) {\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME);\r
+ cleanup_nssm_service(service);\r
+ return 2;\r
+ }\r
\r
- /* Get service name */\r
- if (! GetDlgItemText(window, IDC_NAME, name, sizeof(name))) {\r
- popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_MISSING_SERVICE_NAME);\r
- return 2;\r
+ /* Confirm */\r
+ if (popup_message(MB_YESNO, NSSM_GUI_ASK_REMOVE_SERVICE, service->name) != IDYES) {\r
+ cleanup_nssm_service(service);\r
+ return 0;\r
+ }\r
}\r
\r
- /* Confirm */\r
- if (popup_message(MB_YESNO, NSSM_GUI_ASK_REMOVE_SERVICE, name) != IDYES) return 0;\r
+ switch (remove_service(service)) {\r
+ case 1:\r
+ popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_EVENT_OUT_OF_MEMORY, "service", "remove()");\r
+ cleanup_nssm_service(service);\r
+ return 1;\r
\r
- /* See if it works */\r
- switch (remove_service(name)) {\r
case 2:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_MESSAGE_OPEN_SERVICE_MANAGER_FAILED);\r
+ cleanup_nssm_service(service);\r
return 2;\r
\r
case 3:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_SERVICE_NOT_INSTALLED);\r
return 3;\r
+ cleanup_nssm_service(service);\r
\r
case 4:\r
popup_message(MB_OK | MB_ICONEXCLAMATION, NSSM_GUI_REMOVE_SERVICE_FAILED);\r
+ cleanup_nssm_service(service);\r
return 4;\r
}\r
\r
- popup_message(MB_OK, NSSM_MESSAGE_SERVICE_REMOVED, name);\r
+ popup_message(MB_OK, NSSM_MESSAGE_SERVICE_REMOVED, service->name);\r
+ cleanup_nssm_service(service);\r
return 0;\r
}\r
\r
void browse(HWND window) {\r
if (! window) return;\r
\r
- unsigned long bufsize = 256;\r
- unsigned long len = bufsize;\r
+ size_t bufsize = 256;\r
+ size_t len = bufsize;\r
OPENFILENAME ofn;\r
ZeroMemory(&ofn, sizeof(ofn));\r
ofn.lStructSize = sizeof(ofn);\r
if (ofn.lpstrFilter) {\r
ZeroMemory((void *) ofn.lpstrFilter, bufsize);\r
char *localised = message_string(NSSM_GUI_BROWSE_FILTER_APPLICATIONS);\r
- _snprintf((char *) ofn.lpstrFilter, bufsize, localised);\r
+ _snprintf_s((char *) ofn.lpstrFilter, bufsize, _TRUNCATE, localised);\r
/* "Applications" + NULL + "*.exe" + NULL */\r
len = strlen(localised) + 1;\r
LocalFree(localised);\r
- _snprintf((char *) ofn.lpstrFilter + len, bufsize - len, "*.exe");\r
+ _snprintf_s((char *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, "*.exe");\r
/* "All files" + NULL + "*.*" + NULL */\r
len += 6;\r
localised = message_string(NSSM_GUI_BROWSE_FILTER_ALL_FILES);\r
- _snprintf((char *) ofn.lpstrFilter + len, bufsize - len, localised);\r
+ _snprintf_s((char *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, localised);\r
len += strlen(localised) + 1;\r
LocalFree(localised);\r
- _snprintf((char *) ofn.lpstrFilter + len, bufsize - len, "*.*");\r
+ _snprintf_s((char *) ofn.lpstrFilter + len, bufsize - len, _TRUNCATE, "*.*");\r
/* Remainder of the buffer is already zeroed */\r
}\r
ofn.lpstrFile = new char[MAX_PATH];\r
switch (LOWORD(w)) {\r
/* OK button */\r
case IDC_OK:\r
- PostQuitMessage(install(window));\r
+ if (! install(window)) PostQuitMessage(0);\r
break;\r
\r
/* Cancel button */\r
- case IDC_CANCEL:\r
+ case IDCANCEL:\r
DestroyWindow(window);\r
break;\r
\r
\r
/* Remove button */\r
case IDC_REMOVE:\r
- PostQuitMessage(remove(window));\r
+ if (! remove(window)) PostQuitMessage(0);\r
break;\r
}\r
return 1;\r