bool GetEntrypointExecutableAbsolutePath(std::string& entrypointExecutable) { bool result = false; entrypointExecutable.clear(); // Get path to the executable for the current process using // platform specific means. #if defined(__LINUX__) || !defined(__APPLE__) // On non-Mac OS, return the symlink that will be resolved by GetAbsolutePath // to fetch the entrypoint EXE absolute path, inclusive of filename. entrypointExecutable.assign(symlinkEntrypointExecutable); result = true; #elif defined(__APPLE__) // On Mac, we ask the OS for the absolute path to the entrypoint executable uint32_t lenActualPath = 0; if (_NSGetExecutablePath(nullptr, &lenActualPath) == -1) { // OSX has placed the actual path length in lenActualPath, // so re-attempt the operation std::string resizedPath(lenActualPath, '\0'); char *pResizedPath = const_cast<char *>(resizedPath.c_str()); if (_NSGetExecutablePath(pResizedPath, &lenActualPath) == 0) { entrypointExecutable.assign(pResizedPath); result = true; } } #endif return result; }
bool GetEntrypointExecutableAbsolutePath(std::string& entrypointExecutable) { bool result = false; entrypointExecutable.clear(); // Get path to the executable for the current process using // platform specific means. #if defined(__linux__) || (defined(__NetBSD__) && !defined(KERN_PROC_PATHNAME)) // On Linux, fetch the entry point EXE absolute path, inclusive of filename. char exe[PATH_MAX]; ssize_t res = readlink(symlinkEntrypointExecutable, exe, PATH_MAX - 1); if (res != -1) { exe[res] = '\0'; entrypointExecutable.assign(exe); result = true; } else { result = false; } #elif defined(__APPLE__) // On Mac, we ask the OS for the absolute path to the entrypoint executable uint32_t lenActualPath = 0; if (_NSGetExecutablePath(nullptr, &lenActualPath) == -1) { // OSX has placed the actual path length in lenActualPath, // so re-attempt the operation std::string resizedPath(lenActualPath, '\0'); char *pResizedPath = const_cast<char *>(resizedPath.c_str()); if (_NSGetExecutablePath(pResizedPath, &lenActualPath) == 0) { entrypointExecutable.assign(pResizedPath); result = true; } } #elif defined(__NetBSD__) && defined(KERN_PROC_PATHNAME) static const int name[] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME, }; char path[MAXPATHLEN]; size_t len; len = sizeof(path); if (sysctl(name, __arraycount(name), path, &len, NULL, 0) != -1) { entrypointExecutable.assign(path); result = true; } else { result = false; } #else // On non-Mac OS, return the symlink that will be resolved by GetAbsolutePath // to fetch the entrypoint EXE absolute path, inclusive of filename. entrypointExecutable.assign(symlinkEntrypointExecutable); result = true; #endif return result; }