#include #include #include #include #include #include #include #include "interface.hpp" using std::string; using std::vector; namespace fs = boost::filesystem; namespace dll = boost::dll; const vector &get_plugin_dirs() { static vector result; if (!result.empty()) { return result; } #ifdef _WIN32 const string delimiter = ";"; #else const string delimiter = ":"; #endif const char *plugin_dirs = std::getenv("LOADER_PLUGIN_DIRS"); if (plugin_dirs != nullptr && *plugin_dirs != '\0') { boost::split(result, plugin_dirs, boost::is_any_of(delimiter)); } if (result.empty()) { result.push_back("/usr/lib/loader"); result.push_back("/usr/local/lib/loader"); } return result; } int main() { const vector &plugin_dirs = get_plugin_dirs(); for (const auto &plugin_dir : plugin_dirs) { fs::path plugin_path(plugin_dir); if (!fs::is_directory(plugin_path)) { continue; } for (fs::recursive_directory_iterator dir(plugin_path), end; dir != end; ++dir) { boost::shared_ptr plugin; plugin = dll::import_symbol( dir->path(), "plugin", dll::load_mode::rtld_lazy ); std::cout << "loading plugin: " << plugin->name() << std::endl; } } }