Alexandre Julliard : libwine: Fix lookup of 16-bit dll placeholders. Remove some old compatibility code.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 30 08:55:55 CDT 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jul 30 14:44:05 2007 +0200

libwine: Fix lookup of 16-bit dll placeholders. Remove some old compatibility code.

---

 libs/wine/loader.c |   35 +++++++++--------------------------
 1 files changed, 9 insertions(+), 26 deletions(-)

diff --git a/libs/wine/loader.c b/libs/wine/loader.c
index c7fcece..9f69a1c 100644
--- a/libs/wine/loader.c
+++ b/libs/wine/loader.c
@@ -64,6 +64,7 @@ struct dll_path_context
     char *buffer;       /* buffer used for storing path names */
     char *name;         /* start of file name part in buffer (including leading slash) */
     int   namelen;      /* length of file name without .so extension */
+    int   win16;        /* 16-bit dll search */
 };
 
 #define MAX_DLLS 100
@@ -170,7 +171,7 @@ static char *next_dll_path( struct dll_path_context *context )
     switch(index)
     {
     case 0:  /* try programs dir for .exe files */
-        if (namelen > 4 && !memcmp( context->name + namelen - 4, ".exe", 4 ))
+        if (!context->win16 && namelen > 4 && !memcmp( context->name + namelen - 4, ".exe", 4 ))
         {
             path = prepend( path, context->name, namelen - 4 );
             path = prepend( path, "/programs", sizeof("/programs") - 1 );
@@ -181,7 +182,7 @@ static char *next_dll_path( struct dll_path_context *context )
         /* fall through */
     case 1:  /* try dlls dir with subdir prefix */
         if (namelen > 4 && !memcmp( context->name + namelen - 4, ".dll", 4 )) namelen -= 4;
-        path = prepend( path, context->name, namelen );
+        if (!context->win16) path = prepend( path, context->name, namelen );
         path = prepend( path, "/dlls", sizeof("/dlls") - 1 );
         path = prepend( path, build_dir, strlen(build_dir) );
         return path;
@@ -196,15 +197,17 @@ static char *next_dll_path( struct dll_path_context *context )
 
 
 /* get a filename from the first entry in the dll path */
-static char *first_dll_path( const char *name, const char *ext, struct dll_path_context *context )
+static char *first_dll_path( const char *name, int win16, struct dll_path_context *context )
 {
     char *p;
     int namelen = strlen( name );
+    const char *ext = win16 ? "16" : ".so";
 
     context->buffer = malloc( dll_path_maxlen + 2 * namelen + strlen(ext) + 3 );
     context->index = build_dir ? 0 : 2;  /* if no build dir skip all the build dir magic cases */
     context->name = context->buffer + dll_path_maxlen + namelen + 1;
     context->namelen = namelen + 1;
+    context->win16 = win16;
 
     /* store the name at the end of the buffer, followed by extension */
     p = context->name;
@@ -232,7 +235,7 @@ static void *dlopen_dll( const char *name, char *error, int errorsize,
     void *ret = NULL;
 
     *exists = 0;
-    for (path = first_dll_path( name, ".so", &context ); path; path = next_dll_path( &context ))
+    for (path = first_dll_path( name, 0, &context ); path; path = next_dll_path( &context ))
     {
         if (!test_only && (ret = wine_dlopen( path, RTLD_NOW, error, errorsize ))) break;
         if ((*exists = file_exists( path ))) break; /* exists but cannot be loaded, return the error */
@@ -562,7 +565,7 @@ int wine_dll_get_owner( const char *name, char *buffer, int size, int *exists )
 
     *exists = 0;
 
-    for (path = first_dll_path( name, "16", &context ); path; path = next_dll_path( &context ))
+    for (path = first_dll_path( name, 1, &context ); path; path = next_dll_path( &context ))
     {
         int fd = open( path, O_RDONLY );
         if (fd != -1)
@@ -577,26 +580,6 @@ int wine_dll_get_owner( const char *name, char *buffer, int size, int *exists )
         }
     }
     free_dll_path( &context );
-    if (ret != -1) return ret;
-
-    /* try old method too for backwards compatibility; will be removed later on */
-    for (path = first_dll_path( name, ".so", &context ); path; path = next_dll_path( &context ))
-    {
-        int res = readlink( path, buffer, size );
-        if (res != -1) /* got a symlink */
-        {
-            *exists = 1;
-            if (res < 4 || res >= size) break;
-            buffer[res] = 0;
-            if (strchr( buffer, '/' )) break;  /* contains a path, not valid */
-            if (strcmp( buffer + res - 3, ".so" )) break;  /* does not end in .so, not valid */
-            buffer[res - 3] = 0;  /* remove .so */
-            ret = 0;
-            break;
-        }
-        if ((*exists = file_exists( path ))) break; /* exists but not a symlink, return the error */
-    }
-    free_dll_path( &context );
     return ret;
 }
 
@@ -648,7 +631,7 @@ void wine_init( int argc, char *argv[], char *error, int error_size )
     mmap_init();
     debug_init();
 
-    for (path = first_dll_path( "ntdll.dll", ".so", &context ); path; path = next_dll_path( &context ))
+    for (path = first_dll_path( "ntdll.dll", 0, &context ); path; path = next_dll_path( &context ))
     {
         if ((ntdll = wine_dlopen( path, RTLD_NOW, error, error_size )))
         {




More information about the wine-cvs mailing list