You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2019/05/22 21:44:24 UTC
[commons-daemon] 01/02: Fix DAEMON-396 problem 1
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-daemon.git
commit 39edeec2590966d9ace3ec9788eb555c32f4347f
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed May 22 22:26:56 2019 +0100
Fix DAEMON-396 problem 1
Based on fix for DAEMON-401.
---
src/changes/changes.xml | 5 +++++
src/native/windows/apps/prunsrv/prunsrv.c | 2 --
src/native/windows/include/apxwin.h | 2 ++
src/native/windows/src/utils.c | 12 ++++++++++++
4 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 24bed12..456926a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -79,6 +79,11 @@
Procrun. Ensure that JAVA_HOME/bin is on the path when running in jvm
mode so that additional DLLs, such as awt.dll, can be found if required.
</action>
+ <action issue="DAEMON-396" type="fix" dev="markt">
+ Procrun. Ensure that the java.library.path environment variable is
+ correctly configured when running on a JRE that depends on the Universal
+ CRT.
+ </action>
<action type="add" dev="markt">
Procrun. Log the error code returned if JVM creation fails to aid
debugging.
diff --git a/src/native/windows/apps/prunsrv/prunsrv.c b/src/native/windows/apps/prunsrv/prunsrv.c
index b125850..dab90e5 100644
--- a/src/native/windows/apps/prunsrv/prunsrv.c
+++ b/src/native/windows/apps/prunsrv/prunsrv.c
@@ -58,8 +58,6 @@ typedef struct APX_STDWRAP {
FILE *fpStdErrFile;
} APX_STDWRAP;
-typedef int (__stdcall *WPUTENV) (const wchar_t *env);
-
/* Use static variables instead of #defines */
static LPCWSTR PRSRV_AUTO = L"auto";
static LPCWSTR PRSRV_JAVA = L"java";
diff --git a/src/native/windows/include/apxwin.h b/src/native/windows/include/apxwin.h
index ca7552a..f291aa4 100644
--- a/src/native/windows/include/apxwin.h
+++ b/src/native/windows/include/apxwin.h
@@ -120,6 +120,8 @@ LPSTR MzWideToANSI(LPCWSTR ws);
typedef struct APXMULTISZ APXMULTISZ;
typedef APXMULTISZ* LPAPXMULTISZ;
+typedef int (__stdcall *WPUTENV) (const wchar_t *env);
+
DWORD apxMultiSzToArrayW(APXHANDLE hPool, LPCWSTR lpString, LPWSTR **lppArray);
LPWSTR apxMultiSzCombine(APXHANDLE hPool, LPCWSTR lpStrA, LPCWSTR lpStrB,
diff --git a/src/native/windows/src/utils.c b/src/native/windows/src/utils.c
index 2e0d2bf..1e1f3cd 100644
--- a/src/native/windows/src/utils.c
+++ b/src/native/windows/src/utils.c
@@ -60,6 +60,8 @@ BOOL apxAddToPathW(APXHANDLE hPool, LPCWSTR szAdd)
LPWSTR wsAdd;
DWORD rc;
DWORD al;
+ HMODULE hmodUcrt;
+ WPUTENV wputenv_ucrt;
rc = GetEnvironmentVariableW(L"PATH", NULL, 0);
if (rc == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND)
@@ -75,8 +77,18 @@ BOOL apxAddToPathW(APXHANDLE hPool, LPCWSTR szAdd)
apxFree(wsAdd);
return FALSE;
}
+
+ hmodUcrt = LoadLibraryExA("ucrtbase.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
+ if (hmodUcrt != NULL) {
+ wputenv_ucrt = (WPUTENV) GetProcAddress(hmodUcrt, "_wputenv");
+ }
+
SetEnvironmentVariableW(L"PATH", wsAdd + 5);
_wputenv(wsAdd);
+ if (wputenv_ucrt != NULL) {
+ wputenv_ucrt(wsAdd);
+ }
+
apxFree(wsAdd);
return TRUE;
}