예제 #1
0
/* Scans the backend plugin directory and links to any plugins found there. This
 * should be called from the main() function, prior to any calls being made to
 * get_resource().
 */
int register_backend_plugins()
{
    std::string backend_dir = get_config ( "backend_plugin_dir" );

    main_log ( "Getting backend plugins from" + backend_dir, NOTICE );
    DIR* backends;
    struct dirent* next_file;
    std::string filepath;
    void* handle;
    char *dl_status_ptr;;
    std::string dl_status;

    if ( ! ( backends=opendir ( backend_dir.c_str() ) ) )
    {
        int e_no = errno;
        main_log ( "Failed to open backend plugin directory " + backend_dir + ". Exiting...", ERROR );
        error ( EXIT_FAILURE,e_no,"Opening directory failed" );
    }

    errno = 0;
    while ( ( next_file = readdir ( backends ) ) )
    {
        filepath = backend_dir + "/" +  next_file->d_name;
        main_log ( "Considering " + filepath + " as a plugin.", DEBUG );
        if ( filepath.substr ( filepath.size()-3 ) != ".so" )
        {
            continue;
        }
        main_log << INFO << filepath << " seems to be a plugin. Linking...\n" ;
        handle = dlopen ( filepath.c_str(),RTLD_NOW );
        if ( !handle )
        {
            main_log ( std::string ( "Failed to link to plugin " ) + next_file->d_name + ": " + dlerror(),ERROR );
            error ( EXIT_FAILURE,0,"Linking plugin failed" );
        }
        else
        {
            main_log << DEBUG << "Opened plugin " << filepath
                     << " for linking.\n";
        }

        std::list<backend_t> ( *register_backend ) ();

        // Clear the dlerror
        dlerror();
        main_log ( "Cleared the error buffer. Trying to link...\n",INFO );
        register_backend = ( register_backend_fn ) ( void* ) dlsym ( handle,"register_backend" );
        main_log ( "Link complete. Checking status...", DEBUG );
        dl_status_ptr = dlerror();
        if ( dl_status_ptr ) dl_status = dl_status_ptr;
        main_log ( "Status is " + dl_status );
        if ( dl_status.size() )
        {
            main_log ( std::string ( "Failed to get symbol for 'register_backend': " ) + dl_status, ERROR );
            error ( EXIT_FAILURE,0,"Getting symbol failed." );
        }
        else
        {
            main_log ( "Got the 'register_backend' symbol.", DEBUG );
        }

        main_log ( "Attempting to register backends...", DEBUG );
        std::list<backend_t> result_list = register_backend();
        main_log ( "Got backend list.", DEBUG );

        /* Attempt to add each file extension returned to the handler list. */
        for ( auto candidate : result_list )
        {
            for ( auto current : plugin_list )
            {
                if ( candidate.str == current.str && candidate.priority < current.priority )
                {
                    current = candidate;
                    main_log ( "Replaced handler with extension " + current.str + " to list.", DEBUG );
                    goto success;
                }
            }
            plugin_list.push_back ( candidate );
            main_log ( "Added handler with extension " + candidate.str + " to list.", DEBUG );
success:
            ;
        }
        main_log ( "Finished getting backends.",DEBUG );
    }
    closedir ( backends );
    return 0;
}
예제 #2
0
GncSqlBackend::ObjectBackendRegistry::ObjectBackendRegistry()
{
    register_backend(std::make_shared<GncSqlBookBackend>());
    register_backend(std::make_shared<GncSqlCommodityBackend>());
    register_backend(std::make_shared<GncSqlAccountBackend>());
    register_backend(std::make_shared<GncSqlBudgetBackend>());
    register_backend(std::make_shared<GncSqlPriceBackend>());
    register_backend(std::make_shared<GncSqlTransBackend>());
    register_backend(std::make_shared<GncSqlSplitBackend>());
    register_backend(std::make_shared<GncSqlSlotsBackend>());
    register_backend(std::make_shared<GncSqlRecurrenceBackend>());
    register_backend(std::make_shared<GncSqlSchedXactionBackend>());
    register_backend(std::make_shared<GncSqlLotsBackend>());
    register_backend(std::make_shared<GncSqlBillTermBackend>());
    register_backend(std::make_shared<GncSqlCustomerBackend>());
    register_backend(std::make_shared<GncSqlEmployeeBackend>());
    register_backend(std::make_shared<GncSqlEntryBackend>());
    register_backend(std::make_shared<GncSqlInvoiceBackend>());
    register_backend(std::make_shared<GncSqlJobBackend>());
    register_backend(std::make_shared<GncSqlOrderBackend>());
    register_backend(std::make_shared<GncSqlTaxTableBackend>());
    register_backend(std::make_shared<GncSqlVendorBackend>());
}
예제 #3
0
파일: wine.c 프로젝트: 0x24bin/winexe-1
NTSTATUS registry_wine_init(void)
{
	register_backend("registry", &reg_backend_wine);
	return NT_STATUS_OK;
}