From 24b26f8bd6a49c855eec417a6585d44c9458e3ec Mon Sep 17 00:00:00 2001 From: Damjan Jovanovic Date: Sat, 23 Oct 2021 10:16:23 +0200 Subject: [PATCH] libs/wine: Use sysctl instead of /proc/curproc/file on FreeBSD. Signed-off-by: Damjan Jovanovic Signed-off-by: Alexandre Julliard --- libs/wine/config.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 #include #include +#include #include #include +#ifdef HAVE_SYS_SYSCTL_H +# include +#endif #include #include #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 */