/* Copyright (C) 2008 Andreas Baumann This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "library/loader.h" #include /* for EXIT_SUCCESS, EXIT_FAILURE */ #include /* for fprintf */ #include /* for assert */ #ifdef _WIN32 #define LIBRARY_NAME "testlib.dll" #else #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; wolf_error_t error; char errbuf[512]; 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 ); if( error != WOLF_OK ) { fprintf( stderr, "Error %d (%s) loading library '%s':\n", error, wolf_error_msg( error, errbuf, 512 ), LIBRARY_NAME ); fprintf( stderr, "Internal loader error: %s\n", wolf_library_error_msg( library, errbuf, 512 ) ); (void)wolf_library_unload( library ); return EXIT_FAILURE; } /* fetch a known function symbol (multiply_by_two) */ 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 ); fprintf( stderr, "Internal loader error: %s\n", wolf_library_error_msg( library, errbuf, 512 ) ); (void)wolf_library_unload( library ); return EXIT_FAILURE; } WOLF_LIBRARY_FUNC_CAST( symbol, multiply_by_two_func, func ); /* 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 ) { fprintf( stderr, "Error %d (%s) unloading the library\n", error, wolf_error_msg( error, errbuf, 512 ) ); fprintf( stderr, "Internal loader error: %s\n", wolf_library_error_msg( library, errbuf, 512 ) ); return EXIT_FAILURE; } return EXIT_SUCCESS; }