summaryrefslogtreecommitdiff
path: root/java/jdk16/files/patch-j2se-bin-java_md.c
blob: f8305b53ae468c92def7a505b896b4ffc0f0c036 (plain) (blame)
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
$FreeBSD$

--- ../../j2se/src/solaris/bin/java_md.c	15 Feb 2005 02:06:26 -0000	1.6
+++ ../../j2se/src/solaris/bin/java_md.c	20 Apr 2005 12:08:02 -0000
@@ -906,8 +904,7 @@
     if (execname != NULL)	/* Already determined */
 	return (execname);
 
-/* XXXBSD:  is it right for us ?*/
-#if defined(__sun) || defined(__FreeBSD__)
+#if defined(__sun)
     {
         Dl_info dlinfo;
         if (dladdr((void*)&SetExecname, &dlinfo)) {
@@ -928,12 +925,47 @@
 	    exec_path = strdup(buf);
 	}
     }
+#elif defined(__FreeBSD__)
+    /* Try /proc/curproc/file if exec_path hasn't been found */
+
+    if (exec_path == NULL) {
+	const char* self = "/proc/curproc/file";
+        char buf[PATH_MAX+1];
+        int len = readlink(self, buf, PATH_MAX);
+        if (len >= 0) {
+	    buf[len] = '\0';		/* readlink doesn't nul terminate */
+	    exec_path = strdup(buf);
+	}
+    }
+
+    /*
+     * Try the dladdr(3) method FreeBSD if exec_path hasn't been found.
+     * Requires a recent version of FreeBSD.
+     */
+
+    /*
+    if (exec_path == NULL) {
+        Dl_info dlinfo;
+        if (dladdr((void*)&SetExecname, &dlinfo)) {
+	    char *resolved = (char*)MemAlloc(PATH_MAX+1);
+	    if (resolved != NULL) {
+		exec_path = realpath(dlinfo.dli_fname, resolved);
+		if (exec_path == NULL) {
+		    free(resolved);
+		}
+	    }
+        }
+    }
+    */
+
 #else /* !__sun && !__linux */
     {
         /* Not implemented */
     }
 #endif 
 
+    /* Fall back to examining argv[0] and our path */
+
     if (exec_path == NULL) {
         exec_path = FindExecName(argv[0]);
     }