Browse Source

Added test_environment().

New helper function to verify the environment by relaunching NSSM itself
with the candidate environment set.  Unless something goes horribly
wrong somewhere, CreateProcess() will succeed iff the environment is
valid.
Iain Patterson 8 years ago
parent
commit
135329c079
2 changed files with 37 additions and 0 deletions
  1. 36 0
      process.cpp
  2. 1 0
      process.h

+ 36 - 0
process.cpp

@@ -306,3 +306,39 @@ void kill_process_tree(nssm_service_t *service, unsigned long pid, unsigned long
 
   CloseHandle(process_handle);
 }
+
+/*
+  Verify an environment block.
+  Returns:  1 if environment is invalid.
+            0 if environment is OK.
+           -1 on error.
+*/
+int test_environment(TCHAR *env) {
+  TCHAR path[MAX_PATH];
+  GetModuleFileName(0, path, _countof(path));
+  STARTUPINFO si;
+  ZeroMemory(&si, sizeof(si));
+  si.cb = sizeof(si);
+  PROCESS_INFORMATION pi;
+  ZeroMemory(&pi, sizeof(pi));
+  unsigned long flags = CREATE_SUSPENDED;
+#ifdef UNICODE
+  flags |= CREATE_UNICODE_ENVIRONMENT;
+#endif
+
+  /*
+    Try to relaunch ourselves but with the candidate environment set.
+    Assuming no solar flare activity, the only reason this would fail is if
+    the environment were invalid.
+  */
+  if (CreateProcess(0, path, 0, 0, 0, flags, env, 0, &si, &pi)) {
+    TerminateProcess(pi.hProcess, 0);
+  }
+  else {
+    unsigned long error = GetLastError();
+    if (error == ERROR_INVALID_PARAMETER) return 1;
+    else return -1;
+  }
+
+  return 0;
+}

+ 1 - 0
process.h

@@ -17,5 +17,6 @@ int kill_threads(nssm_service_t *, kill_t *);
 int kill_console(nssm_service_t *);
 int kill_process(nssm_service_t *, HANDLE, unsigned long, unsigned long);
 void kill_process_tree(nssm_service_t *, unsigned long, unsigned long, unsigned long);
+int test_environment(TCHAR *);
 
 #endif