From e4c7211cd641bc5ca2890097b4cc424acf52f9df Mon Sep 17 00:00:00 2001 From: Samuel Venable Date: Sun, 24 Jul 2022 02:26:33 -0500 Subject: [PATCH] Fix NetBSD executable path to not use procfs (#9085) * Fix NetBSD executable path to not use procfs * Update common.cpp --- src/common.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common.cpp b/src/common.cpp index 83536ceae..284a850ba 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -1858,14 +1858,16 @@ std::string get_executable_path(const char *argv0) { // https://opensource.apple.com/source/adv_cmds/adv_cmds-163/ps/print.c uint32_t buffSize = sizeof buff; if (_NSGetExecutablePath(buff, &buffSize) == 0) return std::string(buff); -#elif defined(__BSD__) && defined(KERN_PROC_PATHNAME) && !defined(__NetBSD__) +#elif defined(__BSD__) && defined(KERN_PROC_PATHNAME) // BSDs do not have /proc by default, (although it can be mounted as procfs via the Linux // compatibility layer). We can use sysctl instead: per sysctl(3), passing in a process ID of -1 // returns the value for the current process. - // - // (this is broken on NetBSD, while /proc works, so we use that) size_t buff_size = sizeof buff; + #if defined(__NetBSD__) + int name[] = {CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_PATHNAME}; + #else int name[] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; + #endif int result = sysctl(name, sizeof(name) / sizeof(int), buff, &buff_size, nullptr, 0); if (result != 0) { wperror(L"sysctl KERN_PROC_PATHNAME");