Alexandre Julliard : ntdll: Avoid using wine_get_build/data_dir() from libwine.

Alexandre Julliard julliard at winehq.org
Mon Apr 27 15:19:30 CDT 2020


Module: wine
Branch: master
Commit: 3e0c90e4c700d79124c6a7a14050799baa531879
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3e0c90e4c700d79124c6a7a14050799baa531879

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr 27 12:35:19 2020 +0200

ntdll: Avoid using wine_get_build/data_dir() from libwine.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/Makefile.in  |  7 +++++
 dlls/ntdll/env.c        |  4 +--
 dlls/ntdll/loader.c     |  2 +-
 dlls/ntdll/locale.c     |  3 ---
 dlls/ntdll/ntdll_misc.h |  3 +++
 dlls/ntdll/process.c    |  2 +-
 dlls/ntdll/server.c     | 70 +++++++++++++++++++++++++++++++++++++++++++++++--
 dlls/ntdll/thread.c     |  1 +
 8 files changed, 83 insertions(+), 9 deletions(-)

diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
index a67809a6c2..7971ef98cf 100644
--- a/dlls/ntdll/Makefile.in
+++ b/dlls/ntdll/Makefile.in
@@ -56,3 +56,10 @@ C_SRCS = \
 	wcstring.c
 
 RC_SRCS = version.rc
+
+server_EXTRADEFS = \
+	-DBINDIR=\"${bindir}\" \
+	-DDLLDIR=\"${dlldir}\" \
+	-DBIN_TO_DLLDIR=\"`$(MAKEDEP) -R ${bindir} ${dlldir}`\" \
+	-DDLL_TO_BINDIR=\"`$(MAKEDEP) -R ${dlldir} ${bindir}`\" \
+	-DBIN_TO_DATADIR=\"`$(MAKEDEP) -R ${bindir} ${datadir}/wine`\"
diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c
index ff0c8fbe90..eabebbcc28 100644
--- a/dlls/ntdll/env.c
+++ b/dlls/ntdll/env.c
@@ -408,9 +408,9 @@ static void set_wow64_environment( WCHAR **env )
 
     /* set the Wine paths */
 
-    set_wine_path_variable( env, winedatadirW, wine_get_data_dir() );
+    set_wine_path_variable( env, winedatadirW, data_dir );
     set_wine_path_variable( env, winehomedirW, home );
-    set_wine_path_variable( env, winebuilddirW, wine_get_build_dir() );
+    set_wine_path_variable( env, winebuilddirW, build_dir );
     set_wine_path_variable( env, wineconfigdirW, config_dir );
     for (i = 0; (p = wine_dll_enum_load_path( i )); i++)
     {
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 38c893e3eb..4d69e33b09 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2715,7 +2715,7 @@ static NTSTATUS find_builtin_dll( const WCHAR *name, WINE_MODREF **pwm,
                                   void **module, pe_image_info_t *image_info, struct stat *st,
                                   char **so_name )
 {
-    const char *path, *build_dir = wine_get_build_dir();
+    const char *path;
     unsigned int i, pos, len, namelen, maxlen = 0;
     char *ptr, *file;
     NTSTATUS status = STATUS_DLL_NOT_FOUND;
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index a28f5d0f58..0d0c1194d2 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -39,7 +39,6 @@
 #include "winbase.h"
 #include "winnls.h"
 #include "ntdll_misc.h"
-#include "wine/library.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(nls);
@@ -758,8 +757,6 @@ static const struct { const char *name; UINT cp; } charset_names[] =
 
 static void load_unix_cptable( unsigned int cp )
 {
-    const char *build_dir = wine_get_build_dir();
-    const char *data_dir = wine_get_data_dir();
     const char *dir = build_dir ? build_dir : data_dir;
     struct stat st;
     char *name;
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index 11ff0d7bb3..fc12bf47ef 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -96,6 +96,7 @@ extern void heap_set_debug_flags( HANDLE handle ) DECLSPEC_HIDDEN;
 extern void init_unix_codepage(void) DECLSPEC_HIDDEN;
 extern void init_locale( HMODULE module ) DECLSPEC_HIDDEN;
 extern void init_user_process_params( SIZE_T data_size ) DECLSPEC_HIDDEN;
+extern void init_paths(void) DECLSPEC_HIDDEN;
 extern char **build_envp( const WCHAR *envW ) DECLSPEC_HIDDEN;
 extern NTSTATUS restart_process( RTL_USER_PROCESS_PARAMETERS *params, NTSTATUS status ) DECLSPEC_HIDDEN;
 
@@ -104,6 +105,8 @@ extern char **__wine_main_argv;
 extern WCHAR **__wine_main_wargv;
 
 /* server support */
+extern const char *build_dir DECLSPEC_HIDDEN;
+extern const char *data_dir DECLSPEC_HIDDEN;
 extern const char *config_dir DECLSPEC_HIDDEN;
 extern timeout_t server_start_time DECLSPEC_HIDDEN;
 extern unsigned int server_cpus DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index 28aa671f47..d2a3421ac5 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -1008,7 +1008,7 @@ static const char *get_alternate_loader( char **ret_env )
 
     *ret_env = NULL;
 
-    if (wine_get_build_dir()) loader = is_win64 ? "loader/wine" : "loader/wine64";
+    if (build_dir) loader = is_win64 ? "loader/wine" : "loader/wine64";
 
     if (loader_env)
     {
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index d15ece3f4e..429a41c397 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -113,8 +113,11 @@ static const enum cpu_type client_cpu = CPU_ARM64;
 #error Unsupported CPU
 #endif
 
+const char *build_dir = NULL;
+const char *data_dir = NULL;
 const char *config_dir = NULL;
 static const char *server_dir;
+static const char *bin_dir;
 
 unsigned int server_cpus = 0;
 BOOL is_wow64 = FALSE;
@@ -177,6 +180,35 @@ static void fatal_perror( const char *err, ... )
     exit(1);
 }
 
+/* canonicalize path and return its directory name */
+static char *realpath_dirname( const char *name )
+{
+    char *p, *fullpath = realpath( name, NULL );
+
+    if (fullpath)
+    {
+        p = strrchr( fullpath, '/' );
+        if (p == fullpath) p++;
+        if (p) *p = 0;
+    }
+    return fullpath;
+}
+
+/* if string ends with tail, remove it */
+static char *remove_tail( const char *str, const char *tail )
+{
+    size_t len = strlen( str );
+    size_t tail_len = strlen( tail );
+    char *ret;
+
+    if (len < tail_len) return NULL;
+    if (strcmp( str + len - tail_len, tail )) return NULL;
+    ret = malloc( len - tail_len + 1 );
+    memcpy( ret, str, len - tail_len );
+    ret[len - tail_len] = 0;
+    return ret;
+}
+
 /* build a path from the specified dir and name */
 static char *build_path( const char *dir, const char *name )
 {
@@ -1279,6 +1311,42 @@ static const char *init_config_dir(void)
 }
 
 
+/***********************************************************************
+ *           init_paths
+ */
+void init_paths(void)
+{
+    const char *dll_dir = NULL;
+
+#ifdef HAVE_DLADDR
+    Dl_info info;
+
+    if (dladdr( init_paths, &info ) && info.dli_fname[0] == '/')
+        dll_dir = realpath_dirname( info.dli_fname );
+#endif
+
+#if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
+    bin_dir = realpath_dirname( "/proc/self/exe" );
+#elif defined (__FreeBSD__) || defined(__DragonFly__)
+    bin_dir = realpath_dirname( "/proc/curproc/file" );
+#else
+    bin_dir = realpath_dirname( __wine_main_argv[0] );
+#endif
+
+    if (dll_dir) build_dir = remove_tail( dll_dir, "/dlls/ntdll" );
+    else if (bin_dir) build_dir = remove_tail( bin_dir, "/loader" );
+
+    if (!build_dir)
+    {
+        if (!bin_dir) bin_dir = dll_dir ? build_path( dll_dir, DLL_TO_BINDIR ) : BINDIR;
+        else if (!dll_dir) dll_dir = build_path( bin_dir, BIN_TO_DLLDIR );
+        data_dir = build_path( bin_dir, BIN_TO_DATADIR );
+    }
+
+    config_dir = init_config_dir();
+}
+
+
 /***********************************************************************
  *           setup_config_dir
  *
@@ -1524,8 +1592,6 @@ void server_init_process(void)
     obj_handle_t version;
     const char *env_socket = getenv( "WINESERVERSOCKET" );
 
-    config_dir = init_config_dir();
-
     server_pid = -1;
     if (env_socket)
     {
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index e27b3a0c6d..73b5c9ebca 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -299,6 +299,7 @@ TEB *thread_init(void)
     signal_init_thread( teb );
     virtual_init_threading();
     debug_init();
+    init_paths();
     set_process_name( __wine_main_argc, __wine_main_argv );
 
     /* initialize time values in user_shared_data */




More information about the wine-cvs mailing list