/* 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; }
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>()); }
NTSTATUS registry_wine_init(void) { register_backend("registry", ®_backend_wine); return NT_STATUS_OK; }