mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 05:13:58 -07:00
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 <ralph.sennhauser@gmail.com>
This commit is contained in:
parent
349478aa6b
commit
ae6d3bfc4e
1 changed files with 29 additions and 3 deletions
|
|
@ -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 <climits>
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysctl.h>
|
||||
#else
|
||||
#include <stdlib.h>
|
||||
#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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue