[PATCH 4/8] libs/wine: use sysctl instead of /proc/curproc/file on FreeBSD
Damjan Jovanovic
damjan.jov at gmail.com
Sat Oct 23 03:16:23 CDT 2021
Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
---
libs/wine/config.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
-------------- next part --------------
diff --git a/libs/wine/config.c b/libs/wine/config.c
index cb42421c168..23c76fda128 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -28,8 +28,12 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
+#ifdef HAVE_SYS_SYSCTL_H
+# include <sys/sysctl.h>
+#endif
#include <unistd.h>
#include <dlfcn.h>
#ifdef HAVE_PWD_H
@@ -56,8 +60,6 @@ static void fatal_error( const char *err, ... ) __attribute__((noreturn,format(
#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
static const char exe_link[] = "/proc/self/exe";
-#elif defined (__FreeBSD__) || defined(__DragonFly__)
-static const char exe_link[] = "/proc/curproc/file";
#else
static const char exe_link[] = "";
#endif
@@ -141,8 +143,18 @@ static char *symlink_dirname( const char *name )
/* return the directory that contains the main exe at run-time */
static char *get_runtime_exedir(void)
{
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+ static int pathname[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
+ size_t dir_size = PATH_MAX;
+ char *dir = malloc( dir_size );
+ if (dir && !sysctl( pathname, sizeof(pathname)/sizeof(pathname[0]), dir, &dir_size, NULL, 0 ))
+ return dir;
+ free( dir );
+ return NULL;
+#else
if (exe_link[0]) return symlink_dirname( exe_link );
return NULL;
+#endif
}
/* return the base directory from argv0 */
More information about the wine-devel
mailing list