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]);
}
|