aboutsummaryrefslogtreecommitdiff
path: root/src/pdj-linux.c
blob: 63bb015c0f11a1a7754802fb8757a0721e3f97fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dlfcn.h>
#include "pdj.h"

int getuglylibpath(char *path) {
    char buffer[BUFFER_SIZE];
    FILE *f;

    sprintf(buffer, "/proc/%d/maps", getpid());
    f = fopen(buffer, "r");
    if ( f == NULL ) {
        perror("pdj: unable to map :");
        strcpy(path, ".");
        return 1;
    }

    while(!feof(f)) {
        fgets(buffer, BUFFER_SIZE-1, f);
        if ( strstr(buffer, "pdj.pd_linux") != NULL ) {
            buffer[strlen(buffer) - 14] = 0;
            strcpy(path, buffer+49);
            fclose(f);
            return 0;
        }
    }

    /* not found, check in the current dir :( */
    post("pdj: humm... pdj path library not found, setting current path");
    strcpy(path, ".");
    fclose(f);
    return 1;
}


JNI_CreateJavaVM_func *linkjvm(char *vm_type) {
	JNI_CreateJavaVM_func *func;
	char work[BUFFER_SIZE];
	char *javahome = pdj_getProperty("pdj.JAVA_HOME");
	void *libVM;
	
	if ( javahome == NULL ) {
		javahome = getenv("JAVA_HOME");
	} else {
		sprintf(work, "%s/jre/lib/i386/%s/libjvm.so", javahome, vm_type);
		libVM = dlopen(work, RTLD_LAZY);
		
		if ( libVM == NULL ) {
			post("pdj: unable to use the JVM specified at pdj.JAVA_HOME");
			javahome = getenv("JAVA_HOME");		
		}
	}
	
	if ( javahome == NULL ) {
		post("pdj: using JVM from the LD_LIBRARY_PATH");
		libVM = dlopen("libjava.so", RTLD_LAZY);	
	} else {
		post("pdj: using JVM %s", javahome);
		/* using LD_LIBRARY_PATH + putenv doesn't work, load std jvm libs 
		 * with absolute path. order is important.
		 */	
		sprintf(work, "%s/jre/lib/i386/%s/libjvm.so", javahome, vm_type);
		dlopen(work, RTLD_LAZY);
				
		sprintf(work, "%s/jre/lib/i386/libverify.so", javahome);
		dlopen(work, RTLD_LAZY);
			
		sprintf(work, "%s/jre/lib/i386/libjava.so", javahome);
		dlopen(work, RTLD_LAZY);
		
		sprintf(work, "%s/jre/lib/i386/libmlib_image.so", javahome);
		dlopen(work, RTLD_LAZY);

		/* ELF should support dynamic LD_LIBRARY_PATH :( :( :( */
		sprintf(work, "%s/jre/lib/i386/libjava.so", javahome);
		libVM = dlopen(work, RTLD_LAZY);		
	}		
	
	if ( libVM == 0 ) {
		error("pdj: %s", dlerror());
		return NULL;	
	}
	
	func = dlsym(libVM, "JNI_CreateJavaVM");
	if ( func == 0 ) {
		error("pdj: %s", dlerror());
		return NULL;
	}
	return func;
}