diff options
author | Jov <amutu@amutu.com> | 2017-06-27 13:33:02 +0200 |
---|---|---|
committer | Marcel Hlopko <hlopko@google.com> | 2017-06-27 15:06:16 +0200 |
commit | fa46172bc3b9bd2398a9d79a05fc5cd55f6059ad (patch) | |
tree | 72aca30ab20d5ecf212ba2b0644d55c94dcd15c1 /src/main/cpp/blaze_util_freebsd.cc | |
parent | 0d007ff5c17b17bbfa2bdb0704927c9a31d5d0ac (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
Diffstat (limited to 'src/main/cpp/blaze_util_freebsd.cc')
-rw-r--r-- | src/main/cpp/blaze_util_freebsd.cc | 25 |
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); } |