}\r
\r
/* Convert a string to a number. */\r
-int str_number(const TCHAR *string, unsigned long *number) {\r
+int str_number(const TCHAR *string, unsigned long *number, TCHAR **bogus) {\r
if (! string) return 1;\r
\r
- TCHAR *bogus;\r
- *number = _tcstoul(string, &bogus, 0);\r
- if (*bogus) return 2;\r
+ *number = _tcstoul(string, bogus, 0);\r
+ if (**bogus) return 2;\r
\r
return 0;\r
}\r
\r
+int str_number(const TCHAR *string, unsigned long *number) {\r
+ TCHAR *bogus;\r
+ return str_number(string, number, &bogus);\r
+}\r
+\r
/* Remove basename of a path. */\r
void strip_basename(TCHAR *buffer) {\r
size_t len = _tcslen(buffer);\r
\r
/* How to use me correctly */\r
int usage(int ret) {\r
- if (GetConsoleWindow()) print_message(stderr, NSSM_MESSAGE_USAGE, NSSM_VERSION, NSSM_DATE);\r
- else popup_message(0, MB_OK, NSSM_MESSAGE_USAGE, NSSM_VERSION, NSSM_DATE);\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
return(ret);\r
}\r
\r
FreeSid(AdministratorsGroup);\r
}\r
\r
-/* See if we were launched from a console window. */\r
-static void check_console() {\r
- /* If we're running in a service context there will be no console window. */\r
- HWND console = GetConsoleWindow();\r
- if (! console) return;\r
-\r
- unsigned long pid;\r
- if (! GetWindowThreadProcessId(console, &pid)) return;\r
-\r
- /*\r
- If the process associated with the console window handle is the same as\r
- this process, we were not launched from an existing console. The user\r
- probably double-clicked our executable.\r
- */\r
- if (GetCurrentProcessId() != pid) return;\r
-\r
- /* We close our new console so that subsequent messages appear in a popup. */\r
- FreeConsole();\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
+ return (int) i;\r
}\r
\r
int _tmain(int argc, TCHAR **argv) {\r
check_console();\r
\r
+#ifdef UNICODE\r
+ /*\r
+ Ensure we write in UTF-16 mode, so that non-ASCII characters don't get\r
+ mangled. If we were compiled in ANSI mode it won't work.\r
+ */\r
+ _setmode(_fileno(stdout), _O_U16TEXT);\r
+ _setmode(_fileno(stderr), _O_U16TEXT);\r
+#endif\r
+\r
/* Remember if we are admin */\r
check_admin();\r
\r
Valid commands are:\r
start, stop, pause, continue, install, edit, get, set, reset, unset, remove\r
*/\r
- if (str_equiv(argv[1], _T("start"))) exit(control_service(0, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("start"))) exit(control_service(NSSM_SERVICE_CONTROL_START, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("stop"))) exit(control_service(SERVICE_CONTROL_STOP, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("restart"))) {\r
+ int ret = control_service(SERVICE_CONTROL_STOP, argc - 2, argv + 2);\r
+ if (ret) exit(ret);\r
+ exit(control_service(NSSM_SERVICE_CONTROL_START, argc - 2, argv + 2));\r
+ }\r
if (str_equiv(argv[1], _T("pause"))) exit(control_service(SERVICE_CONTROL_PAUSE, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("continue"))) exit(control_service(SERVICE_CONTROL_CONTINUE, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("status"))) exit(control_service(SERVICE_CONTROL_INTERROGATE, argc - 2, argv + 2));\r
+ if (str_equiv(argv[1], _T("rotate"))) exit(control_service(NSSM_SERVICE_CONTROL_ROTATE, argc - 2, argv + 2));\r
if (str_equiv(argv[1], _T("install"))) {\r
if (! is_admin) {\r
print_message(stderr, NSSM_MESSAGE_NOT_ADMINISTRATOR_CANNOT_INSTALL);\r
actually running as a service.\r
This will save time when running with no arguments from a command prompt.\r
*/\r
- if (_fileno(stdin) < 0) {\r
+ if (! GetStdHandle(STD_INPUT_HANDLE)) {\r
/* Set up function pointers. */\r
if (get_imports()) exit(111);\r
\r