/******************************************************************************* * 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 #include #include #include #include #include #include #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; }