Index: mow/source/loader/loader.c =================================================================== RCS file: /cvs/installation/setup2/mow/source/loader/loader.c,v retrieving revision 1.25.2.2 diff -u -r1.25.2.2 loader.c --- mow/source/loader/loader.c 31 May 2002 10:05:03 -0000 1.25.2.2 +++ mow/source/loader/loader.c 26 Feb 2003 07:33:44 -0000 @@ -98,7 +98,11 @@ #include #include #include +#ifdef MACOSX +#include +#else #include +#endif #ifndef _LOADER_CXX #include @@ -646,6 +650,10 @@ " LD_LIBRARY_PATH=.:./lib:$LD_LIBRARY_PATH\n" \ " export LD_LIBRARY_PATH\n" \ " ;;\n" \ +" Darwin)\n" \ +" DYLD_LIBRARY_PATH=.:./lib:$DYLD_LIBRARY_PATH\n" \ +" export DYLD_LIBRARY_PATH\n" \ +" ;;\n" \ " *)\n" \ " ;;\n" \ "esac\n" \ @@ -2649,6 +2657,30 @@ return !bErr; } +void * loader_get_symbol_from_lib( void *libPtr, char *pSymbolName ) +{ +#ifdef MACOSX + NSSymbol *symbol; + void *pSymbolAddress; + char pDylibSymbolName[ 200 ]; + + // FIXME use NSLinkEditError() for better error messages + snprintf( pDylibSymbolName, 199, "_%s", pSymbolName ); + symbol = NSLookupSymbolInImage( libPtr, pDylibSymbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND ); + if (symbol) + pSymbolAddress = NSAddressOfSymbol( symbol ); + else + { + fprintf( stderr, "NSLookupSymbolInImage() returned NULL for %s!\n", pSymbolName ); + pSymbolAddress = NULL; + } +#else + pSymbolAddress = dlsym( libPtr, pSymbolName ); +#endif + + return( pSymbolAddress ); +} + typedef unsigned long oslFileError; typedef oslFileError (SAL_CALL * getSystemPathFromFileURL_Func)( rtl_uString *, rtl_uString **); typedef void (SAL_CALL * uString_newFromAscii_Func)( rtl_uString **, const sal_Char * ); @@ -2662,22 +2694,46 @@ { // Load library BOOL bRet = FALSE; +#ifdef MACOSX + struct mach_header *hLib, *hLib2; +#else void *hLib, *hLib2; - char strSALInTemp[ __MAX_PATH ]; +#endif + char strSALInTemp[ __MAX_PATH ]; - strcpy( strSALInTemp, strTmpPath ); - strcat( strSALInTemp, "/" ); - strcat( strSALInTemp, STL_FILE_PATTERN ); + strcpy( strSALInTemp, strTmpPath ); + strcat( strSALInTemp, "/" ); + strcat( strSALInTemp, STL_FILE_PATTERN ); +#ifdef MACOSX + // Check if library is already loaded + hLib = NSAddImage( strSALInTemp, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED ); + if (!hLib) + { + // Check DYLD_LIBRARY_PATH + hLib = NSAddImage( strSALInTemp, NSADDIMAGE_OPTION_WITH_SEARCHING ); + } +#else hLib = dlopen( strSALInTemp, RTLD_LAZY ); +#endif if ( !hLib ) return bRet; strcpy( strSALInTemp, strTmpPath ); - strcat( strSALInTemp, "/" ); - strcat( strSALInTemp, strSalLibName ); + strcat( strSALInTemp, "/" ); + strcat( strSALInTemp, strSalLibName ); +#ifdef MACOSX + // Check if library is already loaded + hLib2 = NSAddImage( strSALInTemp, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED ); + if (!hLib) + { + // Check DYLD_LIBRARY_PATH + hLib2 = NSAddImage( strSALInTemp, NSADDIMAGE_OPTION_WITH_SEARCHING ); + } +#else hLib2 = dlopen( strSALInTemp, RTLD_LAZY ); +#endif if ( hLib2 ) { @@ -2692,12 +2748,13 @@ string_release_Func string_release; uString_release_Func uString_release; - uString2String = dlsym( hLib2, "rtl_uString2String"); - uString_newFromAscii = dlsym( hLib2, "rtl_uString_newFromAscii"); - getSystemPathFromFileURL = dlsym( hLib2, "osl_getSystemPathFromFileURL"); - getTextEncoding = dlsym( hLib2, "osl_getThreadTextEncoding"); - string_release = dlsym( hLib2, "rtl_string_release"); - uString_release = dlsym( hLib2, "rtl_uString_release"); + uString2String = loader_get_symbol_from_lib( hLib2, "rtl_uString2String" ); + uString_newFromAscii = loader_get_symbol_from_lib( hLib2, "rtl_uString_newFromAscii"); + + getSystemPathFromFileURL = loader_get_symbol_from_lib( hLib2, "osl_getSystemPathFromFileURL"); + getTextEncoding = loader_get_symbol_from_lib( hLib2, "osl_getThreadTextEncoding"); + string_release = loader_get_symbol_from_lib( hLib2, "rtl_string_release"); + uString_release = loader_get_symbol_from_lib( hLib2, "rtl_uString_release"); if ( !uString_newFromAscii || !getSystemPathFromFileURL || !uString2String || !getTextEncoding || !string_release || @@ -2722,15 +2779,27 @@ bRet = TRUE; } uString_release( pFileURL ); + #ifdef MACOSX + /* Can't close dylibs on OS X at this time... */ + #else dlclose( hLib2 ); - } + #endif + } else { + #ifdef MACOSX + fprintf( stderr, "\ncould not load dll %s", strSALInTemp ); + #else char *pError = dlerror(); fprintf( stderr, "\ncould not load dll: '%s'", pError ); + #endif } + #ifdef MACOSX + /* Can't close dylibs on OS X at this time... */ + #else dlclose( hLib ); + #endif return bRet; }