void SCR_CaptureVideo_Ogg_CloseDLL(void) { Sys_UnloadLibrary (&ve_dll); Sys_UnloadLibrary (&vo_dll); Sys_UnloadLibrary (&th_dll); Sys_UnloadLibrary (&og_dll); }
/* ==================== PNG_CloseLibrary Unload the PNG DLL ==================== */ void PNG_CloseLibrary (void) { #ifndef LINK_TO_LIBPNG Sys_UnloadLibrary (&png14_dll); Sys_UnloadLibrary (&png_dll); #endif }
/* ================= Sys_LoadGameDll Used to load a development dll instead of a virtual machine ================= */ void *Sys_LoadGameDll(const char *name, intptr_t (QDECL **entryPoint)(intptr_t, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); assert(name); Com_DPrintf( "Loading DLL file: %s\n", name); libHandle = Sys_LoadLibrary(name); if(!libHandle) { Com_Printf("Sys_LoadGameDll(%s) failed:\n\"%s\"\n", name, Sys_LibraryError()); return NULL; } dllEntry = Sys_LoadFunction( libHandle, "dllEntry" ); *entryPoint = Sys_LoadFunction( libHandle, "vmMain" ); if ( !*entryPoint || !dllEntry ) { Com_Printf ( "Sys_LoadGameDll(%s) failed to find vmMain function:\n\"%s\" !\n", name, Sys_LibraryError( ) ); Sys_UnloadLibrary(libHandle); return NULL; } Com_DPrintf ( "Sys_LoadGameDll(%s) found vmMain function at %p\n", name, *entryPoint ); dllEntry( systemcalls ); return libHandle; }
/* ================= Sys_UnloadGame ================= */ void Sys_UnloadGame (void) { Com_Printf("------ Unloading Game ------\n"); if (game_library) Sys_UnloadLibrary (game_library); game_library = NULL; }
/* ================= CL_cURL_Shutdown ================= */ void CL_cURL_Shutdown( void ) { CL_cURL_Cleanup(); #ifdef USE_CURL_DLOPEN if(cURLLib) { Sys_UnloadLibrary(cURLLib); cURLLib = NULL; } qcurl_easy_init = NULL; qcurl_easy_setopt = NULL; qcurl_easy_perform = NULL; qcurl_easy_cleanup = NULL; qcurl_easy_getinfo = NULL; qcurl_easy_duphandle = NULL; qcurl_easy_reset = NULL; qcurl_multi_init = NULL; qcurl_multi_add_handle = NULL; qcurl_multi_remove_handle = NULL; qcurl_multi_fdset = NULL; qcurl_multi_perform = NULL; qcurl_multi_cleanup = NULL; qcurl_multi_info_read = NULL; qcurl_multi_strerror = NULL; #endif /* USE_CURL_DLOPEN */ }
void *Sys_LoadLegacyGameDll( const char *name, VMMainProc **vmMain, SystemCallProc *systemcalls ) { void *libHandle = NULL; char filename[MAX_OSPATH]; Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); if (!Sys_UnpackDLL(filename)) { Com_DPrintf( "Sys_LoadLegacyGameDll: Failed to unpack %s from PK3.\n", filename ); return NULL; } #if defined(MACOS_X) && !defined(_JK2EXE) //First, look for the old-style mac .bundle that's inside a pk3 //It's actually zipped, and the zipfile has the same name as 'name' libHandle = Sys_LoadMachOBundle( name ); #endif if (!libHandle) { char *basepath = Cvar_VariableString( "fs_basepath" ); char *homepath = Cvar_VariableString( "fs_homepath" ); char *cdpath = Cvar_VariableString( "fs_cdpath" ); char *gamedir = Cvar_VariableString( "fs_game" ); #ifdef MACOS_X char *apppath = Cvar_VariableString( "fs_apppath" ); #endif const char *searchPaths[] = { homepath, #ifdef MACOS_X apppath, #endif basepath, cdpath, }; size_t numPaths = ARRAY_LEN( searchPaths ); libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); if ( !libHandle ) return NULL; } typedef void QDECL DllEntryProc( SystemCallProc *syscallptr ); DllEntryProc *dllEntry = (DllEntryProc *)Sys_LoadFunction( libHandle, "dllEntry" ); *vmMain = (VMMainProc *)Sys_LoadFunction( libHandle, "vmMain" ); if ( !*vmMain || !dllEntry ) { Com_DPrintf ( "Sys_LoadLegacyGameDll(%s) failed to find vmMain function:\n...%s!\n", name, Sys_LibraryError() ); Sys_UnloadLibrary( libHandle ); return NULL; } Com_DPrintf ( "Sys_LoadLegacyGameDll(%s) found vmMain function at 0x%" PRIxPTR "\n", name, *vmMain ); dllEntry( systemcalls ); return libHandle; }
/* ================= Sys_UnloadDll ================= */ void Sys_UnloadDll( void *dllHandle ) { if( !dllHandle ) { Com_Printf("Sys_UnloadDll(NULL)\n"); return; } Sys_UnloadLibrary(dllHandle); }
void sysunloaddll(void *dllHandle) { if(!dllHandle){ comprintf("sysunloaddll(NULL)\n"); return; } Sys_UnloadLibrary(dllHandle); }
static void JVM_JNI_Shutdown(void) { if(javaLib) { Sys_UnloadLibrary(javaLib); javaLib = NULL; } QJNI_CreateJavaVM = NULL; QJNI_GetCreatedJavaVMs = NULL; }
void *Sys_LoadGameDll( const char *name, GetModuleAPIProc **moduleAPI ) { void *libHandle = NULL; char filename[MAX_OSPATH]; Com_sprintf (filename, sizeof(filename), "%s" ARCH_STRING DLL_EXT, name); if (!Sys_UnpackDLL(filename)) { Com_DPrintf( "Sys_LoadGameDll: Failed to unpack %s from PK3.\n", filename ); return NULL; } #if defined(MACOS_X) && !defined(_JK2EXE) //First, look for the old-style mac .bundle that's inside a pk3 //It's actually zipped, and the zipfile has the same name as 'name' libHandle = Sys_LoadMachOBundle( name ); #endif if (!libHandle) { char *basepath = Cvar_VariableString( "fs_basepath" ); char *homepath = Cvar_VariableString( "fs_homepath" ); char *cdpath = Cvar_VariableString( "fs_cdpath" ); char *gamedir = Cvar_VariableString( "fs_game" ); #ifdef MACOS_X char *apppath = Cvar_VariableString( "fs_apppath" ); #endif const char *searchPaths[] = { homepath, #ifdef MACOS_X apppath, #endif basepath, cdpath, }; size_t numPaths = ARRAY_LEN( searchPaths ); libHandle = Sys_LoadDllFromPaths( filename, gamedir, searchPaths, numPaths, SEARCH_PATH_BASE | SEARCH_PATH_MOD, __FUNCTION__ ); if ( !libHandle ) return NULL; } *moduleAPI = (GetModuleAPIProc *)Sys_LoadFunction( libHandle, "GetModuleAPI" ); if ( !*moduleAPI ) { Com_DPrintf ( "Sys_LoadGameDll(%s) failed to find GetModuleAPI function:\n...%s!\n", name, Sys_LibraryError() ); Sys_UnloadLibrary( libHandle ); return NULL; } return libHandle; }
/* ================= Sys_LoadDll Used to load a development dll instead of a virtual machine #1 look down current path #2 look in fs_homepath #3 look in fs_basepath ================= */ void *Sys_LoadDll( const char *name, char *fqpath , intptr_t (**entryPoint)(int, ...), intptr_t (*systemcalls)(intptr_t, ...) ) { void *libHandle; void (*dllEntry)( intptr_t (*syscallptr)(intptr_t, ...) ); char fname[MAX_OSPATH]; char *basepath; char *homepath; char *pwdpath; char *gamedir; assert( name ); Q_snprintf (fname, sizeof(fname), "%s" ARCH_STRING DLL_EXT, name); // TODO: use fs_searchpaths from files.c pwdpath = Sys_Cwd(); basepath = Cvar_VariableString( "fs_basepath" ); homepath = Cvar_VariableString( "fs_homepath" ); gamedir = Cvar_VariableString( "fs_game" ); libHandle = Sys_TryLibraryLoad(pwdpath, gamedir, fname, fqpath); if(!libHandle && homepath) libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname, fqpath); if(!libHandle && basepath) libHandle = Sys_TryLibraryLoad(basepath, gamedir, fname, fqpath); if(!libHandle) { Com_Printf ( "Sys_LoadDll(%s) failed to load library\n", name ); return NULL; } dllEntry = Sys_LoadFunction( libHandle, "dllEntry" ); *entryPoint = Sys_LoadFunction( libHandle, "vmMain" ); if ( !*entryPoint || !dllEntry ) { Com_Printf ( "Sys_LoadDll(%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 ); dllEntry( systemcalls ); return libHandle; }
/* ================= Sys_LoadCgame Used to hook up a development dll ================= */ void * Sys_LoadCgame( intptr_t (**entryPoint)(int, ...), intptr_t (*systemcalls)(intptr_t, ...) ) { void (*dllEntry)( intptr_t (*syscallptr)(intptr_t, ...) ); dllEntry = ( void (*)( intptr_t (*)( intptr_t, ... ) ) )Sys_LoadFunction( game_library, "dllEntry" ); *entryPoint = (intptr_t (*)(int,...))Sys_LoadFunction( game_library, "vmMain" ); if ( !*entryPoint || !dllEntry ) { Sys_UnloadLibrary( game_library ); return NULL; } dllEntry( systemcalls ); return game_library; }
/* ==================== PNG_OpenLibrary Try to load the PNG DLL ==================== */ qboolean PNG_OpenLibrary (void) { #ifndef LINK_TO_LIBPNG const char* dllnames [] = { #if WIN32 "libpng16.dll", "libpng16-16.dll", "libpng15-15.dll", "libpng15.dll", "libpng14-14.dll", "libpng14.dll", "libpng12.dll", #elif defined(MACOSX) "libpng16.16.dylib", "libpng15.15.dylib", "libpng14.14.dylib", "libpng12.0.dylib", #else "libpng16.so", "libpng16.so.16", "libpng15.so.15", // WTF libtool guidelines anyone? "libpng14.so.14", // WTF libtool guidelines anyone? "libpng12.so.0", "libpng.so", // FreeBSD #endif NULL }; // Already loaded? if (png_dll) return true; // Load the DLL if(!Sys_LoadLibrary (dllnames, &png_dll, pngfuncs)) return false; if(qpng_access_version_number() / 100 >= 104) if(!Sys_LoadLibrary (dllnames, &png14_dll, png14funcs)) { Sys_UnloadLibrary (&png_dll); return false; } #endif return true; }
/* ================= Sys_LoadDll Used to load a development dll instead of a virtual machine #1 look in fs_homepath #2 look in fs_basepath ================= */ void *Sys_LoadDll( const char *name, intptr_t (**entryPoint)(int, ...), intptr_t (*systemcalls)(intptr_t, ...) ) { void *libHandle; void (*dllEntry)( intptr_t (*syscallptr)(intptr_t, ...) ); char fname[MAX_OSPATH]; char *netpath; assert( name ); Com_sprintf(fname, sizeof(fname), "%s" ARCH_STRING DLL_EXT, name); netpath = FS_FindDll(fname); if(!netpath) { Com_Printf( "Sys_LoadDll(%s) could not find it\n", fname ); return NULL; } Com_Printf( "Loading DLL file: %s\n", netpath); libHandle = Sys_LoadLibrary(netpath); if(!libHandle) { Com_Printf( "Sys_LoadDll(%s) failed:\n\"%s\"\n", netpath, Sys_LibraryError() ); return NULL; } dllEntry = Sys_LoadFunction( libHandle, "dllEntry" ); *entryPoint = Sys_LoadFunction( libHandle, "vmMain" ); if ( !*entryPoint || !dllEntry ) { Com_Printf ( "Sys_LoadDll(%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 ); dllEntry( systemcalls ); return libHandle; }
void CL_Gecko_Shutdown( void ) { int i; for( i = 0 ; i < MAX_GECKO_INSTANCES ; i++ ) { clgecko_t *instance = &cl_geckoinstances[ i ]; if( instance->active ) { cl_gecko_unlinktexture( instance ); } } if (cl_geckoembedding != NULL) { osgk_release( cl_geckoembedding ); cl_geckoembedding = NULL; } if (osgk_dll != NULL) { Sys_UnloadLibrary (&osgk_dll); } }
/* ================= Sys_UnloadDll ================= */ void Sys_UnloadDll(void *dllHandle) { #ifdef __MORPHOS__ void (*morphos_so_deinit)(void); #endif if (!dllHandle) { Com_Printf("Sys_UnloadDll(NULL)\n"); return; } #ifdef __MORPHOS__ morphos_so_deinit = Sys_LoadFunction(dllHandle, "morphos_so_deinit"); if (morphos_so_deinit) { morphos_so_deinit(); } #endif Sys_UnloadLibrary(dllHandle); }
/* ================= Sys_LoadDll Used to load a development dll instead of a virtual machine #1 look in fs_homepath #2 look in fs_basepath #4 look in fs_libpath under FreeBSD ================= */ void *QDECL Sys_LoadDll( const char *name, char *fqpath, intptr_t (QDECL **entryPoint)(int, ...), intptr_t (QDECL *systemcalls)(intptr_t, ...) ) { void *libHandle = NULL, (QDECL *dllEntry)( intptr_t (QDECL *syscallptr)(intptr_t, ...) ); char fname[MAX_QPATH], *basepath, *homepath, *gamedir, *libpath; assert( name ); //Q_snprintf (fname, sizeof(fname), Sys_GetDLLName( "%s" ), name); Q_strncpyz(fname, Sys_GetDLLName(name), sizeof(fname)); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString( "fs_basepath" ); homepath = Cvar_VariableString( "fs_homepath" ); gamedir = Cvar_VariableString( "fs_game" ); libpath = Cvar_VariableString( "fs_libpath" ); #ifndef DEDICATED // if the server is pure, extract the dlls from the mp_bin.pk3 so // that they can be referenced if ( Cvar_VariableValue( "sv_pure" ) && Q_stricmp( name, "qagame" ) ) { FS_CL_ExtractFromPakFile( homepath, gamedir, fname ); } #endif libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname, fqpath); if (!libHandle && libpath && libpath[0]) { libHandle = Sys_TryLibraryLoad(libpath, gamedir, fname, fqpath); } if(!libHandle && basepath) { libHandle = Sys_TryLibraryLoad(basepath, gamedir, fname, fqpath); } if(!libHandle) { Com_Printf( "Sys_LoadDll(%s) could not find it\n", fname ); return NULL; } if(!libHandle) { Com_Printf( "Sys_LoadDll(%s) failed:\n\"%s\"\n", name, Sys_LibraryError() ); return NULL; } // Try to load the dllEntry and vmMain function. dllEntry = ( void ( QDECL * )( intptr_t ( QDECL * )( intptr_t, ... ) ) )Sys_LoadFunction( libHandle, "dllEntry" ); *entryPoint = ( intptr_t ( QDECL * )( int,... ) )Sys_LoadFunction( libHandle, "vmMain" ); if ( !*entryPoint || !dllEntry ) { #ifndef NDEBUG if (!dllEntry) { Com_Error ( ERR_FATAL, "Sys_LoadDll(%s) failed SDL_LoadFunction(dllEntry):\n\"%p\" !\n", name, Sys_LibraryError() ); } else { Com_Error ( ERR_FATAL, "Sys_LoadDll(%s) failed SDL_LoadFunction(vmMain):\n\"%p\" !\n", name, Sys_LibraryError() ); } #else if (!dllEntry) { Com_Printf ( "Sys_LoadDll(%s) failed SDL_LoadFunction(dllEntry):\n\"%p\" !\n", name, Sys_LibraryError() ); } else { Com_Printf ( "Sys_LoadDll(%s) failed SDL_LoadFunction(vmMain):\n\"%p\" !\n", name, Sys_LibraryError() ); } #endif Sys_UnloadLibrary(libHandle); return NULL; } Com_Printf ( "Sys_LoadDll(%s) found vmMain function at %p\n", name, *entryPoint ); dllEntry( systemcalls ); Com_Printf ( "Sys_LoadDll(%s) succeeded!\n", name ); // Copy the fname to fqpath. Q_strncpyz ( fqpath , fname , MAX_QPATH ) ; return libHandle; }
/* ==================== PNG_CloseLibrary Unload the PNG DLL ==================== */ void PNG_CloseLibrary (void) { Sys_UnloadLibrary (&png14_dll); Sys_UnloadLibrary (&png_dll); }
/* ==================== IRC_CloseLibrary Unload the libircclient DLL. ==================== */ void IRC_CloseLibrary(void) { Sys_UnloadLibrary(&irc_dll); }
/* ======================================================================================================================================= QAL_Shutdown ======================================================================================================================================= */ void QAL_Shutdown(void) { if (OpenALLib) { Sys_UnloadLibrary(OpenALLib); OpenALLib = NULL; } qalEnable = NULL; qalDisable = NULL; qalIsEnabled = NULL; qalGetString = NULL; qalGetBooleanv = NULL; qalGetIntegerv = NULL; qalGetFloatv = NULL; qalGetDoublev = NULL; qalGetBoolean = NULL; qalGetInteger = NULL; qalGetFloat = NULL; qalGetDouble = NULL; qalGetError = NULL; qalIsExtensionPresent = NULL; qalGetProcAddress = NULL; qalGetEnumValue = NULL; qalListenerf = NULL; qalListener3f = NULL; qalListenerfv = NULL; qalListeneri = NULL; qalGetListenerf = NULL; qalGetListener3f = NULL; qalGetListenerfv = NULL; qalGetListeneri = NULL; qalGenSources = NULL; qalDeleteSources = NULL; qalIsSource = NULL; qalSourcef = NULL; qalSource3f = NULL; qalSourcefv = NULL; qalSourcei = NULL; qalGetSourcef = NULL; qalGetSource3f = NULL; qalGetSourcefv = NULL; qalGetSourcei = NULL; qalSourcePlayv = NULL; qalSourceStopv = NULL; qalSourceRewindv = NULL; qalSourcePausev = NULL; qalSourcePlay = NULL; qalSourceStop = NULL; qalSourceRewind = NULL; qalSourcePause = NULL; qalSourceQueueBuffers = NULL; qalSourceUnqueueBuffers = NULL; qalGenBuffers = NULL; qalDeleteBuffers = NULL; qalIsBuffer = NULL; qalBufferData = NULL; qalGetBufferf = NULL; qalGetBufferi = NULL; qalDopplerFactor = NULL; qalSpeedOfSound = NULL; qalDistanceModel = NULL; qalcCreateContext = NULL; qalcMakeContextCurrent = NULL; qalcProcessContext = NULL; qalcSuspendContext = NULL; qalcDestroyContext = NULL; qalcGetCurrentContext = NULL; qalcGetContextsDevice = NULL; qalcOpenDevice = NULL; qalcCloseDevice = NULL; qalcGetError = NULL; qalcIsExtensionPresent = NULL; qalcGetProcAddress = NULL; qalcGetEnumValue = NULL; qalcGetString = NULL; qalcGetIntegerv = NULL; qalcCaptureOpenDevice = NULL; qalcCaptureCloseDevice = NULL; qalcCaptureStart = NULL; qalcCaptureStop = NULL; qalcCaptureSamples = NULL; }
/* ==================== OGG_CloseLibrary Unload the VorbisFile DLL ==================== */ void OGG_CloseLibrary (void) { Sys_UnloadLibrary (&vf_dll); Sys_UnloadLibrary (&vo_dll); }
/** * @brief Loads a mod library. * #1 look in fs_homepath * #2 look in fs_basepath * #3 try to revert to the default mod library */ void *Sys_LoadGameDll(const char *name, qboolean extract, intptr_t(**entryPoint) (int, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); char fname[MAX_OSPATH]; char *basepath; char *homepath; char *gamedir; assert(name); Com_sprintf(fname, sizeof(fname), Sys_GetDLLName("%s"), name); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString("fs_basepath"); homepath = Cvar_VariableString("fs_homepath"); gamedir = Cvar_VariableString("fs_game"); // STORY TIME // //When doing an debug build just load the mod lib from the basepath as that will have the debug pointers // // Now the code always just unpacks new libraries from the packs on release builds. // So the libraryfiles in the homepath are always refreshed with latest from the packs. // This fixes many issues with clients loading old libraries from the mod paths. // // The way it used to work is described under (or in debug mode).. // // if the server is pure, extract the dlls from the mod_bin.pk3 so // that they can be referenced // // If the server is not pure, then the // lib must either already be in the homepath, or in the basepath, // without being in a pak. For a pure server, it always grabs the lib // from within a pak. This means there must be two copies of the lib! // // So now, if connecting to an impure server, and the lib was not // loaded from homepath or the basepath, let's pull it out of the pak. // This means we only *need* the copy that's in the pak, and will use // it if another copy isn't found first. #ifdef LEGACY_DEBUG #define SEARCHPATH1 basepath #define SEARCHPATH2 homepath #define LIB_DO_UNPACK Cvar_VariableIntegerValue("sv_pure") #else #define LIB_DO_UNPACK qtrue #define SEARCHPATH1 homepath #define SEARCHPATH2 basepath #endif #ifndef DEDICATED if (LIB_DO_UNPACK && extract) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); } #endif libHandle = Sys_TryLibraryLoad(SEARCHPATH1, gamedir, fname); if (!libHandle && SEARCHPATH2) { libHandle = Sys_TryLibraryLoad(SEARCHPATH2, gamedir, fname); } #ifndef DEDICATED if (!libHandle && !LIB_DO_UNPACK && extract) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); } #endif if (!libHandle) { Com_Printf("Sys_LoadDll(%s/%s) failed to load library\n", gamedir, name); return NULL; } dllEntry = (void (QDECL *)(intptr_t (QDECL *)(intptr_t, ...)))Sys_LoadFunction(libHandle, "dllEntry"); *entryPoint = (intptr_t (QDECL *)(int, ...))Sys_LoadFunction(libHandle, "vmMain"); if (!*entryPoint || !dllEntry) { Com_Printf("Sys_LoadDll(%s/%s) failed to find vmMain function:\n\"%s\" !\n", gamedir, name, Sys_LibraryError()); Sys_UnloadLibrary(libHandle); return NULL; } Com_Printf("Sys_LoadDll(%s/%s) found vmMain function at %p\n", gamedir, name, *entryPoint); dllEntry(systemcalls); return libHandle; }
/** * @brief Loads a mod library. * #1 look in fs_homepath * #2 look in fs_basepath * #3 try to revert to the default mod library */ void *Sys_LoadGameDll(const char *name, intptr_t(**entryPoint) (int, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); char fname[MAX_OSPATH]; char *basepath; char *homepath; char *gamedir; assert(name); Com_sprintf(fname, sizeof(fname), Sys_GetDLLName("%s"), name); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString("fs_basepath"); homepath = Cvar_VariableString("fs_homepath"); gamedir = Cvar_VariableString("fs_game"); #ifndef DEDICATED // if the server is pure, extract the dlls from the mod_bin.pk3 so // that they can be referenced if (Cvar_VariableValue("sv_pure") && Q_stricmp(name, "qagame")) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); } #endif libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); if (!libHandle && basepath) { libHandle = Sys_TryLibraryLoad(basepath, gamedir, fname); } #ifndef DEDICATED // According to the code above, if the server is not pure, then the // lib must either already be in the homepath, or in the basepath, // without being in a pak. For a pure server, it always grabs the lib // from within a pak. This means there must be two copies of the lib! // // So now, if connecting to an impure server, and the lib was not // loaded from homepath or the basepath, let's pull it out of the pak. // This means we only *need* the copy that's in the pak, and will use // it if another copy isn't found first. if (!libHandle && !Cvar_VariableValue("sv_pure") && Q_stricmp(name, "qagame")) { Com_Printf("Sys_LoadGameDll -> FS_CL_ExtractFromPakFile(%s, %s, %s)\n", homepath, gamedir, fname); FS_CL_ExtractFromPakFile(homepath, gamedir, fname); libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); } #endif // HACK: sometimes a library is loaded from the mod dir when it shouldn't. Why? if (!libHandle && strcmp(gamedir, DEFAULT_MODGAME)) { Com_Printf("Sys_LoadDll: failed to load the mod library. Trying to revert to the default one.\n"); libHandle = Sys_TryLibraryLoad(basepath, DEFAULT_MODGAME, fname); } if (!libHandle) { Com_Printf("Sys_LoadDll(%s) failed to load library\n", name); return NULL; } dllEntry = (void (QDECL *)(intptr_t (QDECL *)(intptr_t, ...)))Sys_LoadFunction(libHandle, "dllEntry"); *entryPoint = (intptr_t (QDECL *)(int, ...))Sys_LoadFunction(libHandle, "vmMain"); if (!*entryPoint || !dllEntry) { Com_Printf("Sys_LoadDll(%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); dllEntry(systemcalls); return libHandle; }
/** * @brief Used by Sys_LoadGameDll to get handle on a mod library * @return Handle to a mod library */ static void *Sys_TryLibraryLoad(const char *base, const char *gamedir, const char *fname) { void *libHandle; char *fn; #ifdef __MORPHOS__ int (*morphos_so_init)(void); void (*morphos_so_deinit)(void); #endif #ifdef __APPLE__ Com_Printf("Sys_LoadDll -> Sys_TryLibraryLoad(%s, %s, %s)... \n", base, gamedir, fname); libHandle = NULL; // Incoming is (for example) "cgame_mac" // What we may actually have is: // 1) A zipped .bundle package // 2) A .dylib without an extension // 3) A .dylib with an extension we need to append. // // In older versions of OS X (pre 10.5), dylibs could not be unloaded allowing the host process to reclaim that address space. // This is why .bundles were used instead. When W:ET originally shipped, it used used .bundle packages for the VM libraries, // but to make them single files, it zipped that .bundle package and had no extension at all (ie just "cgame_mac"). But now // that dylibs can be unloaded, there's no practical difference between the two (for W:ET's purposes), so using a single file // dylib is simpler. That's why we now support a dylib with some backward compatibility to allow .bundles. // 1: The zipped .bundle package { Com_Printf("-- Trying zipped .bundle... "); fn = FS_BuildOSPath(base, gamedir, fname); if (FS_Unzip(fn, qtrue)) { char buffer[MAX_OSPATH]; Com_sprintf(buffer, sizeof(buffer), "%s.bundle/Contents/MacOS/%s", fname, fname); fn = FS_BuildOSPath(Cvar_VariableString("fs_homepath"), gamedir, buffer); libHandle = Sys_LoadLibrary(fn); if (!libHandle) { Com_Printf("failed: \"%s\"\n", Sys_LibraryError()); } else { Com_Printf("succeeded\n"); } } else { Com_Printf("failed. (Not a zip).\n"); } } // 2: The dylib without an extension if (!libHandle) { fn = FS_BuildOSPath(base, gamedir, fname); Com_Printf("-- Trying extension-less dylib... "); libHandle = Sys_LoadLibrary(fn); if (!libHandle) { Com_Printf("failed: \"%s\"\n", Sys_LibraryError()); } else { Com_Printf("succeeded\n"); } } // 3: The dylib with an extension if (!libHandle) { char buffer[MAX_OSPATH]; Com_sprintf(buffer, sizeof(buffer), "%s.dylib", fname); fn = FS_BuildOSPath(Cvar_VariableString("fs_homepath"), gamedir, buffer); Com_Printf("-- Trying dylib with extension... "); libHandle = Sys_LoadLibrary(fn); if (!libHandle) { Com_Printf("failed: \"%s\"\n", Sys_LibraryError()); } else { Com_Printf("succeeded\n"); } } return libHandle; #else // __APPLE__ fn = FS_BuildOSPath(base, gamedir, fname); Com_Printf("Sys_LoadDll(%s)... ", fn); libHandle = Sys_LoadLibrary(fn); if (!libHandle) { Com_Printf("failed: \"%s\"\n", Sys_LibraryError()); return NULL; } #endif // __APPLE__ #ifdef __MORPHOS__ morphos_so_init = dlsym(libHandle, "morphos_so_init"); morphos_so_deinit = dlsym(libHandle, "morphos_so_deinit"); if (!(morphos_so_init && morphos_so_deinit && morphos_so_init())) { Com_Printf("failed: \"can't find the morphos_so_init and morphos_so_deinit symbols\"\n"); Sys_UnloadLibrary(libHandle); return NULL; } #endif Com_Printf("succeeded\n"); return libHandle; }
/** * @brief Loads a mod library. * #1 look in fs_homepath * #2 look in fs_basepath * #3 try to revert to the default mod library */ void *Sys_LoadDll(const char *name, intptr_t(**entryPoint) (int, ...), intptr_t (*systemcalls)(intptr_t, ...)) { void *libHandle; void (*dllEntry)(intptr_t (*syscallptr)(intptr_t, ...)); char fname[MAX_OSPATH]; char *basepath; char *homepath; char *gamedir; assert(name); Com_sprintf(fname, sizeof(fname), Sys_GetDLLName("%s"), name); // TODO: use fs_searchpaths from files.c basepath = Cvar_VariableString("fs_basepath"); homepath = Cvar_VariableString("fs_homepath"); gamedir = Cvar_VariableString("fs_game"); #ifndef DEDICATED // if the server is pure, extract the dlls from the mp_bin.pk3 so // that they can be referenced if (Cvar_VariableValue("sv_pure") && Q_stricmp(name, "qagame")) { FS_CL_ExtractFromPakFile(homepath, gamedir, fname); } #endif libHandle = Sys_TryLibraryLoad(homepath, gamedir, fname); if (!libHandle && basepath) { libHandle = Sys_TryLibraryLoad(basepath, gamedir, fname); } // HACK: sometimes a library is loaded from the mod dir when it shouldn't. Why? if (!libHandle && strcmp(gamedir, DEFAULT_MODGAME)) { Com_Printf("Sys_LoadDll: failed to load the mod library. Trying to revert to the default one.\n"); libHandle = Sys_TryLibraryLoad(basepath, DEFAULT_MODGAME, fname); } if (!libHandle) { Com_Printf("Sys_LoadDll(%s) failed to load library\n", name); return NULL; } dllEntry = (void (QDECL *)(intptr_t (QDECL *)(intptr_t, ...)))Sys_LoadFunction(libHandle, "dllEntry"); *entryPoint = (intptr_t (QDECL *)(int, ...))Sys_LoadFunction(libHandle, "vmMain"); if (!*entryPoint || !dllEntry) { Com_Printf("Sys_LoadDll(%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); dllEntry(systemcalls); return libHandle; }
/* ==================== ModPlug_CloseLibrary Unload the modplugFile DLL ==================== */ void ModPlug_CloseLibrary (void) { Sys_UnloadLibrary (&modplug_dll); }
/* ==================== CURL_CloseLibrary Unload the cURL DLL ==================== */ static void CURL_CloseLibrary (void) { Sys_UnloadLibrary (&curl_dll); }