]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
Library loading: if a DLL succeeds to load but a function is missing, also continue...
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 27 Jul 2010 19:22:30 +0000 (19:22 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 27 Jul 2010 19:22:30 +0000 (19:22 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10366 d7cf8633-e32d-0410-b094-e92efae38249

sys_shared.c

index d05c74bed687d3297482f6b250d1c52ed09cf2ea..2ae309c12e06b3f8b1e70e35f5f728efa181b340 100644 (file)
@@ -67,6 +67,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
@@ -80,18 +105,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
@@ -110,8 +131,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
@@ -132,8 +155,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);
                }
        }
 
@@ -146,15 +171,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