Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'features/org.eclipse.equinox.executable.feature/library/eclipseNix.c')
-rw-r--r--features/org.eclipse.equinox.executable.feature/library/eclipseNix.c234
1 files changed, 234 insertions, 0 deletions
diff --git a/features/org.eclipse.equinox.executable.feature/library/eclipseNix.c b/features/org.eclipse.equinox.executable.feature/library/eclipseNix.c
new file mode 100644
index 000000000..bc57e2250
--- /dev/null
+++ b/features/org.eclipse.equinox.executable.feature/library/eclipseNix.c
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+/* This file contains code common between GTK & Motif */
+#include "eclipseOS.h"
+#include "eclipseCommon.h"
+#include "eclipseMozilla.h"
+#include "eclipseUtil.h"
+#include "eclipseJNI.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef i386
+#define JAVA_ARCH "i386"
+#elif defined(__ppc__) || defined(__powerpc64__)
+#define JAVA_ARCH "ppc"
+#elif defined(SOLARIS)
+#define JAVA_ARCH "sparc"
+#elif defined(__amd64__) || defined(__x86_64__)
+#define JAVA_ARCH "amd64"
+#else
+#define JAVA_ARCH DEFAULT_OS_ARCH
+#endif
+
+#ifdef AIX
+#define LIB_PATH_VAR _T_ECLIPSE("LIBPATH")
+#else
+#define LIB_PATH_VAR _T_ECLIPSE("LD_LIBRARY_PATH")
+#endif
+
+#define MAX_LOCATION_LENGTH 40 /* none of the jvmLocations strings should be longer than this */
+static const char* jvmLocations [] = { "j9vm", "../jre/bin/j9vm",
+ "classic", "../jre/bin/classic",
+ "../lib/" JAVA_ARCH "/client",
+ "../lib/" JAVA_ARCH "/server",
+ "../lib/" JAVA_ARCH "/jrockit",
+ "../jre/lib/" JAVA_ARCH "/client",
+ "../jre/lib/" JAVA_ARCH "/server",
+ "../jre/lib/" JAVA_ARCH "/jrockit",
+ "../lib/jvm/jre/lib/" JAVA_ARCH "/client",
+ NULL };
+
+static void adjustLibraryPath( char * vmLibrary );
+static char * findLib(char * command);
+#ifdef NETSCAPE_FIX
+extern void fixEnvForNetscape();
+#endif /* NETSCAPE_FIX */
+
+char * findVMLibrary( char* command ) {
+ char * lib = findLib(command);
+ if( lib != NULL ) {
+ adjustLibraryPath(lib);
+ }
+ return lib;
+}
+
+static char * findLib(char * command) {
+ int i;
+ int pathLength;
+ struct stat stats;
+ char * path; /* path to resulting jvm shared library */
+ char * location; /* points to begining of jvmLocations section of path */
+
+ if (command != NULL) {
+ /*check first to see if command already points to the library */
+ if (isVMLibrary(command)) {
+ if (stat( command, &stats ) == 0 && (stats.st_mode & S_IFREG) != 0)
+ { /* found it */
+ return strdup(command);
+ }
+ return NULL;
+ }
+
+ location = strrchr( command, dirSeparator ) + 1;
+ pathLength = location - command;
+ path = malloc((pathLength + MAX_LOCATION_LENGTH + 1 + strlen(vmLibrary) + 1) * sizeof(char));
+ strncpy(path, command, pathLength);
+ location = &path[pathLength];
+
+ /*
+ * We are trying base/jvmLocations[*]/vmLibrary
+ * where base is the directory containing the given java command, normally jre/bin
+ */
+ i = -1;
+ while(jvmLocations[++i] != NULL) {
+ sprintf(location, "%s%c%s", jvmLocations[i], dirSeparator, vmLibrary);
+ if (stat( path, &stats ) == 0 && (stats.st_mode & S_IFREG) != 0)
+ { /* found it */
+ return path;
+ }
+ }
+ }
+ return NULL;
+}
+
+/* adjust the LD_LIBRARY_PATH for the vmLibrary */
+static void adjustLibraryPath( char * vmLibrary ) {
+ char * c;
+ char * ldPath;
+ char * newPath;
+ int i;
+ int numPaths = 0;
+ int length = 0;
+ int needAdjust = 0;
+
+ char ** paths = NULL;
+#ifdef MOZILLA_FIX
+ fixEnvForMozilla();
+#endif /* MOZILLA_FIX */
+#ifdef NETSCAPE_FIX
+ fixEnvForNetscape();
+#endif /* NETSCAPE_FIX */
+
+ paths = getVMLibrarySearchPath(vmLibrary);
+
+ ldPath = (char*)getenv(LIB_PATH_VAR);
+ if (!ldPath) {
+ ldPath = _T_ECLIPSE("");
+ needAdjust = 1;
+ } else {
+ needAdjust = !containsPaths(ldPath, paths);
+ }
+ if (!needAdjust) {
+ for (i = 0; paths[i] != NULL; i++)
+ free(paths[i]);
+ free(paths);
+ return;
+ }
+
+ /* set the value for LD_LIBRARY_PATH */
+ length = strlen(ldPath);
+ c = concatStrings(paths);
+ newPath = malloc((_tcslen(c) + length + 1) * sizeof(_TCHAR));
+ _stprintf(newPath, _T_ECLIPSE("%s%s"), c, ldPath);
+
+ setenv( LIB_PATH_VAR, newPath, 1);
+ free(newPath);
+ free(c);
+
+ for (i = 0; i < numPaths; i++)
+ free(paths[i]);
+ free(paths);
+
+ /* now we must restart for this to take affect */
+ restartLauncher(initialArgv[0], initialArgv);
+}
+
+void restartLauncher( char* program, char* args[] )
+{
+ /* just restart in-place */
+ execvp( program != NULL ? program : args[0], args);
+}
+
+void processVMArgs(_TCHAR **vmargs[] ) {
+ /* nothing yet */
+}
+
+JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], _TCHAR* jarFile )
+{
+ return startJavaJNI(libPath, vmArgs, progArgs, jarFile);
+}
+
+int isSunVM( _TCHAR * javaVM, _TCHAR * jniLib ) {
+ int descriptors[2];
+ int result = 0;
+ int pid = -1;
+
+ if (javaVM == NULL)
+ return 0;
+
+ /* create pipe, [0] is read end, [1] is write end */
+ if (pipe(descriptors) != 0)
+ return 0; /* error */
+
+ pid = fork();
+ if (pid == 0 ) {
+ /* child, connect stdout & stderr to write end of the pipe*/
+ dup2(descriptors[1], STDERR_FILENO);
+ dup2(descriptors[1], STDOUT_FILENO);
+
+ /* close descriptors */
+ close(descriptors[0]);
+ close(descriptors[1]);
+
+ {
+ /* exec java -version */
+ _TCHAR *args [] = { javaVM, _T_ECLIPSE("-version"), NULL };
+ execv(args[0], args);
+ /* if we make it here, there was a problem with exec, just exit */
+ exit(0);
+ }
+ } else if (pid > 0){
+ /* parent */
+ FILE * stream = NULL;
+ int status = 0;
+ close(descriptors[1]);
+ stream = fdopen( descriptors[0], "r");
+ if (stream != NULL) {
+ _TCHAR buffer[256];
+ while ( fgets(buffer, 256, stream) != NULL) {
+ if (_tcsstr(buffer, _T_ECLIPSE("Java HotSpot(TM)")) || _tcsstr(buffer, _T_ECLIPSE("OpenJDK"))) {
+ result = 1;
+ break;
+ }
+ if (_tcsstr(buffer, _T_ECLIPSE("IBM")) != NULL) {
+ result = 0;
+ break;
+ }
+ }
+ fclose(stream);
+ close(descriptors[0]);
+ }
+ waitpid(pid, &status, 0);
+ } else {
+ /* failed to fork */
+ close(descriptors[0]);
+ close(descriptors[1]);
+ }
+ return result;
+}

Back to the top