aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
authorArtemis Tosini <me@artem.ist>2024-07-23 02:26:41 +0000
committerArtemis Tosini <me@artem.ist>2024-07-24 01:28:03 +0000
commit3b96b51cf493353c59fede5d4c9a6af4265c0d56 (patch)
treef88a276507b0da7434402d2274a76b60c1de7a08 /src/libutil
parent53f3e39815c3357c6465963359e94a6318b54af7 (diff)
libutil: Support getSelfExe on FreeBSD
getSelfExe is used in a few places re-execute nix. Current code in this file uses ifdefs to support several platforms, just keep doing that Change-Id: Iecc2ada0101aea0c30524e3a1218594f919d74bf
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/current-process.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/libutil/current-process.cc b/src/libutil/current-process.cc
index 3c037c33f..33cda211b 100644
--- a/src/libutil/current-process.cc
+++ b/src/libutil/current-process.cc
@@ -15,6 +15,11 @@
# include <sys/resource.h>
#endif
+#if __FreeBSD__
+# include <sys/param.h>
+# include <sys/sysctl.h>
+#endif
+
#include <sys/mount.h>
#include <cgroup.hh>
@@ -102,6 +107,24 @@ std::optional<Path> getSelfExe()
return buf;
else
return std::nullopt;
+ #elif __FreeBSD__
+ int sysctlName[] = {
+ CTL_KERN,
+ KERN_PROC,
+ KERN_PROC_PATHNAME,
+ -1,
+ };
+ size_t pathLen = 0;
+ if (sysctl(sysctlName, sizeof(sysctlName) / sizeof(sysctlName[0]), nullptr, &pathLen, nullptr, 0) < 0) {
+ return std::nullopt;
+ }
+
+ std::vector<char> path(pathLen);
+ if (sysctl(sysctlName, sizeof(sysctlName) / sizeof(sysctlName[0]), path.data(), &pathLen, nullptr, 0) < 0) {
+ return std::nullopt;
+ }
+
+ return Path(path.begin(), path.end());
#else
return std::nullopt;
#endif