[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