static TCHAR imageargv0[PATH_LENGTH];\r
\r
void nssm_exit(int status) {\r
+ free_imports();\r
unsetup_utf8();\r
exit(status);\r
}\r
return 0;\r
}\r
\r
+/* User requested us to print our version. */\r
+static bool is_version(const TCHAR *s) {\r
+ if (! s || ! *s) return false;\r
+ /* /version */\r
+ if (*s == '/') s++;\r
+ else if (*s == '-') {\r
+ /* -v, -V, -version, --version */\r
+ s++;\r
+ if (*s == '-') s++;\r
+ else if (str_equiv(s, _T("v"))) return true;\r
+ }\r
+ if (str_equiv(s, _T("version"))) return true;\r
+ return false;\r
+}\r
+\r
int str_number(const TCHAR *string, unsigned long *number) {\r
TCHAR *bogus;\r
return str_number(string, number, &bogus);\r
\r
/* How to use me correctly */\r
int usage(int ret) {\r
- if (GetConsoleWindow()) print_message(stderr, NSSM_MESSAGE_USAGE, NSSM_VERSION, NSSM_CONFIGURATION, NSSM_DATE);\r
- else popup_message(0, MB_OK, NSSM_MESSAGE_USAGE, NSSM_VERSION, NSSM_CONFIGURATION, NSSM_DATE);\r
+ if ((! GetConsoleWindow() || ! GetStdHandle(STD_OUTPUT_HANDLE)) && GetProcessWindowStation()) popup_message(0, MB_OK, NSSM_MESSAGE_USAGE, NSSM_VERSION, NSSM_CONFIGURATION, NSSM_DATE);\r
+ else print_message(stderr, NSSM_MESSAGE_USAGE, NSSM_VERSION, NSSM_CONFIGURATION, NSSM_DATE);\r
return(ret);\r
}\r
\r
int num_cpus() {\r
DWORD_PTR i, affinity, system_affinity;\r
if (! GetProcessAffinityMask(GetCurrentProcess(), &affinity, &system_affinity)) return 64;\r
- for (i = 0; system_affinity & (1LL << i); i++);\r
+ for (i = 0; system_affinity & (1LL << i); i++) if (i == 64) break;\r
return (int) i;\r
}\r
\r
/*\r
Valid commands are:\r
start, stop, pause, continue, install, edit, get, set, reset, unset, remove\r
+ status, statuscode, rotate, list, processes, version\r
*/\r
+ if (is_version(argv[1])) {\r
+ _tprintf(_T("%s %s %s %s\n"), NSSM, NSSM_VERSION, NSSM_CONFIGURATION, NSSM_DATE);\r
+ nssm_exit(0);\r
+ }\r
if (str_equiv(argv[1], _T("start"))) nssm_exit(control_service(NSSM_SERVICE_CONTROL_START, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("stop"))) nssm_exit(control_service(SERVICE_CONTROL_STOP, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("restart"))) {\r
if (str_equiv(argv[1], _T("pause"))) nssm_exit(control_service(SERVICE_CONTROL_PAUSE, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("continue"))) nssm_exit(control_service(SERVICE_CONTROL_CONTINUE, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("status"))) nssm_exit(control_service(SERVICE_CONTROL_INTERROGATE, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("statuscode"))) nssm_exit(control_service(SERVICE_CONTROL_INTERROGATE, argc - 2, argv + 2, true));\r
if (str_equiv(argv[1], _T("rotate"))) nssm_exit(control_service(NSSM_SERVICE_CONTROL_ROTATE, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("install"))) {\r
if (! is_admin) nssm_exit(elevate(argc, argv, NSSM_MESSAGE_NOT_ADMINISTRATOR_CANNOT_INSTALL));\r
/* User probably ran nssm with no argument */\r
if (error == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) nssm_exit(usage(1));\r
log_event(EVENTLOG_ERROR_TYPE, NSSM_EVENT_DISPATCHER_FAILED, error_string(error), 0);\r
- free_imports();\r
nssm_exit(100);\r
}\r
}\r