* dlfcn.cc (get_full_path_of_dll): Just return a bool value. Drop

local path_conv in favor of getting it as parameter.  Add local string
	buffer instead of getting it as parameter.
	(dlopen): Accommodate get_full_path_of_dll change.  Fetch WCHAR Windows
	path from path_conv variable and call LoadLibraryW.
This commit is contained in:
Corinna Vinschen 2009-04-16 16:17:58 +00:00
parent cc0748930b
commit 54155bc37b
2 changed files with 31 additions and 23 deletions

View File

@ -1,3 +1,11 @@
2009-04-16 Corinna Vinschen <corinna@vinschen.de>
* dlfcn.cc (get_full_path_of_dll): Just return a bool value. Drop
local path_conv in favor of getting it as parameter. Add local string
buffer instead of getting it as parameter.
(dlopen): Accommodate get_full_path_of_dll change. Fetch WCHAR Windows
path from path_conv variable and call LoadLibraryW.
2009-04-16 Corinna Vinschen <corinna@vinschen.de> 2009-04-16 Corinna Vinschen <corinna@vinschen.de>
* ntdll.h (STATUS_LOCK_NOT_GRANTED): Define. * ntdll.h (STATUS_LOCK_NOT_GRANTED): Define.

View File

@ -36,16 +36,20 @@ check_path_access (const char *mywinenv, const char *name, path_conv& buf)
/* Search LD_LIBRARY_PATH for dll, if it exists. /* Search LD_LIBRARY_PATH for dll, if it exists.
Return Windows version of given path. */ Return Windows version of given path. */
static const char * __stdcall static bool __stdcall
get_full_path_of_dll (const char* str, char *name) get_full_path_of_dll (const char* str, path_conv &real_filename)
{ {
int len = strlen (str); int len = strlen (str);
/* empty string or too long to be legal win32 pathname? */ /* empty string? */
if (len == 0 || len >= PATH_MAX) if (len == 0)
return str; /* Yes. Let caller deal with it. */ {
set_errno (EINVAL);
return false; /* Yes. Let caller deal with it. */
}
const char *ret; tmp_pathbuf tp;
char *name = tp.c_get ();
strcpy (name, str); /* Put it somewhere where we can manipulate it. */ strcpy (name, str); /* Put it somewhere where we can manipulate it. */
@ -58,22 +62,16 @@ get_full_path_of_dll (const char* str, char *name)
strcat (name, ".dll"); strcat (name, ".dll");
} }
path_conv real_filename;
if (isabspath (name) || if (isabspath (name) ||
(ret = check_path_access ("LD_LIBRARY_PATH=", name, real_filename) (check_path_access ("LD_LIBRARY_PATH=", name, real_filename)
?: check_path_access ("/usr/lib", name, real_filename)) == NULL) ?: check_path_access ("/usr/lib", name, real_filename)) == NULL)
real_filename.check (name, PC_SYM_FOLLOW | PC_NOFULL | PC_NULLEMPTY); /* Convert */ real_filename.check (name, PC_SYM_FOLLOW | PC_NOFULL | PC_NULLEMPTY);
if (!real_filename.error) if (!real_filename.error)
ret = strcpy (name, real_filename.get_win32 ()); return true;
else
{
set_errno (real_filename.error);
ret = NULL;
}
return ret; set_errno (real_filename.error);
return false;
} }
void * void *
@ -85,15 +83,17 @@ dlopen (const char *name, int)
ret = (void *) GetModuleHandle (NULL); /* handle for the current module */ ret = (void *) GetModuleHandle (NULL); /* handle for the current module */
else else
{ {
tmp_pathbuf tp;
char *buf = tp.c_get ();
/* handle for the named library */ /* handle for the named library */
const char *fullpath = get_full_path_of_dll (name, buf); path_conv pc;
if (!fullpath) if (!get_full_path_of_dll (name, pc))
ret = NULL; ret = NULL;
else else
{ {
ret = (void *) LoadLibrary (fullpath); tmp_pathbuf tp;
wchar_t *path = tp.w_get ();
pc.get_wide_win32_path (path);
ret = (void *) LoadLibraryW (path);
if (ret == NULL) if (ret == NULL)
__seterrno (); __seterrno ();
} }