From a09187454684e6a510d0cbefe6a79f74f539bca5 Mon Sep 17 00:00:00 2001 From: Lukas Werling Date: Sat, 17 Feb 2018 12:41:16 +0100 Subject: [PATCH] Autodetect "/proc/self/exe"-equivalent on FreeBSD (#1999) --- CMakeLists.txt | 11 +++++++++++ config.h.cmake | 3 +++ src/config/C4Config.cpp | 4 ++-- src/platform/PlatformAbstraction.cpp | 4 ++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42faae414..d065ef16a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,6 +299,17 @@ if(UNIX AND NOT APPLE) if(Backward_FOUND) set(HAVE_BACKWARD 1) endif() + + if(NOT DEFINED PROC_SELF_EXE) + macro(FIND_PROC_SELF_EXE path) + if(EXISTS ${path}) + set(PROC_SELF_EXE ${path} CACHE FILEPATH "Path to /proc/self/exe (Linux) or equivalent") + endif() + endmacro() + FIND_PROC_SELF_EXE(/proc/self/exe) # Linux + FIND_PROC_SELF_EXE(/proc/curproc/file) # FreeBSD + FIND_PROC_SELF_EXE(/proc/curproc/exe) # NetBSD + endif() endif() if (WIN32) diff --git a/config.h.cmake b/config.h.cmake index bfbde44dd..02af2cb26 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -118,3 +118,6 @@ /* Include OpenAL extensions (alext.h) for sound modifiers */ #cmakedefine HAVE_ALEXT 1 + +/* Path to /proc/self/exe (Linux) or equivalent */ +#cmakedefine PROC_SELF_EXE "${PROC_SELF_EXE}" diff --git a/src/config/C4Config.cpp b/src/config/C4Config.cpp index 3f6daab20..bc6e0a20c 100644 --- a/src/config/C4Config.cpp +++ b/src/config/C4Config.cpp @@ -443,9 +443,9 @@ void C4ConfigGeneral::DeterminePaths() GetTempPathW(CFG_MaxString,apath); TempPath = StdStrBuf(apath); if (TempPath[0]) TempPath.AppendBackslash(); -#elif defined(__linux__) +#elif defined(PROC_SELF_EXE) ExePath.SetLength(1024); - ssize_t l = readlink("/proc/self/exe", ExePath.getMData(), 1024); + ssize_t l = readlink(PROC_SELF_EXE, ExePath.getMData(), 1024); if (l < -1) { ExePath.Ref("."); diff --git a/src/platform/PlatformAbstraction.cpp b/src/platform/PlatformAbstraction.cpp index 91dd72a06..e77f3cae1 100644 --- a/src/platform/PlatformAbstraction.cpp +++ b/src/platform/PlatformAbstraction.cpp @@ -98,7 +98,7 @@ bool RestartApplication(std::vector parameters) intptr_t iError = (intptr_t)::ShellExecute(nullptr, nullptr, buf, params.GetWideChar(), Config.General.ExePath.GetWideChar(), SW_SHOW); if (iError > 32) success = true; } -#else +#elif defined(PROC_SELF_EXE) pid_t pid; switch (pid = fork()) { @@ -108,7 +108,7 @@ bool RestartApplication(std::vector parameters) std::vector params = {"openclonk"}; params.insert(params.end(), parameters.begin(), parameters.end()); params.push_back(nullptr); - execv("/proc/self/exe", const_cast(params.data())); + execv(PROC_SELF_EXE, const_cast(params.data())); perror("editor launch failed"); exit(1); }