From eb4070138ec9543e47e88de237d9deb866ee4ca3 Mon Sep 17 00:00:00 2001 From: divverent Date: Tue, 27 Jul 2010 19:22:30 +0000 Subject: [PATCH] Library loading: if a DLL succeeds to load but a function is missing, also continue to the next one but warn. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10366 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::merge=e4fc3f62a031f2c744b673d79688d6c138da3368 --- sys_shared.c | 52 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/sys_shared.c b/sys_shared.c index 3b83a498..423e7174 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -64,6 +64,31 @@ DLL MANAGEMENT =============================================================================== */ +static qboolean Sys_LoadLibraryFunctions(dllhandle_t dllhandle, const dllfunction_t *fcts, qboolean complain, qboolean has_next) +{ + const dllfunction_t *func; + if(dllhandle) + { + for (func = fcts; func && func->name != NULL; func++) + if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) + { + if(complain) + { + Con_DPrintf (" - missing function \"%s\" - broken library!", func->name); + if(has_next) + Con_DPrintf("\nContinuing with"); + } + goto notfound; + } + return true; + + notfound: + for (func = fcts; func && func->name != NULL; func++) + *func->funcvariable = NULL; + } + return false; +} + qboolean Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllfunction_t *fcts) { #ifdef SUPPORTDLL @@ -77,18 +102,14 @@ qboolean Sys_LoadLibrary (const char** dllnames, dllhandle_t* handle, const dllf #ifndef WIN32 #ifdef PREFER_PRELOAD dllhandle = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); - if(dllhandle) + if(Sys_LoadLibraryFunctions(dllhandle, fcts, false, false)) { - for (func = fcts; func && func->name != NULL; func++) - if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) - { - dlclose(dllhandle); - goto notfound; - } Con_DPrintf ("All of %s's functions were already linked in! Not loading dynamically...\n", dllnames[0]); *handle = dllhandle; return true; } + else + Sys_UnloadLibrary(&dllhandle); notfound: #endif #endif @@ -107,8 +128,10 @@ notfound: #else dllhandle = dlopen (dllnames[i], RTLD_LAZY | RTLD_GLOBAL); #endif - if (dllhandle) + if (Sys_LoadLibraryFunctions(dllhandle, fcts, true, (dllnames[i+1] != NULL) || (strrchr(com_argv[0], '/')))) break; + else + Sys_UnloadLibrary (&dllhandle); } // see if the names can be loaded relative to the executable path @@ -129,8 +152,10 @@ notfound: #else dllhandle = dlopen (temp, RTLD_LAZY | RTLD_GLOBAL); #endif - if (dllhandle) + if (Sys_LoadLibraryFunctions(dllhandle, fcts, true, dllnames[i+1] != NULL)) break; + else + Sys_UnloadLibrary (&dllhandle); } } @@ -143,15 +168,6 @@ notfound: Con_DPrintf(" - loaded.\n"); - // Get the function adresses - for (func = fcts; func && func->name != NULL; func++) - if (!(*func->funcvariable = (void *) Sys_GetProcAddress (dllhandle, func->name))) - { - Con_DPrintf ("Missing function \"%s\" - broken library!\n", func->name); - Sys_UnloadLibrary (&dllhandle); - return false; - } - *handle = dllhandle; return true; #else -- 2.39.2