Alexandre Julliard : libwine: Use the argv[0] directory as bin directory only if all other methods fail.
Alexandre Julliard
julliard at winehq.org
Mon Sep 16 16:57:22 CDT 2013
Module: wine
Branch: master
Commit: 16c8ca8082c87621ea80203a482952f82188d267
URL: http://source.winehq.org/git/wine.git/?a=commit;h=16c8ca8082c87621ea80203a482952f82188d267
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Sep 16 12:34:44 2013 +0200
libwine: Use the argv[0] directory as bin directory only if all other methods fail.
---
libs/wine/config.c | 35 +++++++++++++++++++++++++++--------
1 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/libs/wine/config.c b/libs/wine/config.c
index df5c33b..4e26212 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -152,16 +152,16 @@ static char *get_runtime_libdir(void)
}
/* return the directory that contains the main exe at run-time */
-static char *get_runtime_bindir( const char *argv0 )
+static char *get_runtime_exedir(void)
{
- char *p, *bindir, *cwd;
- int len, size;
-
#ifdef EXE_LINK
+ char *p, *bindir;
+ int size;
+
for (size = 256; ; size *= 2)
{
int ret;
- if (!(bindir = malloc( size ))) break;
+ if (!(bindir = malloc( size ))) return NULL;
if ((ret = readlink( EXE_LINK, bindir, size )) == -1) break;
if (ret != size)
{
@@ -175,6 +175,14 @@ static char *get_runtime_bindir( const char *argv0 )
}
free( bindir );
#endif
+ return NULL;
+}
+
+/* return the base directory from argv0 */
+static char *get_runtime_argvdir( const char *argv0 )
+{
+ char *p, *bindir, *cwd;
+ int len, size;
if (!(p = strrchr( argv0, '/' ))) return NULL;
@@ -370,21 +378,32 @@ void wine_init_argv0_path( const char *argv0 )
if (!(basename = strrchr( argv0, '/' ))) basename = argv0;
else basename++;
- bindir = get_runtime_bindir( argv0 );
- libdir = get_runtime_libdir();
-
+ bindir = get_runtime_exedir();
if (bindir && !is_valid_bindir( bindir ))
{
build_dir = running_from_build_dir( bindir );
free( bindir );
bindir = NULL;
}
+
+ 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)
+ {
+ bindir = get_runtime_argvdir( argv0 );
+ if (bindir && !is_valid_bindir( bindir ))
+ {
+ build_dir = running_from_build_dir( bindir );
+ free( bindir );
+ bindir = NULL;
+ }
+ }
+
if (build_dir)
{
argv0_name = build_path( "loader/", basename );
More information about the wine-cvs
mailing list