From ae6d3bfc4e3ac9e74d562689c11c22a87c07c0af Mon Sep 17 00:00:00 2001 From: Ralph Sennhauser Date: Sat, 20 Dec 2025 14:04:35 +0100 Subject: [PATCH] Implement BSD specific sys_ExecutablePathname This is more reliable than argv[0] which is effectively used via unix_ExecutablePathname. Also drop the fallback as it effectively is the same as the generic fallback and blocks making cxxtest optional. On FreeBSD the procfs is not mounted by default, so use a syscall instead. Refs: #8618 Signed-off-by: Ralph Sennhauser --- source/lib/sysdep/os/bsd/bsd.cpp | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/source/lib/sysdep/os/bsd/bsd.cpp b/source/lib/sysdep/os/bsd/bsd.cpp index 5f8db1886f..3ffec55c38 100644 --- a/source/lib/sysdep/os/bsd/bsd.cpp +++ b/source/lib/sysdep/os/bsd/bsd.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2014 Wildfire Games. +/* Copyright (C) 2026 Wildfire Games. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the @@ -23,9 +23,35 @@ #include "precompiled.h" #include "lib/sysdep/sysdep.h" -#include "lib/sysdep/os/unix/unix_executable_pathname.h" +#include + +#if defined(__FreeBSD__) +#include +#include +#else +#include +#endif + +/** + * Get the path to the executable + * + * In FreeBSD the procfs isn't available by default so use a system call instead. + */ OsPath sys_ExecutablePathname() { - return unix_ExecutablePathname(); + char pathBuffer[PATH_MAX]; + +#if defined(__FreeBSD__) + int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + size_t length = sizeof(pathBuffer); + int error = sysctl(mib, 4, pathBuffer, &length, nullptr, 0); + if (error < 0 || length <= 1) + return {}; +#else + if (realpath("/proc/curproc/file", pathBuffer) == nullptr) + return {}; +#endif + + return pathBuffer; }