blob: 88a8c7b11f43cb436a16ea34c1e75f36fafba4b2 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "hyport.h"
#include "libhlp.h"
I_32
main_appendToClassPath (HyPortLibrary * portLib, U_16 sep,
HyStringBuffer ** classPath, char *toAppend)
{
/* append a separator, first */
if (*classPath && (*classPath)->data[strlen ((char *)((*classPath)->data))] != sep)
{
char separator[2];
separator[0] = (char) sep;
separator[1] = '\0';
*classPath = strBufferCat (portLib, *classPath, separator);
if (*classPath == NULL)
return -1;
}
*classPath = strBufferCat (portLib, *classPath, toAppend);
if (*classPath == NULL)
return -1;
return 0;
}
/* Allocates and retrieves initial value of the classPath. */
I_32
main_initializeClassPath (HyPortLibrary * portLib,
HyStringBuffer ** classPath)
{
PORT_ACCESS_FROM_PORT (portLib);
I_32 rc;
char *envvars = "CLASSPATH\0classpath\0";
char *envvar;
for (envvar = envvars; *envvar; envvar += strlen (envvar) + 1)
{
rc = hysysinfo_get_env (envvar, NULL, 0);
if (rc > 0)
{
*classPath = strBufferEnsure (portLib, *classPath, rc);
if (*classPath == NULL)
return -1;
hysysinfo_get_env (envvar,
(char *)((*classPath)->data) + strlen ((char *)((*classPath)->data)),
(U_32)rc);
(*classPath)->remaining -= rc;
break;
}
}
return 0;
}
IDATA
main_initializeJavaHome (HyPortLibrary * portLib,
HyStringBuffer ** finalJavaHome, int argc,
char **argv)
{
char *javaHome = NULL;
char *javaHomeModifiablePart = NULL;
char *p;
IDATA retval = -1;
PORT_ACCESS_FROM_PORT (portLib);
if ((argc < 1) || !argv)
return -1;
retval = hysysinfo_get_executable_name (argv[0], &javaHome);
if (retval)
{
/* guess. How about ".."? */
*finalJavaHome = strBufferCat (portLib, *finalJavaHome, "..");
return 0;
}
javaHomeModifiablePart = javaHome;
#if defined(WIN32)
/* Make sure we don't modify a drive specifier in a pathname. */
if ((strlen (javaHome) > 2) && (javaHome[1] == ':'))
{
javaHomeModifiablePart = javaHome + 2;
if (javaHome[2] == DIR_SEPARATOR)
javaHomeModifiablePart++;
}
#endif
#if defined(WIN32)
/* Make sure we don't modify the root of a UNC pathname. */
if ((strlen (javaHome) > 2) && (javaHome[0] == DIR_SEPARATOR)
&& (javaHome[1] == DIR_SEPARATOR))
{
javaHomeModifiablePart = javaHome + 2;
/* skip over the machine name */
while (*javaHomeModifiablePart
&& (*javaHomeModifiablePart != DIR_SEPARATOR))
{
javaHomeModifiablePart++;
}
if (*javaHomeModifiablePart)
javaHomeModifiablePart++;
/* skip over the share name */
while (*javaHomeModifiablePart
&& (*javaHomeModifiablePart != DIR_SEPARATOR))
{
javaHomeModifiablePart++;
}
}
#endif
if ((javaHomeModifiablePart == javaHome) && javaHome[0] == DIR_SEPARATOR)
{
/* make sure we don't modify a root slash. */
javaHomeModifiablePart++;
}
/* Note: if sysinfo_get_executable_name claims we were invoked from a root directory, */
/* then this code will return that root directory for java.home also. */
p = strrchr (javaHomeModifiablePart, DIR_SEPARATOR);
if (!p)
{
javaHomeModifiablePart[0] = '\0'; /* chop off whole thing! */
}
else
{
p[0] = '\0'; /* chop off trailing slash and executable name. */
p = strrchr (javaHomeModifiablePart, DIR_SEPARATOR);
if (!p)
{
javaHomeModifiablePart[0] = '\0'; /* chop off the rest */
}
else
{
p[0] = '\0'; /* chop off trailing slash and deepest subdirectory. */
}
}
*finalJavaHome = strBufferCat (portLib, *finalJavaHome, javaHome);
hymem_free_memory (javaHome);
return 0;
}
IDATA
main_initializeJavaLibraryPath (HyPortLibrary * portLib,
HyStringBuffer ** finalJavaLibraryPath,
char *argv0)
{
HyStringBuffer *javaLibraryPath = NULL;
char *exeName = NULL;
IDATA rc = -1;
char *p;
char *envResult;
int envSize;
#define ENV_BUFFER_SIZE 80
char envBuffer[ENV_BUFFER_SIZE];
char sep[2];
PORT_ACCESS_FROM_PORT (portLib);
sep[0] = (char) hysysinfo_get_classpathSeparator ();
sep[1] = '\0';
if (hysysinfo_get_executable_name (argv0, &exeName))
{
goto done;
}
p = strrchr (exeName, DIR_SEPARATOR);
if (p)
{
p[1] = '\0';
}
else
{
hymem_free_memory (exeName);
exeName = NULL;
}
envSize = hysysinfo_get_env (LIBPATH_ENV_VAR, NULL, 0);
if (envSize > 0)
{
if (envSize >= ENV_BUFFER_SIZE)
{
envResult = hymem_allocate_memory (envSize + 1);
if (!envResult)
goto done;
hysysinfo_get_env (LIBPATH_ENV_VAR, envResult, envSize);
}
else
{
envSize = -1; /* make it -1 so we don't free the buffer */
hysysinfo_get_env (LIBPATH_ENV_VAR, envBuffer, ENV_BUFFER_SIZE);
envResult = envBuffer;
}
}
else
{
envResult = NULL;
}
/* Add one to each length to account for the separator character. Add 2 at the end for the "." and NULL terminator */
if (exeName)
{
javaLibraryPath = strBufferCat (portLib, javaLibraryPath, exeName);
javaLibraryPath = strBufferCat (portLib, javaLibraryPath, sep);
}
javaLibraryPath = strBufferCat (portLib, javaLibraryPath, ".");
if (envResult)
{
javaLibraryPath = strBufferCat (portLib, javaLibraryPath, sep);
javaLibraryPath = strBufferCat (portLib, javaLibraryPath, envResult);
if (envSize != -1)
{
hymem_free_memory (envResult);
}
}
rc = 0;
done:
if (exeName)
{
hymem_free_memory (exeName);
}
*finalJavaLibraryPath = javaLibraryPath;
return rc;
}
IDATA
convertString (JNIEnv * env, HyPortLibrary * hyportLibrary,
jclass stringClass, jmethodID stringMid, char *chars,
jstring * str)
{
UDATA strLength;
jarray bytearray;
jstring string;
strLength = strlen (chars);
bytearray = (*env)->NewByteArray (env, strLength);
if (((*env)->ExceptionCheck (env)))
return 1;
(*env)->SetByteArrayRegion (env, bytearray, (UDATA) 0, strLength, (jbyte*)chars);
string =
(*env)->NewObject (env, stringClass, stringMid, bytearray, (UDATA) 0,
strLength);
if (!string)
return 2;
(*env)->DeleteLocalRef (env, bytearray);
*str = string;
return 0;
}