[quake3-commits] r2106 - in trunk/code: client qcommon sys
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Jul 29 16:18:37 EDT 2011
Author: thilo
Date: 2011-07-29 16:18:37 -0400 (Fri, 29 Jul 2011)
New Revision: 2106
Modified:
trunk/code/client/cl_curl.c
trunk/code/client/qal.c
trunk/code/qcommon/qcommon.h
trunk/code/qcommon/vm.c
trunk/code/sys/sys_loadlib.h
trunk/code/sys/sys_main.c
Log:
Change DLL search path order for external libraries that are linked at runtime, like libcurl or libopenal to:
* system library paths
* executable path
* fs_basepath
Modified: trunk/code/client/cl_curl.c
===================================================================
--- trunk/code/client/cl_curl.c 2011-07-29 13:46:50 UTC (rev 2105)
+++ trunk/code/client/cl_curl.c 2011-07-29 20:18:37 UTC (rev 2106)
@@ -94,30 +94,19 @@
Com_Printf("Loading \"%s\"...", cl_cURLLib->string);
- if( (cURLLib = Sys_LoadLibrary(cl_cURLLib->string)) == 0 )
+ if(!(cURLLib = Sys_LoadDll(cl_cURLLib->string)))
{
#ifdef _WIN32
return qfalse;
-#else
- char fn[1024];
- Q_strncpyz( fn, Sys_Cwd( ), sizeof( fn ) );
- strncat(fn, "/", sizeof(fn)-strlen(fn)-1);
- strncat(fn, cl_cURLLib->string, sizeof(fn)-strlen(fn)-1);
-
- if((cURLLib = Sys_LoadLibrary(fn)) == 0)
- {
-#ifdef ALTERNATE_CURL_LIB
- // On some linux distributions there is no libcurl.so.3, but only libcurl.so.4. That one works too.
- if( (cURLLib = Sys_LoadLibrary(ALTERNATE_CURL_LIB)) == 0 )
- {
- return qfalse;
- }
+#elsif ALTERNATE_CURL_LIB
+ // On some linux distributions there is no libcurl.so.3, but only libcurl.so.4. That one works too.
+ if(!(cURLLib = Sys_LoadDll(ALTERNATE_CURL_LIB)))
+ return qfalse;
#else
+
return qfalse;
#endif
- }
-#endif /* _WIN32 */
}
clc.cURLEnabled = qtrue;
Modified: trunk/code/client/qal.c
===================================================================
--- trunk/code/client/qal.c 2011-07-29 13:46:50 UTC (rev 2105)
+++ trunk/code/client/qal.c 2011-07-29 20:18:37 UTC (rev 2106)
@@ -144,24 +144,9 @@
if(OpenALLib)
return qtrue;
- Com_Printf( "Loading \"%s\"...\n", libname);
- if( (OpenALLib = Sys_LoadLibrary(libname)) == 0 )
- {
-#ifdef _WIN32
+ if(!(OpenALLib = Sys_LoadDll(libname)))
return qfalse;
-#else
- char fn[1024];
- Q_strncpyz( fn, Sys_Cwd( ), sizeof( fn ) );
- strncat(fn, "/", sizeof(fn) - strlen(fn) - 1);
- strncat(fn, libname, sizeof(fn) - strlen(fn) - 1);
- if( (OpenALLib = Sys_LoadLibrary(fn)) == 0 )
- {
- return qfalse;
- }
-#endif
- }
-
alinit_fail = qfalse;
qalEnable = GPA("alEnable");
Modified: trunk/code/qcommon/qcommon.h
===================================================================
--- trunk/code/qcommon/qcommon.h 2011-07-29 13:46:50 UTC (rev 2105)
+++ trunk/code/qcommon/qcommon.h 2011-07-29 20:18:37 UTC (rev 2106)
@@ -1071,7 +1071,7 @@
void Sys_Init (void);
// general development dll loading for virtual machine testing
-void * QDECL Sys_LoadDll( const char *name, intptr_t (QDECL **entryPoint)(int, ...),
+void * QDECL Sys_LoadQVMDll( const char *name, intptr_t (QDECL **entryPoint)(int, ...),
intptr_t (QDECL *systemcalls)(intptr_t, ...) );
void Sys_UnloadDll( void *dllHandle );
Modified: trunk/code/qcommon/vm.c
===================================================================
--- trunk/code/qcommon/vm.c 2011-07-29 13:46:50 UTC (rev 2105)
+++ trunk/code/qcommon/vm.c 2011-07-29 20:18:37 UTC (rev 2106)
@@ -579,7 +579,7 @@
{
Com_Printf("Try loading dll file %s\n", filename);
- vm->dllHandle = Sys_LoadDll(filename, &vm->entryPoint, VM_DllSyscall);
+ vm->dllHandle = Sys_LoadQVMDll(filename, &vm->entryPoint, VM_DllSyscall);
if(vm->dllHandle)
{
Modified: trunk/code/sys/sys_loadlib.h
===================================================================
--- trunk/code/sys/sys_loadlib.h 2011-07-29 13:46:50 UTC (rev 2105)
+++ trunk/code/sys/sys_loadlib.h 2011-07-29 20:18:37 UTC (rev 2106)
@@ -47,3 +47,5 @@
# define Sys_LoadFunction(h,fn) SDL_LoadFunction(h,fn)
# define Sys_LibraryError() SDL_GetError()
#endif
+
+void * QDECL Sys_LoadDll(const char *name);
Modified: trunk/code/sys/sys_main.c
===================================================================
--- trunk/code/sys/sys_main.c 2011-07-29 13:46:50 UTC (rev 2105)
+++ trunk/code/sys/sys_main.c 2011-07-29 20:18:37 UTC (rev 2106)
@@ -412,10 +412,59 @@
=================
Sys_LoadDll
+First try to load library name from system library path,
+from executable path, then fs_basepath.
+=================
+*/
+
+void *Sys_LoadDll(const char *name)
+{
+ void *dllhandle;
+
+ Com_Printf("Try loading \"%s\"...\n", name);
+ if(!(dllhandle = Sys_LoadLibrary(name)))
+ {
+ const char *topDir;
+ char libPath[MAX_OSPATH];
+
+ topDir = Sys_BinaryPath();
+
+ if(!*topDir)
+ topDir = ".";
+
+ Com_Printf("Try loading \"%s\" from \"%s\"...\n", name, topDir);
+ Com_sprintf(libPath, sizeof(libPath), "%s%c%s", topDir, PATH_SEP, name);
+
+ if(!(dllhandle = Sys_LoadLibrary(libPath)))
+ {
+ const char *basePath = Cvar_VariableString("fs_basepath");
+
+ if(!basePath || !*basePath)
+ basePath = ".";
+
+ if(FS_FilenameCompare(topDir, basePath))
+ {
+ Com_Printf("Try loading \"%s\" from \"%s\"...\n", name, basePath);
+ Com_sprintf(libPath, sizeof(libPath), "%s%c%s", basePath, PATH_SEP, name);
+ dllhandle = Sys_LoadLibrary(libPath);
+ }
+
+ if(!dllhandle)
+ Com_Printf("Loading \"%s\" failed\n", name);
+ }
+ }
+
+ return dllhandle;
+}
+
+/*
+=================
+Sys_LoadQVMDll
+
Used to load a development dll instead of a virtual machine
=================
*/
-void *Sys_LoadDll(const char *name,
+void *Sys_LoadQVMDll(const char *name,
intptr_t (QDECL **entryPoint)(int, ...),
intptr_t (*systemcalls)(intptr_t, ...))
{
@@ -429,7 +478,7 @@
if(!libHandle)
{
- Com_Printf("Sys_LoadDll(%s) failed:\n\"%s\"\n", name, Sys_LibraryError());
+ Com_Printf("Sys_LoadQVMDll(%s) failed:\n\"%s\"\n", name, Sys_LibraryError());
return NULL;
}
@@ -438,13 +487,13 @@
if ( !*entryPoint || !dllEntry )
{
- Com_Printf ( "Sys_LoadDll(%s) failed to find vmMain function:\n\"%s\" !\n", name, Sys_LibraryError( ) );
+ Com_Printf ( "Sys_LoadQVMDll(%s) failed to find vmMain function:\n\"%s\" !\n", name, Sys_LibraryError( ) );
Sys_UnloadLibrary(libHandle);
return NULL;
}
- Com_Printf ( "Sys_LoadDll(%s) found vmMain function at %p\n", name, *entryPoint );
+ Com_Printf ( "Sys_LoadQVMDll(%s) found vmMain function at %p\n", name, *entryPoint );
dllEntry( systemcalls );
return libHandle;
More information about the quake3-commits
mailing list