+void Builder::load_plugins()
+{
+ using CreateFunc = Plugin *(Builder &);
+
+ FS::Path plugins_dir = FS::get_sys_lib_dir();
+ logger->log("files", "Traversing %s", plugins_dir);
+ for(const string &f: list_filtered(plugins_dir, "\\.dlm$"))
+ {
+ LoadedPlugin plugin;
+ plugin.path = plugins_dir/f;
+
+ try
+ {
+ plugin.module = new Module(plugin.path.str());
+ }
+ catch(const exception &exc)
+ {
+ logger->log("plugins", "Failed to load plugin %s: %s", f, exc.what());
+ continue;
+ }
+
+ try
+ {
+ CreateFunc *create_func = reinterpret_cast<CreateFunc *>(plugin.module->get_symbol("create_plugin"));
+ plugin.plugin = create_func(*this);
+ if(plugin.plugin)
+ {
+ logger->log("plugins", "Loaded plugin %s", f);
+ plugins.emplace_back(move(plugin));
+ continue;
+ }
+ else
+ logger->log("plugins", "Plugin %s refused to initialize", f);
+ }
+ catch(const exception &exc)
+ {
+ logger->log("plugins", "Failed to initialize plugin %s: %s", f, exc.what());
+ }
+
+ delete plugin.module;
+ }
+}
+