From e5eaf0fa9e3b1038b76afa2ce3c10d97f7d52c66 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sat, 8 Oct 2022 22:14:26 +0300 Subject: [PATCH] tier1: rewrite Sys_LoadModule --- filesystem/basefilesystem.cpp | 11 +--- tier1/interface.cpp | 97 ++++++++++++++++++++++++----------- vgui2/vgui_controls/HTML.cpp | 2 +- 3 files changed, 71 insertions(+), 39 deletions(-) diff --git a/filesystem/basefilesystem.cpp b/filesystem/basefilesystem.cpp index fe692870..a7e5ef0a 100644 --- a/filesystem/basefilesystem.cpp +++ b/filesystem/basefilesystem.cpp @@ -5042,10 +5042,11 @@ CSysModule *CBaseFileSystem::LoadModule( const char *pFileName, const char *pPat char tempPathID[ MAX_PATH ]; ParsePathID( pFileName, pPathID, tempPathID ); - + CUtlSymbol lookup = g_PathIDTable.AddString( pPathID ); // a pathID has been specified, find the first match in the path list +#ifndef ANDROID int c = m_SearchPaths.Count(); for ( int i = 0; i < c; i++ ) { @@ -5071,14 +5072,6 @@ CSysModule *CBaseFileSystem::LoadModule( const char *pFileName, const char *pPat return pModule; #endif } - - -#ifdef POSIX - if( !pModule ) - { - Q_snprintf( tempPathID, sizeof(tempPathID), "lib%s", pFileName ); - pModule = Sys_LoadModule( tempPathID ); - } #endif if( !pModule ) diff --git a/tier1/interface.cpp b/tier1/interface.cpp index c605845e..78dacc82 100644 --- a/tier1/interface.cpp +++ b/tier1/interface.cpp @@ -258,7 +258,7 @@ HMODULE Sys_LoadLibrary( const char *pLibraryName, Sys_Flags flags ) const char *pError = dlerror(); if ( pError && ( strstr( pError, "No such file" ) == 0 ) && ( strstr( pError, "image not found" ) == 0 ) ) { - Msg( " failed to dlopen %s error=%s\n", str, pError ); + Msg( "failed to dlopen %s error=%s\n", str, pError ); } } @@ -267,6 +267,36 @@ HMODULE Sys_LoadLibrary( const char *pLibraryName, Sys_Flags flags ) } static bool s_bRunningWithDebugModules = false; +#ifdef POSIX + +#ifdef ANDROID +#define DEFAULT_LIB_PATH "" +#else +#define DEFAULT_LIB_PATH "bin/" +#endif + +bool foundLibraryWithPrefix( char *pModuleAbsolutePath, size_t AbsolutePathSize, const char *pPath, const char *pModuleName ) +{ + char str[1024]; + Q_strncpy( str, pModuleName, sizeof(str) ); + V_SetExtension( str, DLL_EXT_STRING, sizeof(str) ); + bool bFound = false; + + struct stat statBuf; + Q_snprintf(pModuleAbsolutePath, AbsolutePathSize, "%s/" DEFAULT_LIB_PATH "lib%s", pPath, str); + bFound |= stat(pModuleAbsolutePath, &statBuf) == 0; + + if( !bFound ) + { + Q_snprintf(pModuleAbsolutePath, AbsolutePathSize, "%s/" DEFAULT_LIB_PATH "%s", pPath, str); + bFound |= stat(pModuleAbsolutePath, &statBuf) == 0; + } + + return bFound; +} + +#endif + //----------------------------------------------------------------------------- // Purpose: Loads a DLL/component from disk and returns a handle to it // Input : *pModuleName - filename of the component @@ -301,52 +331,61 @@ CSysModule *Sys_LoadModule( const char *pModuleName, Sys_Flags flags /* = SYS_NO szCwd[strlen(szCwd) - 1] = 0; } - char szAbsoluteModuleName[1024]; - bool bUseLibPrefix = false; - + char szAbsoluteModuleName[2048]; #ifdef ANDROID - struct stat statBuf; char *libPath = getenv("APP_LIB_PATH"); - char *modLibPath = getenv("APP_MOD_LIB"); + bool bFound; + if( modLibPath && *modLibPath ) // first load library from mod launcher { - bool bFound = true; - Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/lib%s", modLibPath, pModuleName); - if( stat(szAbsoluteModuleName, &statBuf) != 0 ) - { - Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/%s", modLibPath, pModuleName); - if( stat(szAbsoluteModuleName, &statBuf) != 0 ) - bFound = false; - } + bFound = foundLibraryWithPrefix( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), modLibPath, pModuleName ); - hDLL = Sys_LoadLibrary(szAbsoluteModuleName, flags); + if( bFound ) + hDLL = Sys_LoadLibrary( szAbsoluteModuleName, flags ); if( !hDLL && bFound ) - Error("Can't load mod library %s\n", szAbsoluteModuleName); + Error("Can't find mod library %s\n", szAbsoluteModuleName); } - Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/lib%s", libPath ,pModuleName); - if( stat(szAbsoluteModuleName, &statBuf) != 0 ) - Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/%s", libPath ,pModuleName); + if( !foundLibraryWithPrefix( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), libPath, pModuleName ) ) + { + Warning("Can't find module - %s\n", pModuleName); + return reinterpret_cast(hDLL); + } + +#elif defined( POSIX ) + if( !foundLibraryWithPrefix(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), szCwd, pModuleName) ) + { + Warning("Can't find module - %s\n", pModuleName); + return reinterpret_cast(hDLL); + } #else -#ifdef POSIX - struct stat statBuf; - Q_snprintf(szModuleName, sizeof(szModuleName), "bin/lib%s", pModuleName); - bUseLibPrefix |= stat(szModuleName, &statBuf) == 0; + Q_snprintf( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/bin/%s", szCwd, pModuleName ); #endif - if( bUseLibPrefix ) - Q_snprintf( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/bin/lib%s", szCwd, pModuleName ); - else - Q_snprintf( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/bin/%s", szCwd, pModuleName ); -#endif // ANDROID Msg("LoadLibrary: pModule: %s, path: %s\n", pModuleName, szAbsoluteModuleName); if( !hDLL ) hDLL = Sys_LoadLibrary( szAbsoluteModuleName, flags ); } else - Msg("LoadLibrary: path: %s\n", pModuleName); + { +#ifdef POSIX + Q_strncpy( szModuleName, pModuleName, sizeof(szModuleName) ); + V_SetExtension( szModuleName, DLL_EXT_STRING, sizeof(szModuleName) ); + + struct stat statBuf; + bool bFound = stat(szModuleName, &statBuf) == 0; + + if( !bFound ) + { + Warning("Can't find module - %s\n", pModuleName); + return reinterpret_cast(hDLL); + } + + Msg("LoadLibrary: path: %s\n", szModuleName); +#endif + } if ( !hDLL ) diff --git a/vgui2/vgui_controls/HTML.cpp b/vgui2/vgui_controls/HTML.cpp index 515794f8..4f38a9c0 100644 --- a/vgui2/vgui_controls/HTML.cpp +++ b/vgui2/vgui_controls/HTML.cpp @@ -155,7 +155,7 @@ m_HideTooltip( this, &HTML::BrowserHideToolTip ) } else { - Warning("Unable to access SteamHTMLSurface"); + Warning("Unable to access SteamHTMLSurface\n"); } m_iScrollBorderX=m_iScrollBorderY=0; m_bScrollBarEnabled = true;