+#include <dlfcn.h>
+
+#include "plugin_manager.h"
+#include "plugin.h"
+#include "debug.h"
+
+int load_plugin(const char *path)
+{
+ struct plugin_info *info;
+ void *handle;
+ int ret = -1;
+
+ handle = dlopen(path, RTLD_NOW);
+ if (!handle) {
+ pr_err("Failed to load plugin %s: %s\n", path, dlerror());
+ return -1;
+ }
+
+ info = dlsym(handle, "plugin_info");
+ if (!info) {
+ pr_err("Plugin %s does not contain plugin info\n", path);
+ goto out;
+ }
+
+ if (!info->init) {
+ pr_err("Plugin info structure has NULL .init callback\n");
+ goto out;
+ }
+
+ ret = info->init();
+ pr_info("Loading plugin %s %s\n", path,
+ ret ? "failed" : "succeeded");
+
+out:
+ if (ret)
+ dlclose(handle);
+
+ return ret;
+}