Esempio n. 1
0
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]();
}
Esempio n. 2
0
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 ) ;
    }
}