Alexandre Julliard : winecfg: Use Windows paths to load the library list.
Alexandre Julliard
julliard at winehq.org
Fri Apr 17 16:12:55 CDT 2020
Module: wine
Branch: master
Commit: cca5b4a150381fee0882ff85fb52697a34ab9f4f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=cca5b4a150381fee0882ff85fb52697a34ab9f4f
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Apr 17 12:38:12 2020 +0200
winecfg: Use Windows paths to load the library list.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winecfg/libraries.c | 65 +++++++++++++++++++++++++-------------------
1 file changed, 37 insertions(+), 28 deletions(-)
diff --git a/programs/winecfg/libraries.c b/programs/winecfg/libraries.c
index 15c308c77e..ae66509c9d 100644
--- a/programs/winecfg/libraries.c
+++ b/programs/winecfg/libraries.c
@@ -26,7 +26,6 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <commdlg.h>
-#include <wine/library.h>
#include <wine/debug.h>
#include <stdio.h>
#include <dirent.h>
@@ -254,33 +253,39 @@ static void clear_settings(HWND dialog)
static void load_library_list_from_dir( HWND dialog, const char *dir_path, int check_subdirs )
{
static const char * const ext[] = { ".dll", ".dll.so", ".so", "" };
- char *buffer = NULL, name[256];
+ char *buffer, *p, name[256];
unsigned int i;
- struct dirent *de;
- DIR *dir = opendir( dir_path );
+ HANDLE handle;
+ WIN32_FIND_DATAA data;
- if (!dir) return;
+ buffer = HeapAlloc( GetProcessHeap(), 0, strlen(dir_path) + 2 * sizeof(name) + 10 );
- if (check_subdirs)
- buffer = HeapAlloc( GetProcessHeap(), 0, strlen(dir_path) + 2 * sizeof(name) + 10 );
+ strcpy( buffer, dir_path );
+ strcat( buffer, "\\*" );
+ buffer[1] = '\\'; /* change \??\ to \\?\ */
+ p = buffer + strlen(buffer) - 1;
- while ((de = readdir( dir )))
+ if ((handle = FindFirstFileA( buffer, &data )) == INVALID_HANDLE_VALUE)
{
- size_t len = strlen(de->d_name);
+ HeapFree( GetProcessHeap(), 0, buffer );
+ return;
+ }
+
+ do
+ {
+ size_t len = strlen(data.cFileName);
if (len > sizeof(name)) continue;
if (check_subdirs)
{
- struct stat st;
-
- if (!strcmp( de->d_name, "." )) continue;
- if (!strcmp( de->d_name, ".." )) continue;
- if (!show_dll_in_list( de->d_name )) continue;
+ if (!strcmp( data.cFileName, "." )) continue;
+ if (!strcmp( data.cFileName, ".." )) continue;
+ if (!show_dll_in_list( data.cFileName )) continue;
for (i = 0; i < ARRAY_SIZE( ext ); i++)
{
- sprintf( buffer, "%s/%s/%s%s", dir_path, de->d_name, de->d_name, ext[i] );
- if (!stat( buffer, &st ))
+ sprintf( p, "%s\\%s%s", data.cFileName, data.cFileName, ext[i] );
+ if (GetFileAttributesA( buffer ) != INVALID_FILE_ATTRIBUTES)
{
- SendDlgItemMessageA( dialog, IDC_DLLCOMBO, CB_ADDSTRING, 0, (LPARAM)de->d_name );
+ SendDlgItemMessageA( dialog, IDC_DLLCOMBO, CB_ADDSTRING, 0, (LPARAM)data.cFileName );
break;
}
}
@@ -290,18 +295,19 @@ static void load_library_list_from_dir( HWND dialog, const char *dir_path, int c
for (i = 0; i < ARRAY_SIZE( ext ); i++)
{
if (!ext[i][0]) continue;
- if (len > strlen(ext[i]) && !strcmp( de->d_name + len - strlen(ext[i]), ext[i]))
+ if (len > strlen(ext[i]) && !strcmp( data.cFileName + len - strlen(ext[i]), ext[i]))
{
len -= strlen( ext[i] );
- memcpy( name, de->d_name, len );
+ memcpy( name, data.cFileName, len );
name[len] = 0;
if (!show_dll_in_list( name )) continue;
SendDlgItemMessageA( dialog, IDC_DLLCOMBO, CB_ADDSTRING, 0, (LPARAM)name );
}
}
}
- }
- closedir( dir );
+ } while (FindNextFileA( handle, &data ));
+
+ FindClose( handle );
HeapFree( GetProcessHeap(), 0, buffer );
}
@@ -309,21 +315,24 @@ static void load_library_list_from_dir( HWND dialog, const char *dir_path, int c
static void load_library_list( HWND dialog )
{
unsigned int i = 0;
- const char *path, *build_dir = wine_get_build_dir();
- char item1[256], item2[256];
+ char item1[256], item2[256], var[32], path[MAX_PATH];
HCURSOR old_cursor = SetCursor( LoadCursorW(0, (LPWSTR)IDC_WAIT) );
- if (build_dir)
+ if (GetEnvironmentVariableA( "WINEBUILDDIR", path, MAX_PATH ))
{
- char *dir = HeapAlloc( GetProcessHeap(), 0, strlen(build_dir) + sizeof("/dlls") );
- strcpy( dir, build_dir );
- strcat( dir, "/dlls" );
+ char *dir = HeapAlloc( GetProcessHeap(), 0, strlen(path) + sizeof("\\dlls") );
+ strcpy( dir, path );
+ strcat( dir, "\\dlls" );
load_library_list_from_dir( dialog, dir, TRUE );
HeapFree( GetProcessHeap(), 0, dir );
}
- while ((path = wine_dll_enum_load_path( i++ )))
+ for (;;)
+ {
+ sprintf( var, "WINEDLLDIR%u", i++ );
+ if (!GetEnvironmentVariableA( var, path, MAX_PATH )) break;
load_library_list_from_dir( dialog, path, FALSE );
+ }
/* get rid of duplicate entries */
More information about the wine-cvs
mailing list