From e9b6e87de510ee37de405e1cd4a5c69d4c2ed86f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Fri, 8 May 2026 20:24:40 +0200 Subject: [PATCH] /proc/self/exe alternative for macOS --- .../slsDetectorServer/src/common.c | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 2bfc79bb7..cd7adab63 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -11,6 +11,12 @@ #include // stat #include // uname #include // readlink +#ifdef __APPLE__ +#include // PATH_MAX +#include // _NSGetExecutablePath +#include // uint32_t +#include // realpath +#endif extern int executeCommand(char *command, char *result, enum TLogLevel level); @@ -58,12 +64,33 @@ int getAbsPath(char *buf, size_t bufSize, char *fname) { // get path of current binary char path[bufSize]; memset(path, 0, bufSize); +#ifdef __APPLE__ + // macOS has no /proc; use _NSGetExecutablePath and canonicalize with + // realpath (the path returned may contain ".." or symlinks). + char raw[PATH_MAX]; + uint32_t rawSize = sizeof(raw); + if (_NSGetExecutablePath(raw, &rawSize) != 0) { + LOG(logWARNING, + ("Could not get current binary path for %s (buffer too small)\n", + fname)); + return FAIL; + } + char resolved[PATH_MAX]; + const char *src = realpath(raw, resolved) != NULL ? resolved : raw; + if (strlen(src) >= bufSize) { + LOG(logWARNING, + ("Current binary path too long for buffer (%s)\n", fname)); + return FAIL; + } + strcpy(path, src); +#else ssize_t len = readlink("/proc/self/exe", path, bufSize - 1); if (len < 0) { LOG(logWARNING, ("Could not readlink current binary for %s\n", fname)); return FAIL; } path[len] = '\0'; +#endif // get dir path and attach file name char *dir = dirname(path);