void sysproc_init() { SYSPROC * proc = sysprocs ; void * library = NULL ; const char * filename ; unsigned int n ; DLVARFIXUP * globals_fixup = NULL ; DLVARFIXUP * locals_fixup = NULL ; DLSYSFUNCS * functions_exports = NULL ; FN_HOOK module_initialize ; FN_HOOK module_finalize ; INSTANCE_HOOK instance_create_hook ; INSTANCE_HOOK instance_destroy_hook ; INSTANCE_HOOK instance_pre_execute_hook ; INSTANCE_HOOK instance_pos_execute_hook ; INSTANCE_HOOK process_exec_hook ; HOOK * handler_hooks = NULL ; int maxcode = 0 ; char soname[ __MAX_PATH ], fullsoname[ __MAX_PATH ], **spath ; #if defined( WIN32 ) #define DLLEXT ".dll" #elif defined(TARGET_MAC) #define DLLEXT ".dylib" #else #define DLLEXT ".so" #endif for ( n = 0; n < dcb.data.NImports; n++ ) { filename = string_get( dcb.imports[n] ) ; snprintf( soname, __MAX_PATH, "%s" DLLEXT, filename ); filename = soname ; /* Load library */ if ( debug ) printf ("Loading... %s\n", filename ); fullsoname[0] = '\0'; library = NULL; spath = dlsearchpath; while( !library && spath && *spath ) { sprintf( fullsoname, "%s%s/%s", appexepath, *spath, filename ); library = dlibopen( fullsoname ) ; spath++; } if ( !library ) library = dlibopen( filename ) ; if ( !library ) { printf( dliberror() ) ; exit( 0 ); } globals_fixup = ( DLVARFIXUP * ) _dlibaddr( library, "globals_fixup" ) ; locals_fixup = ( DLVARFIXUP * ) _dlibaddr( library, "locals_fixup" ) ; functions_exports = ( DLSYSFUNCS * ) _dlibaddr( library, "functions_exports" ) ; module_initialize = ( FN_HOOK ) _dlibaddr( library, "module_initialize" ) ; module_finalize = ( FN_HOOK ) _dlibaddr( library, "module_finalize" ) ; instance_create_hook = ( INSTANCE_HOOK ) _dlibaddr( library, "instance_create_hook" ) ; instance_destroy_hook = ( INSTANCE_HOOK ) _dlibaddr( library, "instance_destroy_hook" ) ; instance_pre_execute_hook = ( INSTANCE_HOOK ) _dlibaddr( library, "instance_pre_execute_hook" ) ; instance_pos_execute_hook = ( INSTANCE_HOOK ) _dlibaddr( library, "instance_pos_execute_hook" ) ; process_exec_hook = ( INSTANCE_HOOK ) _dlibaddr( library, "process_exec_hook" ) ; handler_hooks = ( HOOK * ) _dlibaddr( library, "handler_hooks" ) ; /* Fixups */ if ( globals_fixup ) { while ( globals_fixup->var ) { get_var_info( globals_fixup, dcb.glovar, dcb.data.NGloVars, globaldata ); globals_fixup++; } } if ( locals_fixup ) { while ( locals_fixup->var ) { get_var_info( locals_fixup, dcb.locvar, dcb.data.NLocVars, NULL ); locals_fixup++; } } sysproc_add_tab( functions_exports ) ; if ( module_initialize ) hook_add( module_initialize, module_initialize_list, module_initialize_allocated, module_initialize_count ) ; if ( module_finalize ) hook_add( module_finalize, module_finalize_list, module_finalize_allocated, module_finalize_count ) ; if ( instance_create_hook ) hook_add( instance_create_hook, instance_create_hook_list, instance_create_hook_allocated, instance_create_hook_count ) ; if ( instance_destroy_hook ) hook_add( instance_destroy_hook, instance_destroy_hook_list, instance_destroy_hook_allocated, instance_destroy_hook_count ) ; if ( instance_pre_execute_hook ) hook_add( instance_pre_execute_hook, instance_pre_execute_hook_list, instance_pre_execute_hook_allocated, instance_pre_execute_hook_count ) ; if ( instance_pos_execute_hook ) hook_add( instance_pos_execute_hook, instance_pos_execute_hook_list, instance_pos_execute_hook_allocated, instance_pos_execute_hook_count ) ; if ( process_exec_hook ) hook_add( process_exec_hook, process_exec_hook_list, process_exec_hook_allocated, process_exec_hook_count ) ; while ( handler_hooks && handler_hooks->hook ) { hook_add( *handler_hooks, handler_hook_list, handler_hook_allocated, handler_hook_count ) ; handler_hooks++; } } if ( debug ) printf ("\n"); /* System Procs FixUp */ sysprocs_fixup(); proc = sysprocs ; while ( proc->func ) { if ( maxcode < proc->code ) maxcode = proc->code ; proc++ ; } sysproc_tab = calloc( maxcode + 1 , sizeof( SYSPROC * ) ); proc = sysprocs ; while ( proc->func ) { if ( proc->code > -1 ) sysproc_tab[proc->code] = proc ; proc++ ; } /* Sort handler_hooks */ if ( handler_hook_list ) qsort( handler_hook_list, handler_hook_count, sizeof( handler_hook_list[0] ), ( int ( * )( const void *, const void * ) ) compare_priority ) ; /* Initialize all modules */ if ( module_initialize_count ) for ( n = 0; n < module_initialize_count; n++ ) module_initialize_list[n](); }
void describe_module( char *filename ) { void * library = NULL; char ** types_def = NULL; char ** globals_def = NULL; char ** locals_def = NULL; DLCONSTANT * constants_def = NULL; DLSYSFUNCS * functions_exports = NULL; char ** modules_dependency = NULL; DLVARFIXUP * globals_fixup = NULL; DLVARFIXUP * locals_fixup = NULL; HOOK * handler_hooks = NULL; void ( * RegisterFunctions )( void *( * )( const char * ), int ( * )( char *, char *, int, void * ) ) = NULL ; int misc = 0; char soname[1024]; char * ptr; char ** pex; #if defined( WIN32 ) #define DLLEXT ".dll" #define SIZEDLLEXT 4 #elif defined(TARGET_MAC) #define DLLEXT ".dylib" #define SIZEDLLEXT 6 #else #define DLLEXT ".so" #define SIZEDLLEXT 3 #endif strncpy ( soname, filename, sizeof ( soname ) ); for ( ptr = soname; *ptr; ptr++ ) { *ptr = tolower( *ptr ); } pex = modules_exts; while ( pex && * pex ) { int nlen = strlen ( soname ); int elen = strlen ( *pex ); if ( nlen > elen && strcmp( &soname[nlen - elen], *pex ) == 0 ) { soname[nlen - elen] = '\0' ; pex = modules_exts; } else { pex++; } } strcat( soname, DLLEXT ); filename = soname; library = dlibopen( filename ) ; if ( !library ) { printf( "ERROR: %s library not found\n", filename ) ; return; } printf( "Module name: %s\n\n", filename ); constants_def = ( DLCONSTANT * ) _dlibaddr( library, "constants_def" ) ; if ( constants_def ) { printf( "Constants:\n\n" ); fflush( stdout ); while ( constants_def->name ) { describe_type( constants_def->type ); fflush( stdout ); printf( " %s = %d\n", constants_def->name, constants_def->code ); fflush( stdout ); constants_def++ ; } printf( "\n\n" ); } types_def = ( char ** ) _dlibaddr( library, "types_def" ) ; if ( types_def && *types_def ) { printf( "Types:\n\n%s\n\n", *types_def ); } globals_def = ( char ** ) _dlibaddr( library, "globals_def" ) ; if ( globals_def && *globals_def ) { printf( "Globals:\n\n%s\n\n", *globals_def ); } locals_def = ( char ** ) _dlibaddr( library, "locals_def" ) ; if ( locals_def && *locals_def ) { printf( "Locals:\n\n%s\n\n", *locals_def ); } functions_exports = ( DLSYSFUNCS * ) _dlibaddr( library, "functions_exports" ) ; if ( functions_exports ) { printf( "Functions:\n\n" ); while ( functions_exports->name ) { describe_func( functions_exports->name, functions_exports->paramtypes, functions_exports->type, NULL ); functions_exports++; } printf( "\n\n" ); } modules_dependency = ( char ** ) _dlibaddr( library, "modules_dependency" ) ; if ( modules_dependency ) { printf( "Module Dependency:\n\n" ); while ( *modules_dependency ) { printf( "%s\n", *modules_dependency ); modules_dependency++; } printf( "\n\n" ); } globals_fixup = ( DLVARFIXUP * ) _dlibaddr( library, "globals_fixup" ) ; if ( globals_fixup ) { printf( "Globals vars dependency:\n\n" ); while ( globals_fixup->var ) { printf( "%s\n", globals_fixup->var ); globals_fixup++; } printf( "\n\n" ); } locals_fixup = ( DLVARFIXUP * ) _dlibaddr( library, "locals_fixup" ) ; if ( locals_fixup ) { printf( "Locals vars dependency:\n\n" ); while ( locals_fixup->var ) { printf( "%s\n", locals_fixup->var ); locals_fixup++; } printf( "\n\n" ); } #define CallbackHeaders() if (!misc) { misc = 1; printf ("Internals callbacks:\n\n"); } if ( _dlibaddr( library, "module_initialize" ) ) { CallbackHeaders(); printf( "module_initialize\n" ); } if ( _dlibaddr( library, "module_finalize" ) ) { CallbackHeaders(); printf( "module_finalize\n" ); } if ( _dlibaddr( library, "instance_create_hook" ) ) { CallbackHeaders(); printf( "instance_create_hook\n" ); } if ( _dlibaddr( library, "instance_destroy_hook" ) ) { CallbackHeaders(); printf( "instance_destroy_hook\n" ); } if ( _dlibaddr( library, "instance_pre_execute_hook" ) ) { CallbackHeaders(); printf( "instance_pre_execute_hook\n" ); } if ( _dlibaddr( library, "instance_pos_execute_hook" ) ) { CallbackHeaders(); printf( "instance_pos_execute_hook\n" ); } if ( _dlibaddr( library, "process_exec_hook" ) ) { CallbackHeaders(); printf( "process_exec_hook\n" ); } if ( misc ) printf( "\n\n" ); handler_hooks = ( HOOK * ) _dlibaddr( library, "handler_hooks" ) ; if ( handler_hooks ) { int i = 0; printf( "Hooks at priorities: " ); while ( handler_hooks->hook ) { printf( "%d", handler_hooks->prio ); handler_hooks++; if ( handler_hooks->hook ) printf( ", " ); i++; } printf( "\n\n" ); } RegisterFunctions = _dlibaddr( library, "RegisterFunctions" ) ; if ( RegisterFunctions ) { printf( "Fenix support:\n\n" ); ( *RegisterFunctions )( fnc_import, describe_func ) ; } }