mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
openbsd: poor man implementation for getting executable path
it tries to get executable path from argv[0]. it is unreliable and unsecure, but should be fine enough for the considered use-case. it still doesn't address all possible cases.
This commit is contained in:
+30
-3
@@ -1,4 +1,4 @@
|
|||||||
#if defined(GB_SYSTEM_FREEBSD)
|
#if defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD)
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -734,9 +734,36 @@ String internal_odin_root_dir(void) {
|
|||||||
len = readlink("/proc/curproc/exe", &path_buf[0], path_buf.count);
|
len = readlink("/proc/curproc/exe", &path_buf[0], path_buf.count);
|
||||||
#elif defined(GB_SYSTEM_DRAGONFLYBSD)
|
#elif defined(GB_SYSTEM_DRAGONFLYBSD)
|
||||||
len = readlink("/proc/curproc/file", &path_buf[0], path_buf.count);
|
len = readlink("/proc/curproc/file", &path_buf[0], path_buf.count);
|
||||||
#else
|
#elif defined(GB_SYSTEM_LINUX)
|
||||||
// XXX OpenBSD
|
|
||||||
len = readlink("/proc/self/exe", &path_buf[0], path_buf.count);
|
len = readlink("/proc/self/exe", &path_buf[0], path_buf.count);
|
||||||
|
#elif defined(GB_SYSTEM_OPENBSD)
|
||||||
|
int error;
|
||||||
|
int mib[] = {
|
||||||
|
CTL_KERN,
|
||||||
|
KERN_PROC_ARGS,
|
||||||
|
getpid(),
|
||||||
|
KERN_PROC_ARGV,
|
||||||
|
};
|
||||||
|
// get argv size
|
||||||
|
error = sysctl(mib, 4, NULL, (size_t *) &len, NULL, 0);
|
||||||
|
if (error == -1) {
|
||||||
|
// sysctl error
|
||||||
|
return make_string(nullptr, 0);
|
||||||
|
}
|
||||||
|
// get argv
|
||||||
|
char **argv = (char **)gb_malloc(len);
|
||||||
|
error = sysctl(mib, 4, argv, (size_t *) &len, NULL, 0);
|
||||||
|
if (error == -1) {
|
||||||
|
// sysctl error
|
||||||
|
gb_mfree(argv);
|
||||||
|
return make_string(nullptr, 0);
|
||||||
|
}
|
||||||
|
// copy argv[0] to path_buf
|
||||||
|
len = gb_strlen(argv[0]);
|
||||||
|
if(len < path_buf.count) {
|
||||||
|
gb_memmove(&path_buf[0], argv[0], len);
|
||||||
|
}
|
||||||
|
gb_mfree(argv);
|
||||||
#endif
|
#endif
|
||||||
if(len == 0 || len == -1) {
|
if(len == 0 || len == -1) {
|
||||||
return make_string(nullptr, 0);
|
return make_string(nullptr, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user