]> git.itanic.dy.fi Git - rrdd/blob - plugin_manager.c
Add utils.h
[rrdd] / plugin_manager.c
1 #include <dlfcn.h>
2
3 #include "plugin_manager.h"
4 #include "plugin.h"
5 #include "debug.h"
6
7 int load_plugin(const char *path)
8 {
9         struct plugin_info *info;
10         void *handle;
11         int ret = -1;
12
13         handle = dlopen(path, RTLD_NOW);
14         if (!handle) {
15                 pr_err("Failed to load plugin %s: %s\n", path, dlerror());
16                 return -1;
17         }
18
19         info = dlsym(handle, "plugin_info");
20         if (!info) {
21                 pr_err("Plugin %s does not contain plugin info\n", path);
22                 goto out;
23         }
24
25         if (!info->init) {
26                 pr_err("Plugin info structure has NULL .init callback\n");
27                 goto out;
28         }
29
30         ret = info->init();
31         pr_info("Loading plugin %s %s\n", path,
32                 ret ? "failed" : "succeeded");
33
34 out:
35         if (ret)
36                 dlclose(handle);
37
38         return ret;
39 }