Alexandre Julliard : libwine: Add a helper function to set the dll directory.
Alexandre Julliard
julliard at winehq.org
Mon Jun 26 15:17:52 CDT 2017
Module: wine
Branch: master
Commit: 56b14d637fdd213e0377526c2b98d2f36384332e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=56b14d637fdd213e0377526c2b98d2f36384332e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jun 26 13:37:25 2017 +0200
libwine: Add a helper function to set the dll directory.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
libs/wine/config.c | 50 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 35 insertions(+), 15 deletions(-)
diff --git a/libs/wine/config.c b/libs/wine/config.c
index 129a565..f85910b 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -330,6 +330,16 @@ static int is_valid_bindir( const char *bindir )
return ret;
}
+/* check if dlldir is valid by checking for ntdll */
+static int is_valid_dlldir( const char *dlldir )
+{
+ struct stat st;
+ char *path = build_path( dlldir, "ntdll.dll.so" );
+ int ret = (stat( path, &st ) != -1);
+ free( path );
+ return ret;
+}
+
/* check if basedir is a valid build dir by checking for wineserver and ntdll */
/* helper for running_from_build_dir */
static inline int is_valid_build_dir( char *basedir, int baselen )
@@ -381,6 +391,7 @@ static int set_bindir( char *dir )
if (is_valid_bindir( dir ))
{
bindir = dir;
+ dlldir = build_path( bindir, BIN_TO_DLLDIR );
}
else
{
@@ -390,26 +401,39 @@ static int set_bindir( char *dir )
return bindir || build_dir;
}
+/* try to set the specified directory as dlldir, or set build_dir if it's inside the build directory */
+static int set_dlldir( char *libdir )
+{
+ char *path;
+
+ if (!libdir) return 0;
+
+ path = build_path( libdir, LIB_TO_DLLDIR );
+ if (is_valid_dlldir( path ))
+ {
+ dlldir = path;
+ bindir = build_path( libdir, LIB_TO_BINDIR );
+ }
+ else
+ {
+ build_dir = running_from_build_dir( libdir );
+ free( path );
+ }
+ free( libdir );
+ return dlldir || build_dir;
+}
+
/* initialize the argv0 path */
void wine_init_argv0_path( const char *argv0 )
{
const char *basename;
- char *libdir = NULL;
if (!(basename = strrchr( argv0, '/' ))) basename = argv0;
else basename++;
if (set_bindir( get_runtime_exedir() )) goto done;
-
- libdir = get_runtime_libdir();
- if (libdir && !bindir && !build_dir)
- {
- build_dir = running_from_build_dir( libdir );
- if (!build_dir) bindir = build_path( libdir, LIB_TO_BINDIR );
- }
-
- if (!libdir && !bindir && !build_dir)
- set_bindir( get_runtime_argvdir( argv0 ));
+ if (set_dlldir( get_runtime_libdir() )) goto done;
+ set_bindir( get_runtime_argvdir( argv0 ));
done:
if (build_dir)
@@ -418,13 +442,9 @@ done:
}
else
{
- if (libdir) dlldir = build_path( libdir, LIB_TO_DLLDIR );
- else if (bindir) dlldir = build_path( bindir, BIN_TO_DLLDIR );
-
if (bindir) datadir = build_path( bindir, BIN_TO_DATADIR );
argv0_name = xstrdup( basename );
}
- free( libdir );
}
/* return the configuration directory ($WINEPREFIX or $HOME/.wine) */
More information about the wine-cvs
mailing list