You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2005/12/01 07:04:00 UTC
svn commit: r350181 [177/198] - in
/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core: ./ depends/
depends/files/ depends/jars/ depends/libs/ depends/libs/linux.IA32/
depends/libs/win.IA32/ depends/oss/ depends/oss/linux.IA32/
depends/oss/win....
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/main.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/main.c?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/main.c (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/main.c Wed Nov 30 21:29:27 2005
@@ -0,0 +1,1266 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define USING_VMI /* Used in header files */
+
+#include "jni.h" /* for definitions of JavaVM */
+#include "hycomp.h" /* for portable types (UDATA,etc...) */
+#include "hythread.h" /* for synchronization */
+#include "hyport.h" /* for port library */
+#include "hyexelibnls.h" /* nls strings */
+#include "libhlp.h" /* defaults and environment variables and string buffer functions */
+
+#include <string.h>
+#include <stdlib.h>
+
+#define PORT_LIB_OPTION "_org.apache.harmony.vmi.portlib"
+
+#define HY_COPYRIGHT_STRING "(c) Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable."
+
+#define HY_PATH_SLASH DIR_SEPARATOR
+
+#if defined(WIN32)
+#define PLATFORM_STRNICMP strnicmp
+#endif
+
+#if (LINUX)
+#define PLATFORM_STRNICMP strncasecmp
+#endif
+
+static int invocation
+PROTOTYPE ((HyPortLibrary * portLibrary, int argc, char **argv, UDATA handle,
+ jint version, jboolean ignoreUnrecognized, char *mainClass,
+ UDATA classArg, int isJvmSubDir, char *propertiesFileName,
+ int isStandaloneJar, char *vmdllsubdir));
+static int createVMArgs
+PROTOTYPE ((HyPortLibrary * portLibrary, int argc, char **argv, UDATA handle,
+ jint version, jboolean ignoreUnrecognized,
+ JavaVMInitArgs * vm_args,
+ jint (JNICALL ** CreateJavaVM) (JavaVM **, JNIEnv **,
+ JavaVMInitArgs *),
+ int isJvmSubDir, UDATA classArg, char *propertiesFileName,
+ int isStandaloneJar, char *mainClassJar, char *vmdllsubdir));
+char *VMCALL vmdll_parseCmdLine
+PROTOTYPE ((HyPortLibrary * portLibrary, UDATA lastLegalArg, char **argv));
+char *VMCALL vmdlldir_parseCmdLine
+PROTOTYPE ((HyPortLibrary * portLibrary, UDATA lastLegalArg, char **argv));
+UDATA VMCALL gpProtectedMain PROTOTYPE ((struct haCmdlineOptions * args));
+IDATA convertString
+PROTOTYPE ((JNIEnv * env, HyPortLibrary * portLibrary, jclass stringClass,
+ jmethodID stringMid, char *chars, jstring * str));
+static IDATA addJreDirToPath
+PROTOTYPE ((HyPortLibrary * portLibrary, char *newPathToAdd, char **argv));
+int main_runJavaMain
+PROTOTYPE ((JNIEnv * env, char *mainClassName, int nameIsUTF, int java_argc,
+ char **java_argv, HyPortLibrary * portLibrary));
+jint readPropertiesFile
+PROTOTYPE ((HyPortLibrary * portLibrary, char *propertiesFileName,
+ char **fileContentsPtr));
+static I_32 initDefaultDefines
+PROTOTYPE ((HyPortLibrary * portLib, void **vmOptionsTable, int argc,
+ char **argv, int jarArg, HyStringBuffer ** classPathInd,
+ HyStringBuffer ** javaHomeInd,
+ HyStringBuffer ** javaLibraryPathInd, int isJvmSubDir,
+ char *vmdllsubdir, int *vmOptionsCount));
+
+#if defined(WIN32)
+#define DIR_SEPERATOR '\\'
+#define DIR_SEPERATOR_STRING "\\"
+#else
+#define DIR_SEPERATOR '/'
+#define DIR_SEPERATOR_STRING "/"
+#endif
+
+/**
+ * The actual main function wrapped in the standard GP-handler.
+ *
+ * @param[in] args The encapsulated command-line arguments and port library.
+ *
+ * @return 0 on success, or a non-zero error code on failure.
+ */
+UDATA VMCALL
+gpProtectedMain (struct haCmdlineOptions *args)
+{
+ int argc = args->argc;
+ char **argv = args->argv;
+ char *vmdll;
+ char *mainClass = NULL;
+ int isStandaloneJar = 0;
+ int copyrightWritten = 0;
+ int versionWritten = 0;
+ UDATA classArg = argc;
+ int i;
+ char *vmdllsubdir;
+ int isJvmSubDir = 0;
+ char *vmiPath;
+ char *newPathToAdd;
+ char *propertiesFileName;
+ char *exeName;
+ char *endPathPtr;
+ //jint (JNICALL *JNI_CreateJavaVM)(JavaVM**, JNIEnv**, JavaVMInitArgs*);
+ UDATA handle;
+ int javaRc = 0;
+ char defaultDllName[] = "clearvm";
+ char defaultDirName[] = "default";
+ int rc = -1;
+ int showVersion = 0;
+
+ PORT_ACCESS_FROM_PORT (args->portLibrary);
+
+ if (argc <= 1)
+ {
+ hyfile_printf (PORTLIB, HYPORT_TTY_OUT,
+ "Harmony java launcher using vmi interface\n");
+ hyfile_printf (PORTLIB, HYPORT_TTY_OUT, HY_COPYRIGHT_STRING "\n");
+ hyfile_printf (PORTLIB, HYPORT_TTY_OUT,
+ "java [-vm:vmdll -vmdir:dir -D... [-X...]] classname [args]\n");
+ return 0;
+ }
+ /* Find the class to load. First arguement to launcher not starting with - */
+
+ for (i = 1; i < argc; i++)
+ {
+ if ('-' != argv[i][0])
+ {
+ classArg = i; /* save position */
+ mainClass = argv[i]; /* save class to execute */
+ break;
+ }
+ else if ((strcmp ("-cp", argv[i]) == 0)
+ || (strcmp ("-classpath", argv[i]) == 0))
+ {
+ i++; /* Skip the next arg */
+ }
+
+ if (0 == strcmp ("-version", argv[i]))
+ {
+ if (!versionWritten)
+ {
+ dumpVersionInfo (PORTLIB);
+ hyfile_printf (PORTLIB, HYPORT_TTY_OUT,
+ HY_COPYRIGHT_STRING "\n");
+ copyrightWritten = 1;
+ versionWritten = 1;
+ }
+ return 0;
+ }
+
+ if (0 == strcmp ("-showversion", argv[i]))
+ {
+ showVersion = 1;
+ }
+
+ if (strcmp ("-jar", argv[i]) == 0)
+ {
+ isStandaloneJar = 1;
+ }
+ }
+
+ /* Find the vm dll */
+ vmdll = vmdll_parseCmdLine (PORTLIB, argc - 1, argv);
+ if (!vmdll)
+ {
+ vmdll = defaultDllName;
+ }
+
+ /* Find the directory of the dll and set up the path */
+ vmdllsubdir = vmdlldir_parseCmdLine (PORTLIB, argc - 1, argv);
+ if (!vmdllsubdir)
+ {
+ isJvmSubDir = 1;
+ vmdllsubdir = defaultDirName;
+ }
+ else
+ {
+ isJvmSubDir = 1;
+ }
+
+ /* if jvm dlls are located in a subdirectory off of jre/bin */
+ /* setup path to dll named in -vm argument */
+ if (isJvmSubDir)
+ {
+ hysysinfo_get_executable_name (argv[0], &exeName);
+ endPathPtr = strrchr (exeName, DIR_SEPERATOR);
+ endPathPtr[1] = '\0';
+ newPathToAdd =
+ hymem_allocate_memory (strlen (exeName) + strlen (vmdllsubdir) + 1);
+ if (newPathToAdd == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ goto bail;
+ }
+
+ vmiPath =
+ hymem_allocate_memory (strlen (exeName) + strlen (vmdllsubdir) +
+ strlen (vmdll) +
+ strlen (DIR_SEPERATOR_STRING) + 1);
+ if (vmiPath == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ goto bail;
+ }
+
+ vmiPath[0] = '\0';
+ strcpy (newPathToAdd, exeName);
+ strcat (newPathToAdd, vmdllsubdir);
+ strcpy (vmiPath, newPathToAdd);
+ strcat (vmiPath, DIR_SEPERATOR_STRING);
+ strcat (vmiPath, vmdll);
+ rc = addJreDirToPath (PORTLIB, newPathToAdd, argv);
+ if (rc == -1)
+ {
+ hytty_printf (PORTLIB, "addJreDirToPath Failed\n");
+ goto bail;
+ }
+ }
+ else
+ {
+ vmiPath = hymem_allocate_memory (strlen (vmdll) + 1);
+ if (vmiPath == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ goto bail;
+ }
+ strcpy (vmiPath, vmdll);
+ }
+
+ if (showVersion == 1)
+ {
+ if (!versionWritten)
+ {
+ dumpVersionInfo (PORTLIB);
+ hyfile_printf (PORTLIB, HYPORT_TTY_OUT, HY_COPYRIGHT_STRING "\n");
+ copyrightWritten = 1;
+ versionWritten = 1;
+ }
+ }
+ /* set up the properties file */
+ propertiesFileName = hymem_allocate_memory (strlen (vmiPath) + 12);
+ if (propertiesFileName == NULL)
+ {
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ goto bail;
+ }
+ strcpy (propertiesFileName, vmiPath);
+ strcat (propertiesFileName, ".properties");
+
+ /* Open the DLL */
+ if (hysl_open_shared_library (vmiPath, &handle, TRUE))
+ {
+ hytty_printf (PORTLIB, "Failed to open JVM DLL: %s (%s)\n", vmiPath,
+ hyerror_last_error_message ());
+ goto bail;
+ }
+
+ /* main launcher processing in this function */
+ if (invocation
+ (PORTLIB, argc, argv, handle, JNI_VERSION_1_4, JNI_TRUE, mainClass,
+ classArg, isJvmSubDir, propertiesFileName, isStandaloneJar,
+ vmdllsubdir))
+ {
+ hytty_printf (PORTLIB, "FAILED.\n");
+ goto bail;
+ }
+
+ if (hysl_close_shared_library (handle))
+ {
+ hytty_printf (PORTLIB, "Failed to close JVM DLL: %s\n", argv[1]);
+ goto bail;
+ }
+bail:
+ if (propertiesFileName)
+ {
+ hymem_free_memory (propertiesFileName);
+ }
+ if (vmiPath)
+ {
+ hymem_free_memory (vmiPath);
+ }
+ if (newPathToAdd)
+ {
+ hymem_free_memory (newPathToAdd);
+ }
+ return 0;
+}
+
+/**
+ * Scan for the -vm: option and return the associated value, or NULL
+ * if the argument cannot be found.
+ */
+char *VMCALL
+vmdll_parseCmdLine (HyPortLibrary * portLibrary, UDATA lastLegalArg,
+ char **argv)
+{
+ UDATA i;
+
+#if (LINUX)
+#define COMPARE_STRINGS strncasecmp
+#else
+#define COMPARE_STRINGS strncasecmp
+#endif
+
+ /* Parse command line args for -vm: */
+ for (i = 1; i <= lastLegalArg; i++)
+ {
+ if ((argv[i][0] == '-'))
+ {
+ if ((PLATFORM_STRNICMP (&argv[i][1], "vm:", 3) == 0))
+ {
+ return &argv[i][4];
+ }
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Scan for the -vmdir: option and return the associated value, or NULL
+ * if the argument cannot be found.
+ */
+char *VMCALL
+vmdlldir_parseCmdLine (HyPortLibrary * portLibrary, UDATA lastLegalArg,
+ char **argv)
+{
+ UDATA i;
+
+#if (LINUX)
+#define COMPARE_STRINGS strncasecmp
+#else
+#define COMPARE_STRINGS strncasecmp
+#endif
+
+ /* Parse command line args for -vmdir: */
+ for (i = 1; i <= lastLegalArg; i++)
+ {
+ if ((argv[i][0] == '-'))
+ {
+ if ((PLATFORM_STRNICMP (&argv[i][1], "vmdir:", 6) == 0))
+ {
+ return &argv[i][7];
+ }
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Create of a JavaVM using JNI Invocation API and the arguments parsed from argc and argv.
+ * Run the java class
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] argc The number of arguments passed to program on the command line.
+ * @param[in] argv The values of command-line arguments.
+ * @param[in] handle The VM dll handle opened via the port library.
+ * @param[in] version The invocation API version to test.
+ * @param[in] ignoreUnrecognized A hint to the JNI to ignore/fail on unrecognized args.
+ * @param[in] mainClass The class to run.
+ * @param[in] classArg The index to mainClass in the array of launcher args.
+ * @param[in] propertiesFileName The properties file path and FileName.
+ *
+ * @return 0 on success, or a non-zero error code on failure.
+ */
+static int
+invocation (HyPortLibrary * portLibrary, int argc, char **argv, UDATA handle,
+ jint version, jboolean ignoreUnrecognized, char *mainClass,
+ UDATA classArg, int isJvmSubDir, char *propertiesFileName,
+ int isStandaloneJar, char *vmdllsubdir)
+{
+ JavaVMInitArgs vm_args;
+ JavaVM *jvm;
+ JNIEnv *env;
+ char *mainClassJar;
+ int javaRc = 0;
+ int isNameUTF = 0;
+ int rc;
+ jint (JNICALL * CreateJavaVM) (JavaVM **, JNIEnv **, JavaVMInitArgs *);
+ PORT_ACCESS_FROM_PORT (portLibrary);
+
+ mainClassJar = hymem_allocate_memory (50);
+ if (mainClassJar == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ return 1;
+ }
+ if (createVMArgs
+ (portLibrary, argc, argv, handle, version, ignoreUnrecognized, &vm_args,
+ &CreateJavaVM, isJvmSubDir, classArg, propertiesFileName,
+ isStandaloneJar, mainClassJar, vmdllsubdir))
+ return 1;
+
+ if (CreateJavaVM (&jvm, &env, &vm_args))
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JAVA_VM=Internal VM error\: Failed to create Java VM\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JAVA_VM);
+ return 1;
+ }
+
+ rc = 0;
+ if (mainClass)
+ {
+ if (isStandaloneJar)
+ {
+ jclass jarRunner;
+ jclass clazz;
+ jmethodID mID;
+ jstring jStrObject;
+
+ mainClass = mainClassJar;
+
+ jStrObject = (*env)->NewStringUTF (env, mainClass);
+ if (!jStrObject)
+ {
+ (*env)->ExceptionDescribe (env);
+ (*jvm)->DestroyJavaVM (jvm);
+ rc = 3;
+ //goto cleanup;
+ }
+
+ clazz = (*env)->FindClass (env, "java/lang/Class");
+ if (!clazz)
+ {
+ (*env)->ExceptionDescribe (env);
+ (*jvm)->DestroyJavaVM (jvm);
+ rc = 3;
+ //goto cleanup;
+ }
+
+ mID =
+ (*env)->GetStaticMethodID (env, clazz, "forName",
+ "(Ljava/lang/String;)Ljava/lang/Class;");
+ if (!mID)
+ {
+ (*env)->ExceptionDescribe (env);
+ (*jvm)->DestroyJavaVM (jvm);
+ rc = 3;
+ //goto cleanup;
+ }
+
+ /* should not spawn an exception */
+ jarRunner =
+ (*env)->CallStaticObjectMethod (env, clazz, mID, jStrObject);
+
+ if (jarRunner)
+ {
+ (*env)->DeleteLocalRef (env, jarRunner);
+ classArg -= 1; /* make sure that the JAR is the first argument */
+ }
+ else
+ {
+ (*env)->ExceptionClear (env);
+ (*jvm)->DestroyJavaVM (jvm);
+ rc = 3;
+ //goto cleanup;
+ }
+ }
+
+ javaRc =
+ main_runJavaMain (env, mainClass, isNameUTF, (argc - (classArg + 1)),
+ &argv[classArg + 1], portLibrary);
+ }
+
+ if (vm_args.options)
+ {
+ hymem_free_memory (vm_args.options);
+ }
+ if (mainClassJar)
+ {
+ hymem_free_memory (mainClassJar);
+ }
+
+ (*jvm)->DestroyJavaVM (jvm);
+ /*if ((*jvm)->DestroyJavaVM(jvm)) {
+ hytty_printf (PORTLIB, "Failed to destroy JVM\n");
+ return 1;
+ } */
+
+ return 0;
+}
+
+ /**
+ * Converts command-line arguments into a format compatible with JNI invocation API,
+ * and looks up the JNI_CreateJavaVM() function in dll/shared library specified by
+ * handle.
+ *
+ * @param[in] portLibrary The port library.
+ * @param[in] argc The number of arguments passed to program on the command line.
+ * @param[in] argv The values of command-line arguments.
+ * @param[in] handle The VM dll handle opened via the port library.
+ * @param[in] version The invocation API version to test.
+ * @param[in] ignoreUnrecognized A hint to the JNI to ignore/fail on unrecognized args.
+ * @param[in/out] vm_args Receives the newly converted JavaVMInitArgs (must be freed by caller).
+ * @param[in/out] CreateJavaVM Receives the address of the JNI_CreateJavaVM() function.
+ * @param[in] isJvmSubDir The indicator to show we are using a subdirectory for the VM
+ * @param[in] classArg The index to mainClass in the array of launcher args.
+ * @param[in] propertiesFileName The properties file path and FileName.
+ * @param[out] mainClassJar The class to run if running Jar file.
+ *
+ * @return 0 on success, or a non-zero error code on failure.
+ */
+
+static int
+createVMArgs (HyPortLibrary * portLibrary, int argc, char **argv,
+ UDATA handle, jint version, jboolean ignoreUnrecognized,
+ JavaVMInitArgs * vm_args,
+ jint (JNICALL ** CreateJavaVM) (JavaVM **, JNIEnv **,
+ JavaVMInitArgs *),
+ int isJvmSubDir, UDATA classArg, char *propertiesFileName,
+ int isStandaloneJar, char *mainClassJar, char *vmdllsubdir)
+{
+ JavaVMOption *options;
+ char *exeName;
+ char *endPathPtr;
+ int lengthExeName;
+ UDATA i = 0;
+ int j = 0;
+ int k = 0;
+ int l = 0;
+ char *fileContents = NULL;
+ char **fileContentsPtr = &fileContents;
+ int rc = 0;
+ char *lineDelimiter = NULL;
+ char *equalsDelimiter = NULL;
+ char *startOfLine = NULL;
+ char *lineStr[20];
+ char *expandedLineStr[20];
+ int linecount = 0;
+ int noOfLauncherHomes;
+ int offset;
+ char *classPath;
+ int useDefaultJarRunner = 0;
+ HyStringBuffer *javaHome = NULL, *classPath2 = NULL, *javaLibraryPath =
+ NULL;
+ char *portLibOptionStr = NULL;
+
+ PORT_ACCESS_FROM_PORT (portLibrary);
+ hysysinfo_get_executable_name (argv[0], &exeName);
+ endPathPtr = strrchr (exeName, DIR_SEPERATOR);
+ endPathPtr[0] = '\0';
+ lengthExeName = strlen (exeName);
+
+ /* read in vm_args from properties file */
+ rc = readPropertiesFile (portLibrary, propertiesFileName, fileContentsPtr);
+ if (rc == 0)
+ {
+
+ lineDelimiter = strstr (fileContents, PLATFORM_LINE_DELIMITER);
+ startOfLine = fileContents;
+ /* note this logic means you need a line feed at the end of every line */
+ /* you cannot have a line ending with the end of file character */
+ while (lineDelimiter)
+ {
+ /* Hammer the line delimiter to be a null */
+ *lineDelimiter = '\0';
+ if (*startOfLine == '-')
+ {
+ lineStr[linecount] = startOfLine;
+ //printf ("linecount %d = %s\n",linecount, lineStr[linecount]);
+ linecount++;
+ }
+ else if (isStandaloneJar)
+ {
+ if (strncmp (startOfLine, "jarMainClass", 12) == 0)
+ {
+ strcpy (mainClassJar, startOfLine + 13);
+ useDefaultJarRunner = 1;
+ }
+ }
+ startOfLine = lineDelimiter + strlen (PLATFORM_LINE_DELIMITER);
+ lineDelimiter = lineDelimiter + strlen (PLATFORM_LINE_DELIMITER);
+ lineDelimiter = strstr (lineDelimiter, PLATFORM_LINE_DELIMITER);
+ }
+ }
+ /* now expand strings with %LAUNCHER_HOME% */
+ for (l = 0; l < linecount; l++)
+ {
+ offset = 0x00;
+ noOfLauncherHomes = 0;
+
+ /* count number of instances of %LAUNCHER_HOME% in String */
+ while (equalsDelimiter =
+ strstr (lineStr[l] + offset, "%LAUNCHER_HOME%"))
+ {
+ noOfLauncherHomes++;
+ offset = equalsDelimiter - lineStr[l] + 15;
+ //printf("counter = %d\n",noOfLauncherHomes);
+ }
+ /* Allocate memory for expanding string */
+ if (equalsDelimiter = strstr (lineStr[l], "%LAUNCHER_HOME%"))
+ {
+ expandedLineStr[l] =
+ hymem_allocate_memory (strlen (lineStr[l]) +
+ (lengthExeName * noOfLauncherHomes));
+ if (expandedLineStr[l] == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ return 1;
+ }
+ }
+ /* fill in expanded string */
+ offset = 0;
+ *expandedLineStr[l] = '\0';
+ while (equalsDelimiter = strstr (lineStr[l], "%LAUNCHER_HOME%"))
+ {
+ /* Hammer the line delimiter to be a null */
+ *equalsDelimiter = '\0';
+ strcat (expandedLineStr[l], lineStr[l]);
+ strcat (expandedLineStr[l], exeName);
+ //printf ("expandedLineStr[l] = %s\n", expandedLineStr[l]);
+ lineStr[l] = equalsDelimiter + 15;
+ }
+
+ if (noOfLauncherHomes == 0)
+ {
+ expandedLineStr[l] = lineStr[l];
+ }
+ else
+ {
+ strcat (expandedLineStr[l], lineStr[l]);
+ //printf ("expandedLineStr[l] = %s\n", expandedLineStr[l]);
+ }
+ }
+
+ if (isStandaloneJar)
+ {
+ if (useDefaultJarRunner == 0)
+ {
+ mainClassJar = hymem_allocate_memory (50);
+ if (mainClassJar == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ return 1;
+ }
+ strcpy (mainClassJar, "com.ibm.oti.vm.JarRunner");
+ }
+ }
+ /* entries from command line, properties file, 3 defaults plus the port library option */
+ options =
+ hymem_allocate_memory ((argc + linecount + 4) * sizeof (*options));
+
+ if (options == NULL)
+ {
+ /* HYNLS_EXELIB_VM_STARTUP_ERR_OUT_OF_MEMORY=Internal VM error\: VM startup error: Out of memory\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_VM_STARTUP_ERR_OUT_OF_MEMORY);
+
+ hytty_err_printf (PORTLIB, "Failed to allocate memory for options\n");
+ return 1;
+ }
+
+ if (rc == 0) /* there is a properties file */
+ {
+ for (k = 0, j = 0; k < linecount; k++)
+ {
+ /* if jar file there is special handling for java.class.path later */
+ /* Ignore classpath defines for -jar */
+ if (isStandaloneJar)
+ {
+ if (strncmp (lineStr[k], "-Djava.class.path=", 18) != 0)
+ {
+ options[j].optionString = expandedLineStr[k];
+ options[j].extraInfo = NULL;
+ j++;
+ }
+ }
+ else
+ {
+ options[j].optionString = expandedLineStr[k];
+ options[j].extraInfo = NULL;
+ j++;
+ }
+ }
+ }
+
+ /* only pass arguments starting with '-' to JNI_CreateJavaVM */
+ /* but note parameters to program might have '-' */
+ for (i = 1; i < classArg; i++)
+ {
+ if (('-' == argv[i][0]) && (strncmp (argv[i], "-jar", 4) != 0) &&
+ (strncmp (argv[i], "-vmdir:", 7) != 0)
+ && (strncmp (argv[i], "-vm:", 4) != 0)
+ && (strncmp (argv[i], "-showversion", 12) != 0))
+ {
+ /* special coding for -classpath and -cp */
+ /* they get passed to the vm as -Djava.class.path */
+ if ((strncmp (argv[i], "-cp", 3) == 0)
+ || (strncmp (argv[i], "-classpath", 9) == 0))
+ {
+ classPath = hymem_allocate_memory (strlen (argv[i + 1]) + 20);
+ if (classPath == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ return 1;
+ }
+ //classPath = hymem_allocate_memory( 2048 );
+ strcpy (classPath, "-Djava.class.path=");
+ strcat (classPath, argv[i + 1]);
+ options[j].optionString = classPath;
+ i++; /*skip next arguement */
+ }
+ else
+ {
+ options[j].optionString = argv[i];
+ }
+ options[j].extraInfo = NULL;
+ j++;
+ }
+ }
+
+ /* Check that the minimum required -D options have been included. If not, calculate and add the defaults */
+ initDefaultDefines (portLibrary, &options, argc, argv,
+ isStandaloneJar ? classArg : 0, &classPath2, &javaHome,
+ &javaLibraryPath, isJvmSubDir, vmdllsubdir, &j);
+
+ // Slam in the pointer to the HyPortLibrary
+ portLibOptionStr = hymem_allocate_memory (strlen(PORT_LIB_OPTION) + 1);
+ if (portLibOptionStr == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ PORTLIB->nls_printf (PORTLIB, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ return 1;
+ }
+
+ strcpy (portLibOptionStr, PORT_LIB_OPTION);
+ options[j].optionString = portLibOptionStr;
+ options[j].extraInfo = portLibrary;
+ j++;
+
+ vm_args->version = version;
+ vm_args->nOptions = j;
+ vm_args->options = options;
+ vm_args->ignoreUnrecognized = ignoreUnrecognized;
+
+ // For debugging only
+ //printf ("JNI_CreateJavaVM no of args %d\n",vm_args->nOptions);
+ //for (j=0 ; j < (vm_args->nOptions) ; j++)
+ // {
+ // printf ("%s\n",vm_args->options[j]);
+ // }
+
+ if (hysl_lookup_name
+ (handle, "JNI_CreateJavaVM", (UDATA *) CreateJavaVM, "iLLL"))
+ {
+ hytty_printf (PORTLIB, "Failed to find JNI_CreateJavaVM in DLL\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+* Update path to point to directory containing VM's DLLs
+*
+* @param[in] newPathToAdd The directory to add to the PATH environment variable
+* @param[in] argv The commandline argv for linux
+*
+*/
+static IDATA
+addJreDirToPath (HyPortLibrary * portLibrary, char *newPathToAdd, char **argv)
+{
+ char *tempchar = NULL;
+ char *variableName = NULL;
+ char *separator = NULL;
+ UDATA newPathLength;
+ char *newPath;
+ int rc = 0;
+ char *exeName;
+
+ PORT_ACCESS_FROM_PORT (portLibrary);
+
+ hysysinfo_get_executable_name (argv[0], &exeName);
+
+#if defined(WIN32)
+ variableName = "PATH";
+ separator = ";";
+#else
+ variableName = "LD_LIBRARY_PATH";
+ separator = ":";
+#endif
+
+ tempchar = getenv (variableName);
+ if (!tempchar)
+ tempchar = "";
+ newPathLength = strlen (tempchar) + strlen (newPathToAdd) + strlen (variableName) + 3; /* 3 = separator + equals + EOL */
+ newPath = hymem_allocate_memory (newPathLength);
+
+ if (!newPath)
+ return -1;
+ strcpy (newPath, variableName);
+ strcat (newPath, "=");
+ strcat (newPath, newPathToAdd);
+ strcat (newPath, separator);
+ strcat (newPath, tempchar);
+
+#if defined(WIN32)
+ rc = _putenv (newPath);
+#else
+ if (strstr (tempchar, newPathToAdd) == NULL)
+ {
+ rc = putenv (newPath);
+ execv (exeName, argv);
+ }
+#endif
+
+ /* putenv still uses the memory */
+ //hymem_free_memory(newPath);
+
+ return rc;
+}
+
+int
+main_runJavaMain (JNIEnv * env, char *mainClassName, int nameIsUTF,
+ int java_argc, char **java_argv,
+ HyPortLibrary * portLibrary)
+{
+ int i, rc = 0;
+ jclass cls;
+ jmethodID mid, stringMid;
+ jarray args;
+ jclass stringClass;
+ char *slashifiedClassName, *dots, *slashes;
+ const char *utfClassName;
+ jboolean isCopy;
+ jstring str;
+ jclass globalCls;
+ jarray globalArgs;
+
+ PORT_ACCESS_FROM_PORT (portLibrary);
+ slashifiedClassName =
+ portLibrary->mem_allocate_memory (portLibrary,
+ strlen (mainClassName) + 1);
+ if (slashifiedClassName == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY=Internal VM error: Out of memory\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY);
+ rc = 2;
+ goto done;
+ }
+ for (slashes = slashifiedClassName, dots = mainClassName; *dots;
+ dots++, slashes++)
+ {
+ *slashes = (*dots == '.' ? '/' : *dots);
+ }
+ *slashes = '\0';
+
+ /* fetch j.l.String and the constructor that takes a byte array as parm */
+ stringClass = (*env)->FindClass (env, "java/lang/String");
+ if (!stringClass)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_TO_FIND_JLS=Internal VM error: Failed to find class java/lang/String\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_TO_FIND_JLS);
+ rc = 5;
+ goto done;
+ }
+ stringMid = ((*env)->GetMethodID (env, stringClass, "<init>", "([BII)V"));
+
+ if (nameIsUTF)
+ {
+ cls = (*env)->FindClass (env, slashifiedClassName);
+ portLibrary->mem_free_memory (portLibrary, slashifiedClassName);
+ }
+ else
+ {
+ rc =
+ convertString (env, portLibrary, stringClass, stringMid,
+ slashifiedClassName, &str);
+ portLibrary->mem_free_memory (portLibrary, slashifiedClassName);
+
+ if (rc == 1)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BA=Internal VM error: Failed to create byte array for class name %s\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BA,
+ mainClassName);
+ rc = 10;
+ goto done;
+ }
+ if (rc == 2)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME=Internal VM error: Failed to create java/lang/String for class name %s\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_CLASSNAME,
+ mainClassName);
+ rc = 11;
+ goto done;
+ }
+ utfClassName = (*env)->GetStringUTFChars (env, str, &isCopy);
+ if (utfClassName == NULL)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY_CONVERTING=Internal VM error: Out of memory converting string to UTF Chars for class name %s\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_OUT_OF_MEMORY_CONVERTING,
+ mainClassName);
+ rc = 12;
+ goto done;
+ }
+ cls = (*env)->FindClass (env, utfClassName);
+ (*env)->ReleaseStringUTFChars (env, str, utfClassName);
+ (*env)->DeleteLocalRef (env, str);
+ }
+
+ if (!cls)
+ {
+ rc = 3;
+ goto done;
+ }
+
+ /* Create the String array before getting the methodID to get better performance from HOOK_ABOUT_TO_RUN_MAIN */
+ args = (*env)->NewObjectArray (env, java_argc, stringClass, NULL);
+ if (!args)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_ARG_ARRAY=Internal VM error: Failed to create argument array\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_ARG_ARRAY);
+ rc = 6;
+ goto done;
+ }
+ for (i = 0; i < java_argc; ++i)
+ {
+ rc =
+ convertString (env, portLibrary, stringClass, stringMid, java_argv[i],
+ &str);
+ if (rc == 1)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BYTE_ARRAY=Internal VM error: Failed to create byte array for argument %s\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_BYTE_ARRAY,
+ java_argv[i]);
+ rc = 7;
+ goto done;
+ }
+ if (rc == 2)
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_ARG=Internal VM error: Failed to create java/lang/String for argument %s\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_CREATE_JLS_FOR_ARG,
+ java_argv[i]);
+ rc = 8;
+ goto done;
+ }
+
+ (*env)->SetObjectArrayElement (env, args, i, str);
+ if ((*env)->ExceptionCheck (env))
+ {
+ /* HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_SET_ARRAY_ELEM=Internal VM error: Failed to set array element for %s\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_INTERNAL_VM_ERR_FAILED_SET_ARRAY_ELEM,
+ java_argv[i]);
+ rc = 9;
+ goto done;
+ }
+ (*env)->DeleteLocalRef (env, str);
+ }
+
+ mid =
+ (*env)->GetStaticMethodID (env, cls, "main", "([Ljava/lang/String;)V");
+ if (!mid)
+ {
+ /* Currently, GetStaticMethodID does not throw an exception when the method is not found */
+ /* HYNLS_EXELIB_CLASS_DOES_NOT_IMPL_MAIN=Class %s does not implement main()\n */
+ portLibrary->nls_printf (portLibrary, HYNLS_ERROR,
+ HYNLS_EXELIB_CLASS_DOES_NOT_IMPL_MAIN,
+ mainClassName);
+ rc = 4;
+ goto done;
+ }
+
+ globalCls = (jclass) (*env)->NewGlobalRef (env, cls);
+ if (globalCls)
+ {
+ (*env)->DeleteLocalRef (env, cls);
+ cls = globalCls;
+ }
+ globalArgs = (jarray) (*env)->NewGlobalRef (env, args);
+ if (globalArgs)
+ {
+ (*env)->DeleteLocalRef (env, args);
+ args = globalArgs;
+ }
+ (*env)->DeleteLocalRef (env, stringClass);
+ (*env)->CallStaticVoidMethod (env, cls, mid, args);
+
+done:
+ if ((*env)->ExceptionCheck (env))
+ {
+ if (rc == 0)
+ rc = 100;
+ }
+
+ (*env)->ExceptionDescribe (env);
+ return rc;
+}
+
+/**
+ * Read the properties file specified by <tt>propertiesFileName</tt> into <tt>file contents</tt> pointer.
+ *
+ * @param portLibrary - The port library used to interact with the platform.
+ * @param propertiesFileName - The file from which to read data using hyfile* functions.
+ * @param fileContents- A pointer to memory containing the property file entries.
+ *
+ * @return JNI_OK on success, or a JNI error code on failure.
+ */
+jint
+readPropertiesFile (HyPortLibrary * portLibrary, char *propertiesFileName,
+ char **fileContentsPtr)
+{
+ PORT_ACCESS_FROM_PORT (portLibrary);
+ IDATA propsFD = -1;
+ I_64 seekResult;
+ char *fileContents = NULL;
+ IDATA fileSize;
+ IDATA bytesRemaining;
+ jint returnCode = JNI_OK;
+ char *writeCursor;
+
+ /* Determine the file size, fail if > 2G */
+ seekResult = hyfile_length (propertiesFileName);
+ if ((seekResult <= 0) || (seekResult > 0x7FFFFFFF))
+ {
+ return JNI_ERR;
+ }
+ fileSize = (IDATA) seekResult;
+
+ /* Open the properties file */
+ propsFD = hyfile_open (propertiesFileName, (I_32) HyOpenRead, (I_32) 0);
+ if (propsFD == -1)
+ {
+ /* Could not open the file */
+ return JNI_ERR;
+ }
+
+ /* Allocate temporary storage */
+ fileContents = hymem_allocate_memory (fileSize);
+ if (!fileContents)
+ {
+ return JNI_ENOMEM;
+ }
+
+ /* Initialize the read state */
+ bytesRemaining = fileSize;
+ writeCursor = fileContents;
+
+ /* Suck the file into memory */
+ while (bytesRemaining > 0)
+ {
+ IDATA bytesRead = hyfile_read (propsFD, writeCursor, bytesRemaining);
+ if (bytesRead == -1)
+ {
+ /* Read failed */
+ returnCode = JNI_ERR;
+ goto bail;
+ }
+
+ /* Advance the read state */
+ bytesRemaining -= bytesRead;
+ writeCursor += bytesRead;
+ }
+ *fileContentsPtr = fileContents;
+
+bail:
+ if (propsFD != -1)
+ {
+ hyfile_close (propsFD);
+ }
+
+ return returnCode;
+}
+
+void
+dumpVersionInfo (HyPortLibrary * portLib)
+{
+ PORT_ACCESS_FROM_PORT (portLib);
+
+ hytty_err_printf (PORTLIB,
+ (char *) portLib->nls_lookup_message (PORTLIB,
+ HYNLS_DO_NOT_PRINT_MESSAGE_TAG,
+ HYNLS_EXELIB_VERSION,
+ "\njava version 1.4.2 (subset)\n"), "1.4.2 (subset)\n");
+}
+
+static I_32
+initDefaultDefines (HyPortLibrary * portLib, void **vmOptionsTable, int argc,
+ char **argv, int jarArg, HyStringBuffer ** classPathInd,
+ HyStringBuffer ** javaHomeInd,
+ HyStringBuffer ** javaLibraryPathInd, int isJvmSubDir,
+ char *vmdllsubdir, int *vmOptionsCount)
+{
+ extern char *getDefineArgument (char *, char *);
+
+ int optionCount, i;
+ JavaVMOption *options;
+ int hasJavaHome = 0;
+ int hasJavaLibraryPath = 0;
+ int hasClassPath = 0;
+ HyStringBuffer *classPath = NULL;
+ HyStringBuffer *javaHome = NULL;
+ HyStringBuffer *javaLibraryPath = NULL;
+
+ /* Cycle through the list of VM options and check that the minimum required defaults are there.
+ * Calculate and insert the missing ones
+ */
+
+ optionCount = *vmOptionsCount;
+ options = *vmOptionsTable;
+ for (i = 0; i < optionCount; i++)
+ {
+ if (getDefineArgument (options[i].optionString, "java.home"))
+ {
+ hasJavaHome = 1;
+ continue;
+ }
+ if (getDefineArgument (options[i].optionString, "java.library.path"))
+ {
+ hasJavaLibraryPath = 1;
+ continue;
+ }
+ if (getDefineArgument (options[i].optionString, "java.class.path"))
+ {
+ /* Ignore classpath defines for -jar */
+ if (!jarArg)
+ {
+ hasClassPath = 1;
+ continue;
+ }
+ }
+ }
+
+ if (!hasJavaHome)
+ {
+
+ if (0 != main_initializeJavaHome (portLib, &javaHome, argc, argv))
+ {
+ /* This might be a memory leak, but main() will fail anyway */
+ return -1;
+ }
+
+ if (javaHome)
+ {
+ javaHome = strBufferPrepend (portLib, javaHome, "-Djava.home=");
+
+ if (!javaHome)
+ return -1;
+ *javaHomeInd = javaHome;
+
+ options[*vmOptionsCount].optionString = (char *) javaHome->data;
+ options[*vmOptionsCount].extraInfo = NULL;
+
+ *vmOptionsCount = *vmOptionsCount + 1;
+ }
+ }
+
+ if (!hasJavaLibraryPath)
+ {
+
+ if (0 !=
+ main_initializeJavaLibraryPath (portLib, &javaLibraryPath, argv[0]))
+ {
+ /* This might be a memory leak, but main() will fail anyway */
+ return -1;
+ }
+
+ if (javaLibraryPath)
+ {
+ javaLibraryPath =
+ strBufferPrepend (portLib, javaLibraryPath,
+ "-Djava.library.path=");
+ if (!javaLibraryPath)
+ return -1;
+ *javaLibraryPathInd = javaLibraryPath;
+ options[*vmOptionsCount].optionString =
+ (char *) javaLibraryPath->data;
+ options[*vmOptionsCount].extraInfo = NULL;
+ *vmOptionsCount = *vmOptionsCount + 1;
+ }
+ }
+
+ if (!hasClassPath)
+ {
+ /* no free classpath if there is a -jar */
+ if (jarArg)
+ {
+ if (jarArg < argc)
+ {
+ classPath = strBufferCat (portLib, classPath, argv[jarArg]);
+ if (classPath == NULL)
+ return -1;
+ }
+ }
+ else
+ {
+ if (0 != main_initializeClassPath (portLib, &classPath))
+ {
+ /* This might be a memory leak, but main() will fail anyway */
+ return -1;
+ }
+ if (classPath == NULL || classPath->data[0] == 0)
+ {
+ classPath = strBufferCat (portLib, classPath, ".");
+ if (classPath == NULL)
+ return -1;
+ }
+ }
+
+ classPath = strBufferPrepend (portLib, classPath, "-Djava.class.path=");
+ if (classPath == NULL)
+ return -1;
+ *classPathInd = classPath;
+ options[*vmOptionsCount].optionString = (char *) classPath->data;
+ options[*vmOptionsCount].extraInfo = NULL;
+ *vmOptionsCount = *vmOptionsCount + 1;
+ }
+ return 0;
+}
+
+/* parse arg to determine if it is of the form -Darg=foo, and return foo.
+ * Returns an empty string for args of the form -Darg,
+ * Returns NULL if the argument is not recognized
+ */
+char *
+getDefineArgument (char *arg, char *key)
+{
+ if (arg[0] == '-' && arg[1] == 'D')
+ {
+ int keyLength = strlen (key);
+ if (strncmp (&arg[2], key, keyLength) == 0)
+ {
+ switch (arg[2 + keyLength])
+ {
+ case '=':
+ return &arg[3 + keyLength];
+ case '\0':
+ return "";
+ }
+ }
+ }
+ return NULL;
+}
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile Wed Nov 30 21:29:27 2005
@@ -0,0 +1,34 @@
+# Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Makefile for module 'launcher'
+#
+
+APPVER=4.0
+TARGETOS=WIN95
+_WIN32_IE=0x0500
+SEHMAP = TRUE
+
+!include <win32.mak>
+
+all:
+ $(MAKE) /NOLOGO -f makefile.javae
+ $(MAKE) /NOLOGO -f makefile.javaw
+
+clean:
+ $(MAKE) /NOLOGO -f makefile.javae clean
+ $(MAKE) /NOLOGO -f makefile.javaw clean
+ -del *.obj
+ -del vc70.pdb
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javae
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javae?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javae (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javae Wed Nov 30 21:29:27 2005
@@ -0,0 +1,54 @@
+# Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Makefile for module 'launcher.java'
+#
+
+APPVER=4.0
+TARGETOS=WIN95
+_WIN32_IE=0x0500
+SEHMAP = TRUE
+!include <win32.mak>
+
+EXENAME=..\java.exe# declaration
+
+.c.obj:
+ $(cc) -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 $(cflags) -D_MT -D_DLL -MD -D_WINSOCKAPI_ -DWIN32 -Ogityb1 -Gs -GF -Zm400 -WX -Zi /I..\include $(VMDEBUG) $*.c
+
+.cpp.obj:
+ $(cc) -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 $(cflags) -D_MT -D_DLL -MD -D_WINSOCKAPI_ -DWIN32 -Ogityb1 -Gs -GF -Zm400 -WX -Zi /I..\include $(VMDEBUG) $*.cpp
+
+.asm.obj:
+ ml /c /Cp /W3 /nologo /coff /Zm /Zd /Zi /Gd -DWIN32 $<
+
+.rc.res:
+ rc -I../include $<
+
+BUILDFILES1 = launcher_copyright.obj cmain.obj main.obj strbuf.obj libhlp.obj
+
+VIRTFILES1 = java.res
+
+MDLLIBFILES1 = ..\lib\hyprt.lib ..\lib\hythr.lib
+
+all: $(EXENAME)
+
+$(EXENAME):\
+ $(BUILDFILES1) $(VIRTFILES1) $(MDLLIBFILES1)
+ link /NOLOGO $(conlflags) /debug /opt:icf /opt:ref $(VMLINK) -out:$(EXENAME) -subsystem:console -machine:$(CPU) setargv.obj $(BUILDFILES1) $(VIRTFILES1) $(MDLLIBFILES1) $(MDLLIBFILES2) $(conlibsdll)
+
+clean:
+ -del ..\java.exe
+ -del ..\java.pdb
+ -del java.RES
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javaw
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javaw?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javaw (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/makefile.javaw Wed Nov 30 21:29:27 2005
@@ -0,0 +1,55 @@
+# Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Makefile for module 'launcher.javaw'
+#
+
+APPVER=4.0
+TARGETOS=WIN95
+_WIN32_IE=0x0500
+SEHMAP = TRUE
+!include <win32.mak>
+
+EXENAME=..\javaw.exe# declaration
+
+.c.obj:
+ $(cc) -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 $(cflags) -D_MT -D_DLL -MD -D_WINSOCKAPI_ -DWIN32 -Ogityb1 -Gs -GF -Zm400 -W3 -Zi /I..\include $(VMDEBUG) $*.c
+
+.cpp.obj:
+ $(cc) -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 $(cflags) -D_MT -D_DLL -MD -D_WINSOCKAPI_ -DWIN32 -Ogityb1 -Gs -GF -Zm400 -W3 -Zi /I..\include $(VMDEBUG) $*.cpp
+
+.asm.obj:
+ ml /c /Cp /W3 /nologo /coff /Zm /Zd /Zi /Gd -DWIN32 $<
+
+.rc.res:
+ rc -I..\include $<
+
+BUILDFILES1 = launcher_copyright.obj main.obj winmain.obj strbuf.obj libhlp.obj
+
+VIRTFILES1 = javaw.res
+
+MDLLIBFILES1 = ..\lib\hyprt.lib ..\lib\hythr.lib
+
+all: $(EXENAME)
+
+$(EXENAME):\
+ $(BUILDFILES1) $(VIRTFILES1) $(MDLLIBFILES1)
+ link /NOLOGO $(guilflags) /debug /opt:icf /opt:ref $(VMLINK) -out:$(EXENAME) -subsystem:windows -machine:$(CPU) setargv.obj $(BUILDFILES1) $(VIRTFILES1) $(MDLLIBFILES1) $(MDLLIBFILES2) $(guilibsdll)
+
+clean:
+ -del ..\javaw.exe
+ -del ..\javaw.pdb
+ -del javaw.RES
+
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/strbuf.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/strbuf.c?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/strbuf.c (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/strbuf.c Wed Nov 30 21:29:27 2005
@@ -0,0 +1,96 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string.h>
+
+#include "libhlp.h"
+
+#define MIN_GROWTH 128
+
+HyStringBuffer *
+strBufferCat (struct HyPortLibrary * portLibrary, HyStringBuffer * buffer,
+ const char *string)
+{
+ UDATA len = strlen (string);
+
+ buffer = strBufferEnsure (portLibrary, buffer, len);
+ if (buffer)
+ {
+ strcat (buffer->data, string);
+ buffer->remaining -= len;
+ }
+
+ return buffer;
+}
+
+HyStringBuffer *
+strBufferEnsure (struct HyPortLibrary * portLibrary, HyStringBuffer * buffer,
+ UDATA len)
+{
+
+ if (buffer == NULL)
+ {
+ PORT_ACCESS_FROM_PORT (portLibrary);
+ UDATA newSize = len > MIN_GROWTH ? len : MIN_GROWTH;
+ buffer = hymem_allocate_memory (newSize + 1 + sizeof (UDATA)); /* 1 for null terminator */
+ if (buffer != NULL)
+ {
+ buffer->remaining = newSize;
+ buffer->data[0] = '\0';
+ }
+ return buffer;
+ }
+
+ if (len > buffer->remaining)
+ {
+ PORT_ACCESS_FROM_PORT (portLibrary);
+ UDATA newSize = len > MIN_GROWTH ? len : MIN_GROWTH;
+ HyStringBuffer *new =
+ hymem_allocate_memory (strlen (buffer->data) + newSize +
+ sizeof (UDATA) + 1);
+ if (new)
+ {
+ new->remaining = newSize;
+ strcpy (new->data, buffer->data);
+ }
+ hymem_free_memory (buffer);
+ return new;
+ }
+
+ return buffer;
+}
+
+HyStringBuffer *
+strBufferPrepend (struct HyPortLibrary * portLibrary, HyStringBuffer * buffer,
+ char *string)
+{
+ UDATA len = strlen (string);
+
+ buffer = strBufferEnsure (portLibrary, buffer, len);
+ if (buffer)
+ {
+ memmove (buffer->data + len, buffer->data, strlen (buffer->data) + 1);
+ strncpy (buffer->data, string, len);
+ buffer->remaining -= len;
+ }
+
+ return buffer;
+}
+
+char *
+strBufferData (HyStringBuffer * buffer)
+{
+ return buffer ? buffer->data : NULL;
+}
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/winmain.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/winmain.c?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/winmain.c (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/launcher/winmain.c Wed Nov 30 21:29:27 2005
@@ -0,0 +1,174 @@
+/* Copyright 1991, 2005 The Apache Software Foundation or its licensors, as applicable
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <windows.h>
+#include "jni.h"
+#include "hyport.h"
+//#include "libhlp.h"
+
+/* external prototypes */
+UDATA VMCALL gpProtectedMain PROTOTYPE ((void *arg));
+
+char **getArgvCmdLine
+PROTOTYPE ((HyPortLibrary * portLibrary, LPTSTR buffer, int *finalArgc));
+int WINAPI WinMain
+PROTOTYPE ((HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
+ int nShowCmd));
+void freeArgvCmdLine PROTOTYPE ((HyPortLibrary * portLibrary, char **argv));
+
+struct haCmdlineOptions
+{
+ int argc;
+ char **argv;
+ char **envp;
+ HyPortLibrary *portLibrary;
+};
+
+int WINAPI
+WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
+ int nShowCmd)
+{
+ int argc = 0, rc;
+ HyPortLibrary hyportLibrary;
+ HyPortLibraryVersion portLibraryVersion;
+ struct haCmdlineOptions options;
+ char **argv;
+
+ /* Use portlibrary version which we compiled against, and have allocated space
+ * for on the stack. This version may be different from the one in the linked DLL.
+ */
+
+ HYPORT_SET_VERSION (&portLibraryVersion, HYPORT_CAPABILITY_MASK);
+ rc =
+ hyport_init_library (&hyportLibrary, &portLibraryVersion,
+ sizeof (HyPortLibrary));
+ if (0 != rc)
+ {
+ return -1;
+ }
+
+ argv = getArgvCmdLine (&hyportLibrary, GetCommandLine (), &argc);
+ if (argv)
+ {
+ options.argc = argc;
+ options.argv = argv;
+ options.envp = NULL;
+ options.portLibrary = &hyportLibrary;
+ rc =
+ hyportLibrary.gp_protect (&hyportLibrary, gpProtectedMain, &options);
+ freeArgvCmdLine (&hyportLibrary, argv);
+ hyportLibrary.port_shutdown_library (&hyportLibrary);
+ return rc;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+/*
+ * Takes the command line (1 string) and breaks it into an
+ * argc, argv[] style list.
+ * Understands LFNs and strips quotes off the exe name.
+ * also converts the string to ASCII.
+ */
+char **
+getArgvCmdLine (HyPortLibrary * portLibrary, LPTSTR buffer, int *finalArgc)
+{
+
+#define QUOTE_CHAR 34
+
+ int argc = 0, currentArg, i, asciiLen;
+ char *asciiCmdLine;
+ char **argv;
+ PORT_ACCESS_FROM_PORT (portLibrary);
+
+ asciiCmdLine = buffer;
+
+ /* determine an upper bound on the # of args by counting spaces and tabs */
+ argc = 2;
+ asciiLen = strlen (buffer);
+ for (i = 0; i < asciiLen; i++)
+ {
+ if (asciiCmdLine[i] == ' ' || asciiCmdLine[i] == '\t')
+ argc++;
+ }
+
+ /* allocate the buffer for the args */
+ argv = hymem_allocate_memory (argc * sizeof (char *));
+ if (!argv)
+ return NULL;
+
+ /* now fill in the argv array */
+ currentArg = 0;
+ if (QUOTE_CHAR == *asciiCmdLine)
+ { /* we have a quoted name. */
+ argv[currentArg++] = ++asciiCmdLine; /* move past the quote */
+ while (QUOTE_CHAR != *asciiCmdLine)
+ asciiCmdLine++;
+ if (*asciiCmdLine)
+ *asciiCmdLine++ = '\0'; /* past close quote, slam the close quote and advance */
+ }
+
+ /* Skip whitespace */
+ while (*asciiCmdLine == ' ' || *asciiCmdLine == '\t'
+ || *asciiCmdLine == '\r')
+ asciiCmdLine++;
+
+ /* Split up args */
+ while (*asciiCmdLine)
+ {
+ if (QUOTE_CHAR == *asciiCmdLine)
+ {
+ /* Parse a quoted arg */
+ argv[currentArg++] = ++asciiCmdLine;
+ while (*asciiCmdLine && *asciiCmdLine != QUOTE_CHAR)
+ {
+ asciiCmdLine++;
+ }
+ }
+ else
+ {
+ /* Whitespace separated arg */
+ argv[currentArg++] = asciiCmdLine;
+ while (*asciiCmdLine && *asciiCmdLine != ' '
+ && *asciiCmdLine != '\t' && *asciiCmdLine != '\r')
+ {
+ asciiCmdLine++;
+ }
+ }
+
+ /* Null terminate */
+ if (*asciiCmdLine)
+ *asciiCmdLine++ = '\0';
+
+ /* Skip whitespace */
+ while (*asciiCmdLine && *asciiCmdLine == ' ' || *asciiCmdLine == '\t'
+ || *asciiCmdLine == '\r')
+ asciiCmdLine++;
+ }
+ argv[currentArg] = NULL;
+ *finalArgc = currentArg;
+ return argv;
+}
+
+#undef QUOTE_CHAR
+void
+freeArgvCmdLine (HyPortLibrary * portLibrary, char **argv)
+{
+ PORT_ACCESS_FROM_PORT (portLibrary);
+
+ hymem_free_memory (argv);
+}
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/lib/j9fdlibm.pdb
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/lib/j9fdlibm.pdb?rev=350181&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/native-src/win.IA32/lib/j9fdlibm.pdb
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream