diff options
Diffstat (limited to 'features/org.eclipse.equinox.executable.feature/library/eclipseNix.c')
-rw-r--r-- | features/org.eclipse.equinox.executable.feature/library/eclipseNix.c | 234 |
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; +} |