Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'features/org.eclipse.equinox.executable.feature/library/eclipseUtil.c')
-rw-r--r--features/org.eclipse.equinox.executable.feature/library/eclipseUtil.c333
1 files changed, 333 insertions, 0 deletions
diff --git a/features/org.eclipse.equinox.executable.feature/library/eclipseUtil.c b/features/org.eclipse.equinox.executable.feature/library/eclipseUtil.c
new file mode 100644
index 000000000..130afb347
--- /dev/null
+++ b/features/org.eclipse.equinox.executable.feature/library/eclipseUtil.c
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 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
+ * Kevin Cornell (Rational Software Corporation)
+ * Martin Oberhuber (Wind River) - [149994] Add --launcher.appendVmargs
+ *******************************************************************************/
+
+/* Eclipse Launcher Utility Methods */
+
+#include "eclipseOS.h"
+#include "eclipseCommon.h"
+#include "eclipseUtil.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#ifdef _WIN32
+#include <direct.h>
+#else
+#include <unistd.h>
+#include <strings.h>
+#endif
+
+#define MAX_LINE_LENGTH 256
+
+/* Is the given VM J9 */
+int isJ9VM( _TCHAR* vm )
+{
+ _TCHAR * ch = NULL, *ch2 = NULL;
+ int res = 0;
+
+ if (vm == NULL)
+ return 0;
+
+ ch = lastDirSeparator( vm );
+ if (isVMLibrary(vm)) {
+ /* a library, call it j9 if the parent dir is j9vm */
+ if(ch == NULL)
+ return 0;
+ ch[0] = 0;
+ ch2 = lastDirSeparator(vm);
+ if(ch2 != NULL) {
+ res = (_tcsicmp(ch2 + 1, _T_ECLIPSE("j9vm")) == 0);
+ }
+ ch[0] = dirSeparator;
+ return res;
+ } else {
+ if (ch == NULL)
+ ch = vm;
+ else
+ ch++;
+ return (_tcsicmp( ch, _T_ECLIPSE("j9") ) == 0);
+ }
+}
+
+int checkProvidedVMType( _TCHAR* vm )
+{
+ _TCHAR* ch = NULL;
+ struct _stat stats;
+
+ if (vm == NULL) return VM_NOTHING;
+
+ if (_tstat(vm, &stats) == 0 && (stats.st_mode & S_IFDIR) != 0) {
+ /* directory */
+ return VM_DIRECTORY;
+ }
+
+ ch = _tcsrchr( vm, _T_ECLIPSE('.') );
+ if(ch == NULL)
+ return VM_OTHER;
+
+#ifdef _WIN32
+ if (_tcsicmp(ch, _T_ECLIPSE(".dll")) == 0)
+#else
+ if ((_tcsicmp(ch, _T_ECLIPSE(".so")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".jnilib")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".dylib")) == 0))
+#endif
+ {
+ return VM_LIBRARY;
+ }
+
+ if (_tcsicmp(ch, _T_ECLIPSE(".ee")) == 0)
+ return VM_EE_PROPS;
+
+ return VM_OTHER;
+}
+
+/*
+ * pathList is a pathSeparator separated list of paths, run each through
+ * checkPath and recombine the results.
+ * New memory is always allocated for the result
+ */
+_TCHAR * checkPathList( _TCHAR* pathList, _TCHAR* programDir, int reverseOrder) {
+ _TCHAR * c1, *c2;
+ _TCHAR * checked, *result;
+ size_t checkedLength = 0, resultLength = 0;
+ size_t bufferLength = _tcslen(pathList);
+
+ result = malloc(bufferLength * sizeof(_TCHAR));
+ c1 = pathList;
+ while (c1 != NULL && *c1 != _T_ECLIPSE('\0'))
+ {
+ c2 = _tcschr(c1, pathSeparator);
+ if (c2 != NULL)
+ *c2 = 0;
+
+ checked = checkPath(c1, programDir, reverseOrder);
+ checkedLength = _tcslen(checked);
+ if (resultLength + checkedLength + 1> bufferLength) {
+ bufferLength += checkedLength + 1;
+ result = realloc(result, bufferLength * sizeof(_TCHAR));
+ }
+
+ if(resultLength > 0) {
+ result[resultLength++] = pathSeparator;
+ result[resultLength] = _T_ECLIPSE('\0');
+ }
+ _tcscpy(result + resultLength, checked);
+ resultLength += checkedLength;
+
+ if(checked != c1)
+ free(checked);
+ if(c2 != NULL)
+ *(c2++) = pathSeparator;
+ c1 = c2;
+ }
+
+ return result;
+}
+
+_TCHAR * concatStrings(_TCHAR**strs) {
+ return concatPaths(strs, 0);
+}
+
+_TCHAR * concatPaths(_TCHAR** strs, _TCHAR separator) {
+ _TCHAR separatorString[] = { separator, 0 };
+ _TCHAR * result;
+ int i = -1;
+ size_t length = 0;
+ /* first count how large a buffer we need */
+ while (strs[++i] != NULL) {
+ length += _tcslen(strs[i]) + (separator != 0 ? 1 : 0);
+ }
+
+ result = malloc((length + 1) * sizeof(_TCHAR));
+ result[0] = 0;
+ i = -1;
+ while (strs[++i] != NULL) {
+ result = _tcscat(result, strs[i]);
+ if (separator != 0)
+ result = _tcscat(result, separatorString);
+ }
+ return result;
+}
+
+/*
+ * Concatenates two NULL-terminated arrays of Strings,
+ * returning a new NULL-terminated array.
+ * The returned array must be freed with the regular free().
+ */
+_TCHAR** concatArgs(_TCHAR** l1, _TCHAR** l2) {
+ _TCHAR** newArray = NULL;
+ int size1 = 0;
+ int size2 = 0;
+
+ if (l1 != NULL)
+ while (l1[size1] != NULL) size1++;
+ if (l2 != NULL)
+ while (l2[size2] != NULL) size2++;
+
+ newArray = (_TCHAR **) malloc((size1 + size2 + 1) * sizeof(_TCHAR *));
+ if (size1 > 0) {
+ memcpy(newArray, l1, size1 * sizeof(_TCHAR *));
+ }
+ if (size2 > 0) {
+ memcpy(newArray + size1, l2, size2 * sizeof(_TCHAR *));
+ }
+ newArray[size1 + size2] = NULL;
+ return newArray;
+}
+
+/*
+ * returns the relative position of arg in the NULL-terminated list of args,
+ * or -1 if args does not contain arg.
+ */
+int indexOf(_TCHAR *arg, _TCHAR **args) {
+ int i = -1;
+ if (arg != NULL && args != NULL) {
+ while (args[++i] != NULL) {
+ if (_tcsicmp(arg, args[i]) == 0) {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+/*
+ * buffer contains a pathSeparator separated list of paths, check
+ * that it contains all the paths given. Each path is expected to be
+ * terminated with a pathSeparator character.
+ */
+int containsPaths(_TCHAR * str, _TCHAR** paths) {
+ _TCHAR * buffer;
+ _TCHAR * c;
+ int i;
+
+ /* terminate the string with a pathSeparator */
+ buffer = malloc((_tcslen(str) + 2) * sizeof(_TCHAR));
+ _stprintf(buffer, _T_ECLIPSE("%s%c"), str, pathSeparator);
+
+ for (i = 0; paths[i] != NULL; i++) {
+ c = _tcsstr(buffer, paths[i]);
+ if ( c == NULL || !(c == buffer || *(c - 1) == pathSeparator))
+ {
+ /* entry not found */
+ free(buffer);
+ return 0;
+ }
+ }
+ free(buffer);
+ return 1;
+}
+
+int isVMLibrary( _TCHAR* vm )
+{
+ _TCHAR *ch = NULL;
+ if (vm == NULL) return 0;
+ ch = _tcsrchr( vm, '.' );
+ if(ch == NULL)
+ return 0;
+#ifdef _WIN32
+ return (_tcsicmp(ch, _T_ECLIPSE(".dll")) == 0);
+#else
+ return (_tcsicmp(ch, _T_ECLIPSE(".so")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".jnilib")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".dylib")) == 0);
+#endif
+}
+
+#ifdef AIX
+
+#include <sys/types.h>
+#include <time.h>
+
+/* Return the JVM version in the format x.x.x
+ */
+char* getVMVersion( char *vmPath )
+{
+ char cmd[MAX_LINE_LENGTH];
+ char lineString[MAX_LINE_LENGTH];
+ char* firstChar;
+ char fileName[MAX_LINE_LENGTH];
+ time_t curTime;
+ FILE* fp;
+ int numChars = 0;
+ char* version = NULL;
+
+ /* Define a unique filename for the java output. */
+ (void) time(&curTime);
+ (void) sprintf(fileName, "/tmp/tmp%ld.txt", curTime);
+
+ /* Write java -version output to a temp file */
+ (void) sprintf(cmd,"%s -version 2> %s", vmPath, fileName);
+ (void) system(cmd);
+
+ fp = fopen(fileName, "r");
+ if (fp != NULL)
+ {
+ /* Read java -version output from a temp file */
+ if (fgets(lineString, MAX_LINE_LENGTH, fp) == NULL)
+ lineString[0] = '\0';
+ fclose(fp);
+ unlink(fileName);
+
+ /* Extract version number */
+ firstChar = (char *) (strchr(lineString, '"') + 1);
+ if (firstChar != NULL)
+ numChars = (int) (strrchr(lineString, '"') - firstChar);
+
+ /* Allocate a buffer and copy the version string into it. */
+ if (numChars > 0)
+ {
+ version = malloc( numChars + 1 );
+ strncpy(version, firstChar, numChars);
+ version[numChars] = '\0';
+ }
+ }
+
+ return version;
+}
+#endif /* AIX */
+
+/* Compare JVM Versions of the form "x.x.x..."
+ *
+ * Returns -1 if ver1 < ver2
+ * Returns 0 if ver1 = ver2
+ * Returns 1 if ver1 > ver2
+ */
+int versionCmp(char *ver1, char *ver2)
+{
+ char* dot1;
+ char* dot2;
+ int num1;
+ int num2;
+
+ dot1 = strchr(ver1, '.');
+ dot2 = strchr(ver2, '.');
+
+ num1 = atoi(ver1);
+ num2 = atoi(ver2);
+
+ if (num1 > num2)
+ return 1;
+
+ if (num1 < num2)
+ return -1;
+
+ if (dot1 && !dot2) /* x.y > x */
+ return 1;
+
+ if (!dot1 && dot2) /* x < x.y */
+ return -1;
+
+ if (!dot1 && !dot2) /* x == x */
+ return 0;
+
+ return versionCmp((char*)(dot1 + 1), (char*)(dot2 + 1) );
+}

Back to the top