From 47100cd870066d348a19f618a09dea9d3dae3ca1 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 28 Nov 2019 10:14:09 +0100 Subject: [PATCH] Support constant command line arguments and arguments in JNI mode --- head_src/consolehead/consolehead.c | 2 +- head_src/guihead/guihead.c | 2 +- head_src/head.c | 27 ++++++++++--------- head_src/head.h | 6 ++--- head_src/jniconsolehead_BETA/jniconsolehead.c | 2 +- head_src/jniguihead_BETA/jniguihead.c | 2 +- head_src/jnihead.c | 7 +++++ src/net/sf/launch4j/config/Config.java | 2 -- 8 files changed, 28 insertions(+), 22 deletions(-) diff --git a/head_src/consolehead/consolehead.c b/head_src/consolehead/consolehead.c index 1846a56..7520511 100644 --- a/head_src/consolehead/consolehead.c +++ b/head_src/consolehead/consolehead.c @@ -55,7 +55,7 @@ int main(int argc, char* argv[]) cmdLine = ""; } - int result = prepare(cmdLine); + int result = prepare(cmdLine, FALSE); if (result == ERROR_ALREADY_EXISTS) { diff --git a/head_src/guihead/guihead.c b/head_src/guihead/guihead.c index 6d165a2..6b91e71 100644 --- a/head_src/guihead/guihead.c +++ b/head_src/guihead/guihead.c @@ -49,7 +49,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow) { - int result = prepare(lpCmdLine); + int result = prepare(lpCmdLine, FALSE); if (result == ERROR_ALREADY_EXISTS) { diff --git a/head_src/head.c b/head_src/head.c index 4ec50cd..74fd233 100644 --- a/head_src/head.c +++ b/head_src/head.c @@ -1111,7 +1111,7 @@ void setEnvironmentVariables(const char *exePath, const int pathLen) } } -void setMainClassAndClassPath(const char *exePath, const int pathLen) +void setMainClassAndClassPath(const char *exePath, const int pathLen, BOOL jni) { char classPath[MAX_ARGS] = {0}; char expandedClassPath[MAX_ARGS] = {0}; @@ -1179,7 +1179,9 @@ void setMainClassAndClassPath(const char *exePath, const int pathLen) *(launcher.args + strlen(launcher.args) - 1) = 0; strcat(launcher.args, "\" "); - strcat(launcher.args, launcher.mainClass); + if (!jni) { + strcat(launcher.args, launcher.mainClass); + } } else if (wrapper) { @@ -1194,17 +1196,18 @@ void setMainClassAndClassPath(const char *exePath, const int pathLen) appendPath(launcher.args, jar); strcat(launcher.args, "\""); } + } -void setCommandLineArgs(const char *lpCmdLine) +void setCommandLineArgs(const char *lpCmdLine, BOOL jni) { + const char *target = jni? launcher.mainClass: launcher.args; char tmp[MAX_ARGS] = {0}; - // Constant command line arguments if (loadString(CMD_LINE, tmp)) { - strcat(launcher.args, " "); - strcat(launcher.args, tmp); + strcat(target, " "); + strcat(target, tmp); } // Command line arguments @@ -1226,13 +1229,13 @@ void setCommandLineArgs(const char *lpCmdLine) } if (*tmp) { - strcat(launcher.args, " "); - strcat(launcher.args, tmp); + strcat(target, " "); + strcat(target, tmp); } } } -int prepare(const char *lpCmdLine) +int prepare(const char *lpCmdLine, BOOL jni) { if (!initGlobals()) { @@ -1272,7 +1275,6 @@ int prepare(const char *lpCmdLine) } setWorkingDirectory(exePath, pathLen); - if (!jreSearch(exePath, pathLen)) { return FALSE; @@ -1282,7 +1284,6 @@ int prepare(const char *lpCmdLine) { return FALSE; } - setEnvironmentVariables(exePath, pathLen); processPriority = loadInt(PRIORITY_CLASS); appendLauncher(launcher.cmd); @@ -1291,8 +1292,8 @@ int prepare(const char *lpCmdLine) char jvmOptions[MAX_ARGS] = {0}; setJvmOptions(jvmOptions, exePath); expandVars(launcher.args, jvmOptions, exePath, pathLen); - setMainClassAndClassPath(exePath, pathLen); - setCommandLineArgs(lpCmdLine); + setMainClassAndClassPath(exePath, pathLen, jni); + setCommandLineArgs(lpCmdLine, jni); debug("Launcher:\t%s\n", launcher.cmd); debug("Launcher args:\t%s\n", launcher.args); diff --git a/head_src/head.h b/head_src/head.h index a401d28..001a49a 100644 --- a/head_src/head.h +++ b/head_src/head.h @@ -134,9 +134,9 @@ BOOL jreSearch(const char *exePath, const int pathLen); BOOL appendToPathVar(const char* path); BOOL appendJreBinToPathVar(); void setEnvironmentVariables(const char *exePath, const int pathLen); -void setMainClassAndClassPath(const char *exePath, const int pathLen); -void setCommandLineArgs(const char *lpCmdLine); -int prepare(const char *lpCmdLine); +void setMainClassAndClassPath(const char *exePath, const int pathLen, BOOL jni); +void setCommandLineArgs(const char *lpCmdLine, BOOL jni); +int prepare(const char *lpCmdLine, BOOL jni); void closeProcessHandles(); BOOL execute(const BOOL wait, DWORD *dwExitCode); const char* getJavaHome(); diff --git a/head_src/jniconsolehead_BETA/jniconsolehead.c b/head_src/jniconsolehead_BETA/jniconsolehead.c index 0e7f6dd..22261ef 100644 --- a/head_src/jniconsolehead_BETA/jniconsolehead.c +++ b/head_src/jniconsolehead_BETA/jniconsolehead.c @@ -56,7 +56,7 @@ int main(int argc, char* argv[]) cmdLine = ""; } - int result = prepare(cmdLine); + int result = prepare(cmdLine, TRUE); if (result == ERROR_ALREADY_EXISTS) { diff --git a/head_src/jniguihead_BETA/jniguihead.c b/head_src/jniguihead_BETA/jniguihead.c index 0259a27..9551404 100644 --- a/head_src/jniguihead_BETA/jniguihead.c +++ b/head_src/jniguihead_BETA/jniguihead.c @@ -50,7 +50,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow) { - int result = prepare(lpCmdLine); + int result = prepare(lpCmdLine, TRUE); if (result == ERROR_ALREADY_EXISTS) { diff --git a/head_src/jnihead.c b/head_src/jnihead.c index e62dc03..a0979b1 100644 --- a/head_src/jnihead.c +++ b/head_src/jnihead.c @@ -61,6 +61,13 @@ void saveJvmOptions(const char *jrePath, const char *mainClass, const char *pcOp strcpy(g_rgcCurrJrePth, jrePath); strcpy(g_rgcMnCls, mainClass); + /* Extract main class from arguments */ + char *delim = strpbrk(g_rgcMnCls, g_pcSep); + if (delim != NULL) { + *delim = '\0'; + strcpy(g_rgcMnClsArgs, delim + 1); + } + char rgcOptCpy[MAX_ARGS] = {0}; int iArgCnt = 0, iCurrArg = 0, iSkipArgCnt = 0; char *pcCurrOpt; diff --git a/src/net/sf/launch4j/config/Config.java b/src/net/sf/launch4j/config/Config.java index da9dd1d..d57f3e3 100644 --- a/src/net/sf/launch4j/config/Config.java +++ b/src/net/sf/launch4j/config/Config.java @@ -160,8 +160,6 @@ private void checkJniInvariants() { if (isJniApplication()) { Validator.checkTrue(".".equals(chdir), "chdir", "Only '.' is allowed in change directory."); - Validator.checkTrue(Validator.isEmpty(cmdLine), "cmdLine", - "Constant command line arguments not supported."); Validator.checkFalse(stayAlive, "stayAlive", "Stay alive option is not used in JNI, this is the default behavior."); Validator.checkFalse(restartOnCrash, "restartOnCrash",