13
void *pcilib_plugin_load(const char *name) {
18
path = getenv("PCILIB_PLUGIN_DIR");
19
if (!path) path = PCILIB_PLUGIN_DIR;
21
fullname = malloc(strlen(path) + strlen(name) + 2);
22
if (!fullname) return NULL;
24
sprintf(fullname, "%s/%s", path, name);
26
plug = dlopen(fullname, RTLD_LAZY|RTLD_LOCAL);
32
void pcilib_plugin_close(void *plug) {
38
void *pcilib_plugin_get_symbol(void *plug, const char *symbol) {
39
if ((!plug)||(!symbol)) return NULL;
40
return dlsym(plug, symbol);
43
const pcilib_model_description_t *pcilib_get_plugin_model(pcilib_t *pcilib, void *plug, unsigned short vendor_id, unsigned short device_id, const char *model) {
46
if (!plug) return NULL;
48
get_model = dlsym(plug, "pcilib_get_event_model");
49
if (!get_model) return NULL;
51
return ((const pcilib_model_description_t *(*)(pcilib_t *pcilib, unsigned short vendor_id, unsigned short device_id, const char *model))get_model)(pcilib, vendor_id, device_id, model);
54
const pcilib_model_description_t *pcilib_find_plugin_model(pcilib_t *pcilib, unsigned short vendor_id, unsigned short device_id, const char *model) {
60
const pcilib_model_description_t *model_info = NULL;
63
path = getenv("PCILIB_PLUGIN_DIR");
64
if (!path) path = PCILIB_PLUGIN_DIR;
67
plugin = pcilib_plugin_load(model);
69
model_info = pcilib_get_plugin_model(pcilib, plugin, vendor_id, device_id, model);
71
pcilib->event_plugin = plugin;
74
pcilib_plugin_close(plugin);
79
if (!dir) return NULL;
81
while ((entry = readdir(dir))) {
82
const char *suffix = strstr(entry->d_name, ".so");
83
if ((!suffix)||(strlen(suffix) != 3)) continue;
85
if ((model)&&(!strcmp(entry->d_name, model)))
88
plugin = pcilib_plugin_load(entry->d_name);
90
model_info = pcilib_get_plugin_model(pcilib, plugin, vendor_id, device_id, model);
92
pcilib->event_plugin = plugin;
95
pcilib_plugin_close(plugin);