DECLARE_TEST( library, lookup ) { object_t lib = 0; object_t otherlib = 0; void* symbol = 0; #if FOUNDATION_PLATFORM_WINDOWS const char* libraryname = "kernel32"; const char* symbolname = "ExitProcess"; #elif FOUNDATION_PLATFORM_APPLE const char* libraryname = "dl"; const char* symbolname = "dlsym"; #elif FOUNDATION_PLATFORM_POSIX const char* libraryname = "dl"; const char* symbolname = "dlsym"; #else const char* libraryname = "somelib"; const char* symbolname = "somesym"; #endif lib = library_load( libraryname ); EXPECT_NE( lib, 0 ); otherlib = library_load( libraryname ); EXPECT_EQ( lib, otherlib ); library_unload( otherlib ); library_unload( 0 ); otherlib = 0; log_set_suppress( 0, ERRORLEVEL_WARNING ); EXPECT_EQ( library_load( "this_library_should_not_exist" ), 0 ); log_set_suppress( 0, ERRORLEVEL_DEBUG ); EXPECT_TRUE( library_valid( lib ) ); EXPECT_FALSE( library_valid( 0 ) ); symbol = library_symbol( lib, symbolname ); EXPECT_NE( symbol, 0 ); EXPECT_EQ( library_symbol( 0, symbolname ), 0 ); library_unload( lib ); EXPECT_EQ( library_symbol( lib, symbolname ), 0 ); EXPECT_FALSE( library_valid( lib ) ); return 0; }
uint64_t system_hostid( void ) { unsigned char hostid[8] = {0}; IP_ADAPTER_INFO adapter_info[16]; unsigned int status, i, j; unsigned long buffer_length; DWORD (STDCALL *fn_get_adapters_info)( PIP_ADAPTER_INFO, PULONG ) = 0; if( !_system_library_iphlpapi ) _system_library_iphlpapi = library_load( "iphlpapi" ); if( _system_library_iphlpapi ) fn_get_adapters_info = (DWORD (STDCALL *)( PIP_ADAPTER_INFO, PULONG ))library_symbol( _system_library_iphlpapi, "GetAdaptersInfo" ); if( !fn_get_adapters_info ) return 0; buffer_length = sizeof( adapter_info ); // Save memory size of buffer memset( adapter_info, 0, sizeof( adapter_info ) ); status = fn_get_adapters_info( adapter_info, &buffer_length ); if( status == ERROR_SUCCESS ) for( i = 0; i < 16; ++i ) { if( adapter_info[i].Type == MIB_IF_TYPE_ETHERNET ) { for( j = 0; j < 6; ++j ) hostid[5-j] = adapter_info[i].Address[j]; break; } } return *(uint64_t*)hostid; }
bool PluginHandler_addPlugin(const char* basePath, const char* plugin) { void* (* initPlugin)(RegisterPlugin* registerPlugin, void* private_data); struct PluginPrivateData data; object_t lib = 0; const char* filename = 0; void* function; if (!basePath || !plugin) goto error; filename = buildLoadingPath(basePath, plugin); lib = library_load(filename); if (!library_valid(lib)) { // TODO: Show error message pd_error("Unable to open %s\n", filename); goto error; } if (!(function = library_symbol(lib, "InitPlugin"))) { // TODO: Show error message pd_error("Unable to find InitPlugin function in plugin %s\n", filename); goto error; } *(void**)(&initPlugin) = function; data.name = plugin; data.lib = lib; data.fullFilename = filename; initPlugin(registerPlugin, (void*)&data); return true; error: if (library_valid(lib)) library_unload(lib); return false; }