diff options
Diffstat (limited to 'tests/library/test_loader.c')
-rw-r--r-- | tests/library/test_loader.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/tests/library/test_loader.c b/tests/library/test_loader.c index 37b549b..60f2514 100644 --- a/tests/library/test_loader.c +++ b/tests/library/test_loader.c @@ -27,6 +27,16 @@ #define LIBRARY_NAME "./testlib.so.0.0.0" #endif #define LIBRARY_FUNC "multiply_by_two" +#define LIBRARY_VAR "seven" +#define LIBRARY_STRUCT "mod_descr" + +typedef int (*multiply_by_two_func)( int ); + +typedef struct { + int major; + int minor; + multiply_by_two_func func; +} module_descriptor_t; int main( void ) { wolf_library_p library; @@ -36,6 +46,8 @@ int main( void ) { WOLF_LIBRARY_FUNCPTR symbol; multiply_by_two_func func; int res = 0; + int *var; + module_descriptor_t *mod_descr; /* open the libray */ library = wolf_library_load( LIBRARY_NAME, &error ); @@ -49,7 +61,7 @@ int main( void ) { } /* fetch a known function symbol (multiply_by_two) */ - symbol = wolf_library_get_func( library, LIBRARY_FUNC, &error ); + symbol = wolf_library_get( library, LIBRARY_FUNC, &error ); if( error != WOLF_OK ) { fprintf( stderr, "Error %d (%s) fetching function '%s' from the library\n", error, wolf_error_msg( error, errbuf, 512 ), LIBRARY_FUNC ); @@ -62,8 +74,35 @@ int main( void ) { /* call it */ res = func( 7 ); + printf( "func(7) = %d\n", res ); assert( res == 14 ); + /* fetch address as address to a variable (seven) */ + var = (int *)wolf_library_get( library, LIBRARY_VAR, &error ); + if( error != WOLF_OK ) { + fprintf( stderr, "Error %d (%s) fetching variable '%s' from the library\n", + error, wolf_error_msg( error, errbuf, 512 ), LIBRARY_VAR ); + fprintf( stderr, "Internal loader error: %s\n", + wolf_library_error_msg( library, errbuf, 512 ) ); + (void)wolf_library_unload( library ); + return EXIT_FAILURE; + } + printf( "var = %d\n", *var ); + assert( *var == 7 ); + + /* fetch something complex (in this case something like a module descriptor) */ + mod_descr = (module_descriptor_t *)wolf_library_get( library, LIBRARY_STRUCT, &error ); + if( error != WOLF_OK ) { + fprintf( stderr, "Error %d (%s) fetching structure '%s' from the library\n", + error, wolf_error_msg( error, errbuf, 512 ), LIBRARY_STRUCT ); + fprintf( stderr, "Internal loader error: %s\n", + wolf_library_error_msg( library, errbuf, 512 ) ); + (void)wolf_library_unload( library ); + return EXIT_FAILURE; + } + printf( "module version: %d.%d\n", mod_descr->major, mod_descr->minor ); + assert( mod_descr->major == 1 && mod_descr->minor == 0 ); + /* close library */ error = wolf_library_unload( library ); if( error != WOLF_OK ) { |