Alexandre Julliard : libwine: Use the 64-bit preloader when starting 64-bit wine.

Alexandre Julliard julliard at winehq.org
Fri Dec 17 11:30:45 CST 2010


Module: wine
Branch: master
Commit: 5af634fd3b7ff7e4d6f8af34f6139315fdbbc8c4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5af634fd3b7ff7e4d6f8af34f6139315fdbbc8c4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Dec 16 17:59:30 2010 +0100

libwine: Use the 64-bit preloader when starting 64-bit wine.

---

 libs/wine/config.c |   27 ++++++++++++++++++---------
 1 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/libs/wine/config.c b/libs/wine/config.c
index 93dc7e0..4a2bced 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -97,6 +97,14 @@ static char *xstrdup( const char *str )
     return res;
 }
 
+/* check if a string ends in a given substring */
+static inline int strendswith( const char* str, const char* end )
+{
+    size_t len = strlen( str );
+    size_t tail = strlen( end );
+    return len >= tail && !strcmp( str + len - tail, end );
+}
+
 /* remove all trailing slashes from a path name */
 static inline void remove_trailing_slashes( char *path )
 {
@@ -448,19 +456,23 @@ const char *wine_get_build_id(void)
 /* exec a binary using the preloader if requested; helper for wine_exec_wine_binary */
 static void preloader_exec( char **argv, int use_preloader )
 {
-#if defined(linux) && defined(__i386__)
+#ifdef linux
     if (use_preloader)
     {
         static const char preloader[] = "wine-preloader";
+        static const char preloader64[] = "wine64-preloader";
         char *p, *full_name;
         char **last_arg = argv, **new_argv;
 
         if (!(p = strrchr( argv[0], '/' ))) p = argv[0];
         else p++;
 
-        full_name = xmalloc( p - argv[0] + sizeof(preloader) );
+        full_name = xmalloc( p - argv[0] + sizeof(preloader64) );
         memcpy( full_name, argv[0], p - argv[0] );
-        memcpy( full_name + (p - argv[0]), preloader, sizeof(preloader) );
+        if (strendswith( p, "64" ))
+            memcpy( full_name + (p - argv[0]), preloader64, sizeof(preloader64) );
+        else
+            memcpy( full_name + (p - argv[0]), preloader, sizeof(preloader) );
 
         /* make a copy of argv */
         while (*last_arg) last_arg++;
@@ -480,13 +492,10 @@ static void preloader_exec( char **argv, int use_preloader )
 void wine_exec_wine_binary( const char *name, char **argv, const char *env_var )
 {
     const char *path, *pos, *ptr;
-    int use_preloader = 0;
+    int use_preloader;
 
-    if (!name)  /* no name means default loader */
-    {
-        name = argv0_name;
-        use_preloader = 1;
-    }
+    if (!name) name = argv0_name;  /* no name means default loader */
+    use_preloader = !strendswith( name, "wineserver" );
 
     if ((ptr = strrchr( name, '/' )))
     {




More information about the wine-cvs mailing list