Try to build PDB files even for releases.
[nssm.git] / nssm.cpp
index d70c6b4..9c51c53 100644 (file)
--- a/nssm.cpp
+++ b/nssm.cpp
@@ -32,6 +32,21 @@ int str_number(const TCHAR *string, unsigned long *number, TCHAR **bogus) {
   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
@@ -158,8 +173,8 @@ void strip_basename(TCHAR *buffer) {
 \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
@@ -208,7 +223,7 @@ static int elevate(int argc, TCHAR **argv, unsigned long message) {
 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
@@ -245,7 +260,12 @@ int _tmain(int argc, TCHAR **argv) {
     /*\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
@@ -256,6 +276,7 @@ int _tmain(int argc, TCHAR **argv) {
     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