blob: bc57e2250f54d7925262c84443a8aa7108129814 [file] [log] [blame]
/*******************************************************************************
* 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;
}