mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-30 01:15:52 +00:00
Use sysctl(3) instead of procfs(5) when we need executable path from PID.
MFH: 2015Q3
This commit is contained in:
parent
fd492a9fe5
commit
cee04cb56e
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=391178
@ -3,6 +3,7 @@
|
||||
|
||||
PORTNAME= openjdk6
|
||||
PORTVERSION= b35
|
||||
PORTREVISION= 1
|
||||
PORTEPOCH= 1
|
||||
CATEGORIES= java devel
|
||||
MASTER_SITES= APACHE/ant/binaries/:ant \
|
||||
|
@ -1936,44 +1936,74 @@
|
||||
}
|
||||
--- hotspot/src/os/bsd/vm/vmError_bsd.cpp
|
||||
+++ hotspot/src/os/bsd/vm/vmError_bsd.cpp
|
||||
@@ -34,6 +34,12 @@
|
||||
@@ -33,30 +33,50 @@
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
|
||||
+#ifdef __FreeBSD__
|
||||
+#define GDB_LAUNCHER "gdb /proc/%d/file %d"
|
||||
+#else
|
||||
+#define GDB_LAUNCHER "gdb /proc/%d/exe %d"
|
||||
+#include <limits.h>
|
||||
+#include <sys/sysctl.h>
|
||||
+#endif
|
||||
+
|
||||
+#define GDB_CMD "gdb"
|
||||
+
|
||||
+static void set_debugger(char *buf, int buflen) {
|
||||
+ int pid = os::current_process_id();
|
||||
+#ifdef __FreeBSD__
|
||||
+ char cmd[PATH_MAX+1];
|
||||
+ int name[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, pid };
|
||||
+ size_t len = sizeof(cmd);
|
||||
+ if (sysctl(name, 4, cmd, &len, NULL, 0) == 0 && len > 0) {
|
||||
+ cmd[len] = '\0';
|
||||
+ jio_snprintf(buf, buflen, "%s %s %d", GDB_CMD, cmd, pid);
|
||||
+ } else
|
||||
+#endif
|
||||
+ jio_snprintf(buf, buflen, "%s /proc/%d/file %d", GDB_CMD, pid, pid);
|
||||
+}
|
||||
|
||||
void VMError::show_message_box(char *buf, int buflen) {
|
||||
bool yes;
|
||||
do {
|
||||
@@ -44,7 +50,7 @@
|
||||
- error_string(buf, buflen);
|
||||
- int len = (int)strlen(buf);
|
||||
+ intx tid = os::current_thread_id();
|
||||
+ set_debugger(buf, buflen);
|
||||
+ int len = (int)strlen(buf) + 1;
|
||||
+ char *msg = &buf[len];
|
||||
+ error_string(msg, buflen - len);
|
||||
+ len += (int)strlen(msg);
|
||||
char *p = &buf[len];
|
||||
|
||||
jio_snprintf(p, buflen - len,
|
||||
"\n\n"
|
||||
"Do you want to debug the problem?\n\n"
|
||||
- "To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " INTX_FORMAT " (" INTPTR_FORMAT ")\n"
|
||||
+ "To debug, run '" GDB_LAUNCHER "'; then switch to thread " INTX_FORMAT " (" INTPTR_FORMAT ")\n"
|
||||
"Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
|
||||
- "Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
|
||||
+ "To debug, run '%s'; then switch to thread " INTX_FORMAT " (" INTPTR_FORMAT ")\n"
|
||||
+ "Enter 'yes' to launch " GDB_CMD " automatically (PATH must include " GDB_CMD ")\n"
|
||||
"Otherwise, press RETURN to abort...",
|
||||
os::current_process_id(), os::current_process_id(),
|
||||
@@ -54,7 +60,7 @@
|
||||
- os::current_process_id(), os::current_process_id(),
|
||||
- os::current_thread_id(), os::current_thread_id());
|
||||
+ buf, tid, tid);
|
||||
|
||||
- yes = os::message_box("Unexpected Error", buf);
|
||||
+ yes = os::message_box("Unexpected Error", msg);
|
||||
|
||||
if (yes) {
|
||||
// yes, user asked VM to launch debugger
|
||||
- jio_snprintf(buf, buflen, "gdb /proc/%d/exe %d",
|
||||
+ jio_snprintf(buf, buflen, GDB_LAUNCHER,
|
||||
os::current_process_id(), os::current_process_id());
|
||||
|
||||
- os::current_process_id(), os::current_process_id());
|
||||
-
|
||||
os::fork_and_exec(buf);
|
||||
yes = false;
|
||||
}
|
||||
--- hotspot/src/os/posix/launcher/java_md.c
|
||||
+++ hotspot/src/os/posix/launcher/java_md.c
|
||||
@@ -35,6 +35,9 @@
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
+#ifndef _SC_PHYS_PAGES
|
||||
+#ifdef __FreeBSD__
|
||||
+#include <sys/sysctl.h>
|
||||
+#endif
|
||||
|
||||
@ -1999,31 +2029,26 @@
|
||||
strcat(new_runpath, ":");
|
||||
strcat(new_runpath, runpath);
|
||||
}
|
||||
@@ -992,9 +995,13 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
-#elif defined(__linux__)
|
||||
+#elif defined(__linux__) || defined(_ALLBSD_SOURCE)
|
||||
{
|
||||
+#ifdef __FreeBSD__
|
||||
+ const char* self = "/proc/curproc/file";
|
||||
+#else
|
||||
const char* self = "/proc/self/exe";
|
||||
+#endif
|
||||
char buf[PATH_MAX+1];
|
||||
int len = readlink(self, buf, PATH_MAX);
|
||||
if (len >= 0) {
|
||||
@@ -1002,7 +1009,7 @@
|
||||
@@ -1002,7 +1005,17 @@
|
||||
exec_path = JLI_StringDup(buf);
|
||||
}
|
||||
}
|
||||
-#else /* !__sun && !__linux */
|
||||
+#else /* !__sun && !__linux && !_ALLBSD_SOURCE */
|
||||
+#elif defined(__FreeBSD__)
|
||||
+ {
|
||||
+ char buf[PATH_MAX+1];
|
||||
+ int name[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
|
||||
+ size_t len = sizeof(buf);
|
||||
+ if (sysctl(name, 4, buf, &len, NULL, 0) == 0 && len > 0) {
|
||||
+ buf[len] = '\0';
|
||||
+ exec_path = JLI_StringDup(buf);
|
||||
+ }
|
||||
+ }
|
||||
+#else /* !__sun && !__linux && !__FreeBSD__ */
|
||||
{
|
||||
/* Not implemented */
|
||||
}
|
||||
@@ -1100,6 +1107,7 @@
|
||||
@@ -1100,6 +1113,7 @@
|
||||
/* Compute physical memory by asking the OS */
|
||||
uint64_t
|
||||
physical_memory(void) {
|
||||
@ -2031,7 +2056,7 @@
|
||||
const uint64_t pages = (uint64_t) sysconf(_SC_PHYS_PAGES);
|
||||
const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE);
|
||||
const uint64_t result = pages * page_size;
|
||||
@@ -1111,6 +1119,28 @@
|
||||
@@ -1111,6 +1125,28 @@
|
||||
" physical memory: " UINT64_FORMAT " (%.3fGB)\n",
|
||||
pages, page_size, result, result / (double) GB);
|
||||
}
|
||||
@ -2060,7 +2085,7 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1271,7 +1301,7 @@
|
||||
@@ -1271,7 +1307,7 @@
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -2069,7 +2094,7 @@
|
||||
|
||||
#ifdef i586
|
||||
/*
|
||||
@@ -1450,7 +1480,7 @@
|
||||
@@ -1450,7 +1486,7 @@
|
||||
|
||||
#endif /* __sun && i586 */
|
||||
|
||||
@ -2078,7 +2103,7 @@
|
||||
|
||||
/* The definition of a server-class machine for linux-i586 */
|
||||
jboolean
|
||||
@@ -1481,7 +1511,7 @@
|
||||
@@ -1481,7 +1517,7 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -2087,7 +2112,7 @@
|
||||
|
||||
#if defined(_ALLBSD_SOURCE) && defined(i586)
|
||||
|
||||
@@ -1508,7 +1538,7 @@
|
||||
@@ -1508,7 +1544,7 @@
|
||||
}
|
||||
}
|
||||
if (_launcher_debug) {
|
||||
@ -2096,7 +2121,7 @@
|
||||
(result == JNI_TRUE ? "true" : "false"));
|
||||
}
|
||||
return result;
|
||||
@@ -1672,7 +1702,7 @@
|
||||
@@ -1672,7 +1708,7 @@
|
||||
while (dp != NULL) {
|
||||
cp = strchr(dp, (int)':');
|
||||
if (cp != NULL)
|
||||
@ -2105,7 +2130,7 @@
|
||||
if ((target = ProcessDir(info, dp)) != NULL)
|
||||
break;
|
||||
dp = cp;
|
||||
@@ -1931,8 +1961,8 @@
|
||||
@@ -1931,8 +1967,8 @@
|
||||
#define MAX_PID_STR_SZ 20
|
||||
|
||||
void SetJavaLauncherPlatformProps() {
|
||||
@ -8559,15 +8584,13 @@
|
||||
#include <dirent.h>
|
||||
#include <dlfcn.h>
|
||||
#include <fcntl.h>
|
||||
@@ -34,17 +35,33 @@
|
||||
@@ -34,17 +35,31 @@
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
+#if defined(_ALLBSD_SOURCE)
|
||||
+#include <sys/time.h>
|
||||
+#endif
|
||||
+#ifndef _SC_PHYS_PAGES
|
||||
+#include <sys/sysctl.h>
|
||||
+#include <sys/time.h>
|
||||
+#endif
|
||||
+
|
||||
#include "manifest_info.h"
|
||||
@ -8592,9 +8615,9 @@
|
||||
+#define LD_LIBRARY_PATH "LD_LIBRARY_PATH"
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* If a processor / os combination has the ability to run binaries of
|
||||
@@ -75,14 +92,31 @@
|
||||
#define JRE_ERROR1 "Error: Could not find Java SE Runtime Environment."
|
||||
#define JRE_ERROR11 "Error: Path length exceeds maximum length (PATH_MAX)"
|
||||
@@ -79,14 +94,31 @@
|
||||
#endif
|
||||
|
||||
/* pointer to environment */
|
||||
@ -8628,7 +8651,7 @@
|
||||
static const char *user_dir = "/java";
|
||||
#else /* Solaris */
|
||||
static const char *system_dir = "/usr/jdk";
|
||||
@@ -404,10 +438,10 @@
|
||||
@@ -408,10 +440,10 @@
|
||||
* If not on Solaris, assume only a single LD_LIBRARY_PATH
|
||||
* variable.
|
||||
*/
|
||||
@ -8641,7 +8664,7 @@
|
||||
/*
|
||||
* On linux, if a binary is running as sgid or suid, glibc sets
|
||||
* LD_LIBRARY_PATH to the empty string for security purposes. (In
|
||||
@@ -423,6 +457,22 @@
|
||||
@@ -427,6 +459,22 @@
|
||||
if((getgid() != getegid()) || (getuid() != geteuid()) ) {
|
||||
return;
|
||||
}
|
||||
@ -8664,7 +8687,7 @@
|
||||
#endif
|
||||
|
||||
/* runpath contains current effective LD_LIBRARY_PATH setting */
|
||||
@@ -431,7 +481,7 @@
|
||||
@@ -435,7 +483,7 @@
|
||||
new_runpath = JLI_MemAlloc( ((runpath!=NULL)?strlen(runpath):0) +
|
||||
2*strlen(jrepath) + 2*strlen(arch) +
|
||||
strlen(jvmpath) + 52);
|
||||
@ -8673,7 +8696,7 @@
|
||||
|
||||
|
||||
/*
|
||||
@@ -446,7 +496,7 @@
|
||||
@@ -450,7 +498,7 @@
|
||||
|
||||
/* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */
|
||||
|
||||
@ -8682,7 +8705,7 @@
|
||||
"%s:"
|
||||
"%s/lib/%s:"
|
||||
"%s/../lib/%s",
|
||||
@@ -721,7 +771,7 @@
|
||||
@@ -725,7 +773,7 @@
|
||||
jboolean
|
||||
GetApplicationHome(char *buf, jint bufsize)
|
||||
{
|
||||
@ -8691,31 +8714,26 @@
|
||||
char *execname = GetExecname();
|
||||
if (execname) {
|
||||
strncpy(buf, execname, bufsize-1);
|
||||
@@ -878,9 +928,13 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
-#elif defined(__linux__)
|
||||
+#elif defined(__linux__) || defined(_ALLBSD_SOURCE)
|
||||
{
|
||||
+#ifdef __FreeBSD__
|
||||
+ const char* self = "/proc/curproc/file";
|
||||
+#else
|
||||
const char* self = "/proc/self/exe";
|
||||
+#endif
|
||||
char buf[PATH_MAX+1];
|
||||
int len = readlink(self, buf, PATH_MAX);
|
||||
if (len >= 0) {
|
||||
@@ -888,7 +942,7 @@
|
||||
@@ -892,7 +940,17 @@
|
||||
exec_path = JLI_StringDup(buf);
|
||||
}
|
||||
}
|
||||
-#else /* !__sun && !__linux */
|
||||
+#else /* !__sun && !__linux && !_ALLBSD_SOURCE */
|
||||
+#elif defined(__FreeBSD__)
|
||||
+ {
|
||||
+ char buf[PATH_MAX+1];
|
||||
+ int name[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
|
||||
+ size_t len = sizeof(buf);
|
||||
+ if (sysctl(name, 4, buf, &len, NULL, 0) == 0 && len > 0) {
|
||||
+ buf[len] = '\0';
|
||||
+ exec_path = JLI_StringDup(buf);
|
||||
+ }
|
||||
+ }
|
||||
+#else /* !__sun && !__linux && !__FreeBSD__ */
|
||||
{
|
||||
/* Not implemented */
|
||||
}
|
||||
@@ -977,6 +1031,7 @@
|
||||
@@ -981,6 +1039,7 @@
|
||||
/* Compute physical memory by asking the OS */
|
||||
uint64_t
|
||||
physical_memory(void) {
|
||||
@ -8723,7 +8741,7 @@
|
||||
const uint64_t pages = (uint64_t) sysconf(_SC_PHYS_PAGES);
|
||||
const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE);
|
||||
const uint64_t result = pages * page_size;
|
||||
@@ -988,6 +1043,28 @@
|
||||
@@ -992,6 +1051,28 @@
|
||||
" physical memory: " UINT64_FORMAT " (%.3fGB)\n",
|
||||
pages, page_size, result, result / (double) GB);
|
||||
}
|
||||
@ -8752,7 +8770,7 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1083,7 +1160,7 @@
|
||||
@@ -1087,7 +1168,7 @@
|
||||
|
||||
#endif /* __sun && i586 */
|
||||
|
||||
@ -8761,7 +8779,7 @@
|
||||
|
||||
/*
|
||||
* A utility method for asking the CPU about itself.
|
||||
@@ -1148,7 +1225,7 @@
|
||||
@@ -1152,7 +1233,7 @@
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -8770,7 +8788,7 @@
|
||||
|
||||
#ifdef i586
|
||||
/*
|
||||
@@ -1360,6 +1437,39 @@
|
||||
@@ -1364,6 +1445,39 @@
|
||||
|
||||
#endif /* __linux__ && i586 */
|
||||
|
||||
@ -8810,7 +8828,7 @@
|
||||
/* Dispatch to the platform-specific definition of "server-class" */
|
||||
jboolean
|
||||
ServerClassMachine(void) {
|
||||
@@ -1374,6 +1484,8 @@
|
||||
@@ -1378,6 +1492,8 @@
|
||||
result = solaris_i586_ServerClassMachine();
|
||||
#elif defined(__linux__) && defined(i586)
|
||||
result = linux_i586_ServerClassMachine();
|
||||
@ -8819,7 +8837,7 @@
|
||||
#else
|
||||
if (_launcher_debug) {
|
||||
printf("ServerClassMachine: returns default value of %s\n",
|
||||
@@ -1514,7 +1626,7 @@
|
||||
@@ -1518,7 +1634,7 @@
|
||||
while (dp != NULL) {
|
||||
cp = strchr(dp, (int)':');
|
||||
if (cp != NULL)
|
||||
@ -8828,7 +8846,7 @@
|
||||
if ((target = ProcessDir(info, dp)) != NULL)
|
||||
break;
|
||||
dp = cp;
|
||||
@@ -1692,9 +1804,29 @@
|
||||
@@ -1696,9 +1812,29 @@
|
||||
return(borrowed_unsetenv(name));
|
||||
}
|
||||
|
||||
@ -8859,7 +8877,7 @@
|
||||
|
||||
static void* hSplashLib = NULL;
|
||||
|
||||
@@ -1722,13 +1854,15 @@
|
||||
@@ -1747,13 +1883,15 @@
|
||||
return "%lld";
|
||||
}
|
||||
|
||||
@ -8877,7 +8895,7 @@
|
||||
pthread_t tid;
|
||||
pthread_attr_t attr;
|
||||
pthread_attr_init(&attr);
|
||||
@@ -1741,7 +1875,7 @@
|
||||
@@ -1766,7 +1904,7 @@
|
||||
if (pthread_create(&tid, &attr, (void *(*)(void*))continuation, (void*)args) == 0) {
|
||||
void * tmp;
|
||||
pthread_join(tid, &tmp);
|
||||
@ -8886,7 +8904,7 @@
|
||||
} else {
|
||||
/*
|
||||
* Continue execution in current thread if for some reason (e.g. out of
|
||||
@@ -1759,25 +1893,23 @@
|
||||
@@ -1784,25 +1922,23 @@
|
||||
if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) {
|
||||
void * tmp;
|
||||
thr_join(tid, NULL, &tmp);
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
PORTNAME= openjdk
|
||||
PORTVERSION= ${JDK_MAJOR_VERSION}.${PORT_MINOR_VERSION}.${PORT_BUILD_NUMBER}
|
||||
PORTREVISION= 1
|
||||
PORTEPOCH= 1
|
||||
CATEGORIES= java devel
|
||||
MASTER_SITES= http://download.java.net/openjdk/jdk${JDK_MAJOR_VERSION}u${JDK_MINOR_VERSION}/promoted/b${JDK_BUILD_NUMBER}/ \
|
||||
|
63
java/openjdk7/files/patch-src-os-bsd-vm-vmError_bsd.cpp
Normal file
63
java/openjdk7/files/patch-src-os-bsd-vm-vmError_bsd.cpp
Normal file
@ -0,0 +1,63 @@
|
||||
--- hotspot/src/os/bsd/vm/vmError_bsd.cpp.orig
|
||||
+++ hotspot/src/os/bsd/vm/vmError_bsd.cpp
|
||||
@@ -33,30 +33,50 @@
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
+#ifdef __FreeBSD__
|
||||
+#include <limits.h>
|
||||
+#include <sys/sysctl.h>
|
||||
+#endif
|
||||
+
|
||||
+#define GDB_CMD "gdb"
|
||||
+
|
||||
+static void set_debugger(char *buf, int buflen) {
|
||||
+ int pid = os::current_process_id();
|
||||
+#ifdef __FreeBSD__
|
||||
+ char cmd[PATH_MAX+1];
|
||||
+ int name[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, pid };
|
||||
+ size_t len = sizeof(cmd);
|
||||
+ if (sysctl(name, 4, cmd, &len, NULL, 0) == 0 && len > 0) {
|
||||
+ cmd[len] = '\0';
|
||||
+ jio_snprintf(buf, buflen, "%s %s %d", GDB_CMD, cmd, pid);
|
||||
+ } else
|
||||
+#endif
|
||||
+ jio_snprintf(buf, buflen, "%s /proc/%d/file %d", GDB_CMD, pid, pid);
|
||||
+}
|
||||
|
||||
void VMError::show_message_box(char *buf, int buflen) {
|
||||
bool yes;
|
||||
do {
|
||||
- error_string(buf, buflen);
|
||||
- int len = (int)strlen(buf);
|
||||
+ intx tid = os::current_thread_id();
|
||||
+ set_debugger(buf, buflen);
|
||||
+ int len = (int)strlen(buf) + 1;
|
||||
+ char *msg = &buf[len];
|
||||
+ error_string(msg, buflen - len);
|
||||
+ len += (int)strlen(msg);
|
||||
char *p = &buf[len];
|
||||
|
||||
jio_snprintf(p, buflen - len,
|
||||
"\n\n"
|
||||
"Do you want to debug the problem?\n\n"
|
||||
- "To debug, run 'gdb /proc/%d/exe %d'; then switch to thread " INTX_FORMAT " (" INTPTR_FORMAT ")\n"
|
||||
- "Enter 'yes' to launch gdb automatically (PATH must include gdb)\n"
|
||||
+ "To debug, run '%s'; then switch to thread " INTX_FORMAT " (" INTPTR_FORMAT ")\n"
|
||||
+ "Enter 'yes' to launch " GDB_CMD " automatically (PATH must include " GDB_CMD ")\n"
|
||||
"Otherwise, press RETURN to abort...",
|
||||
- os::current_process_id(), os::current_process_id(),
|
||||
- os::current_thread_id(), os::current_thread_id());
|
||||
+ buf, tid, tid);
|
||||
|
||||
- yes = os::message_box("Unexpected Error", buf);
|
||||
+ yes = os::message_box("Unexpected Error", msg);
|
||||
|
||||
if (yes) {
|
||||
// yes, user asked VM to launch debugger
|
||||
- jio_snprintf(buf, buflen, "gdb /proc/%d/exe %d",
|
||||
- os::current_process_id(), os::current_process_id());
|
||||
-
|
||||
os::fork_and_exec(buf);
|
||||
yes = false;
|
||||
}
|
58
java/openjdk7/files/patch-src-solaris-bin-java_md_solinux.c
Normal file
58
java/openjdk7/files/patch-src-solaris-bin-java_md_solinux.c
Normal file
@ -0,0 +1,58 @@
|
||||
--- jdk/src/solaris/bin/java_md_solinux.c.orig
|
||||
+++ jdk/src/solaris/bin/java_md_solinux.c
|
||||
@@ -35,6 +35,9 @@
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
+#ifdef __FreeBSD__
|
||||
+#include <sys/sysctl.h>
|
||||
+#endif
|
||||
#include "manifest_info.h"
|
||||
#include "version_comp.h"
|
||||
|
||||
@@ -899,9 +902,9 @@
|
||||
* onwards the filename returned in DL_info structure from dladdr is
|
||||
* an absolute pathname so technically realpath isn't required.
|
||||
* On Linux we read the executable name from /proc/self/exe.
|
||||
- * On *BSD we read the executable name from /proc/curproc/file.
|
||||
+ * On FreeBSD, we get the executable name via sysctl(3).
|
||||
* As a fallback, and for platforms other than Solaris, Linux, and
|
||||
- * *BSD, we use FindExecName to compute the executable name.
|
||||
+ * FreeBSD, we use FindExecName to compute the executable name.
|
||||
*/
|
||||
const char*
|
||||
SetExecname(char **argv)
|
||||
@@ -928,13 +931,9 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
-#elif defined(__linux__) || defined(_ALLBSD_SOURCE)
|
||||
+#elif defined(__linux__)
|
||||
{
|
||||
-#if defined(_ALLBSD_SOURCE)
|
||||
- const char* self = "/proc/curproc/file";
|
||||
-#else
|
||||
const char* self = "/proc/self/exe";
|
||||
-#endif
|
||||
char buf[PATH_MAX+1];
|
||||
int len = readlink(self, buf, PATH_MAX);
|
||||
if (len >= 0) {
|
||||
@@ -942,7 +941,17 @@
|
||||
exec_path = JLI_StringDup(buf);
|
||||
}
|
||||
}
|
||||
-#else /* !__solaris__ && !__linux__ && !_ALLBSD_SOURCE */
|
||||
+#elif defined(__FreeBSD__)
|
||||
+ {
|
||||
+ char buf[PATH_MAX+1];
|
||||
+ int name[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
|
||||
+ size_t len = sizeof(buf);
|
||||
+ if (sysctl(name, 4, buf, &len, NULL, 0) == 0 && len > 0) {
|
||||
+ buf[len] = '\0';
|
||||
+ exec_path = JLI_StringDup(buf);
|
||||
+ }
|
||||
+ }
|
||||
+#else /* !__sun && !__linux && !__FreeBSD__ */
|
||||
{
|
||||
/* Not implemented */
|
||||
}
|
Loading…
Reference in New Issue
Block a user