aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jov <amutu@amutu.com>2017-06-27 13:33:02 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-06-27 15:06:16 +0200
commitfa46172bc3b9bd2398a9d79a05fc5cd55f6059ad (patch)
tree72aca30ab20d5ecf212ba2b0644d55c94dcd15c1
parent0d007ff5c17b17bbfa2bdb0704927c9a31d5d0ac (diff)
use procstat_getpathname to get self path
Use procstat_getpathname instead of /proc/curproc/file to get self path, as /proc do not always exists, and need root privilege to mount. procstat_getpathname is preferred on FreeBSD. Closes #3179. PiperOrigin-RevId: 160260464
-rw-r--r--src/main/cpp/blaze_util_freebsd.cc25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/main/cpp/blaze_util_freebsd.cc b/src/main/cpp/blaze_util_freebsd.cc
index 20a6eb06d6..491fcbb07b 100644
--- a/src/main/cpp/blaze_util_freebsd.cc
+++ b/src/main/cpp/blaze_util_freebsd.cc
@@ -73,16 +73,23 @@ void WarnFilesystemType(const string &output_base) {
string GetSelfPath() {
char buffer[PATH_MAX] = {};
- ssize_t bytes = readlink("/proc/curproc/file", buffer, sizeof(buffer));
- if (bytes == sizeof(buffer)) {
- // symlink contents truncated
- bytes = -1;
- errno = ENAMETOOLONG;
- }
- if (bytes == -1) {
- pdie(blaze_exit_code::INTERNAL_ERROR, "error reading /proc/curproc/file");
+ auto pid = getpid();
+ if (kill(pid, 0) < 0) return "";
+ auto procstat = procstat_open_sysctl();
+ unsigned int n;
+ auto p = procstat_getprocs(procstat, KERN_PROC_PID, pid, &n);
+ if (p) {
+ if (n != 1) {
+ pdie(blaze_exit_code::INTERNAL_ERROR,
+ "expected exactly one process from procstat_getprocs, got %d", n);
+ }
+ auto r = procstat_getpathname(procstat, p, buffer, PATH_MAX);
+ if (r != 0) {
+ pdie(blaze_exit_code::INTERNAL_ERROR, "error procstat_getpathname");
+ }
+ procstat_freeprocs(procstat, p);
}
- buffer[bytes] = '\0'; // readlink does not NUL-terminate
+ procstat_close(procstat);
return string(buffer);
}