error:
fprintf(stderr, "Error: failed %s, because %s\n", jvmpath, dlerror());
return JNI_FALSE;
}
/*
* If app is "/foo/bin/javac", or "/foo/bin/sparcv9/javac" then put
* "/foo" into buf.
*/
jboolean
GetApplicationHome(char *buf, jint bufsize)
{
#ifdef __linux__
char *execname = GetExecname();
if (execname) {
strncpy(buf, execname, bufsize-1);
buf[bufsize-1] = '\0';
} else {
return JNI_FALSE;
}
#else
Dl_info dlinfo;
dladdr((void *)GetApplicationHome, &dlinfo);
if (realpath(dlinfo.dli_fname, buf) == NULL) {
fprintf(stderr, "Error: realpath(`%s') failed.\n", dlinfo.dli_fname);
return JNI_FALSE;
}
#endif
if (strrchr(buf, '/') == 0) {
buf[0] = '\0';
return JNI_FALSE;
}
*(strrchr(buf, '/')) = '\0'; /* executable file */
if (strlen(buf) < 4 || strrchr(buf, '/') == 0) {
buf[0] = '\0';
return JNI_FALSE;
}
if (strcmp("/bin", buf + strlen(buf) - 4) != 0)
*(strrchr(buf, '/')) = '\0'; /* sparcv9 or amd64 */
if (strlen(buf) < 4 || strcmp("/bin", buf + strlen(buf) - 4) != 0) {
buf[0] = '\0';
return JNI_FALSE;
}
*(strrchr(buf, '/')) = '\0'; /* bin */
return JNI_TRUE;
}
/*
* Return true if the named program exists
*/
static int
ProgramExists(char *name)
{
struct stat sb;
if (stat(name, &sb) != 0) return 0;
if (S_ISDIR(sb.st_mode)) return 0;
return (sb.st_mode & S_IEXEC) != 0;
}
/*
* Find a command in a directory, returning the path.
*/
static char *
Resolve(char *indir, char *cmd)
{
char name[PATH_MAX + 2], *real;
if ((strlen(indir) + strlen(cmd) + 1) > PATH_MAX) return 0;
sprintf(name, "%s%c%s", indir, FILE_SEPARATOR, cmd);
if (!ProgramExists(name)) return 0;
real = JLI_MemAlloc(PATH_MAX + 2);
if (!realpath(name, real))
strcpy(real, name);
return real;
}
/*
* Find a path for the executable
*/
static char *
FindExecName(char *program)
{
char cwdbuf[PATH_MAX+2];
char *path;
char *tmp_path;
char *f;
char *result = NULL;
/* absolute path? */
if (*program == FILE_SEPARATOR ||
(FILE_SEPARATOR=='\\' && strrchr(program, ':')))
return Resolve("", program+1);
/* relative path? */
=8= |