mirror of
https://codeberg.org/dnkl/yambar.git
synced 2025-04-20 03:35:41 +02:00
plugin: add plugin_load_particle() function
This commit is contained in:
parent
f34a341c33
commit
0fa7906e99
2 changed files with 27 additions and 8 deletions
33
plugin.c
33
plugin.c
|
@ -9,8 +9,12 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "tllist.h"
|
#include "tllist.h"
|
||||||
|
|
||||||
|
enum plugin_type { PLUGIN_MODULE, PLUGIN_PARTICLE };
|
||||||
|
|
||||||
struct plugin {
|
struct plugin {
|
||||||
char *name;
|
char *name;
|
||||||
|
enum plugin_type type;
|
||||||
|
|
||||||
void *lib;
|
void *lib;
|
||||||
const void *sym;
|
const void *sym;
|
||||||
};
|
};
|
||||||
|
@ -36,21 +40,21 @@ fini(void)
|
||||||
tll_free_and_free(plugins, free_plugin);
|
tll_free_and_free(plugins, free_plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct module_info *
|
static const void *
|
||||||
plugin_load_module(const char *name)
|
_load_plugin(const char *name, enum plugin_type type)
|
||||||
{
|
{
|
||||||
char path[128];
|
|
||||||
snprintf(path, sizeof(path), "lib%s.so", name);
|
|
||||||
|
|
||||||
/* Have we already loaded it? */
|
/* Have we already loaded it? */
|
||||||
tll_foreach(plugins, plug) {
|
tll_foreach(plugins, plug) {
|
||||||
if (strcmp(plug->item.name, name) == 0) {
|
if (plug->item.type == type && strcmp(plug->item.name, name) == 0) {
|
||||||
LOG_DBG("%s already loaded: %p", name, plug->item.lib);
|
LOG_DBG("%s already loaded: %p", name, plug->item.lib);
|
||||||
assert(plug->item.sym != NULL);
|
assert(plug->item.sym != NULL);
|
||||||
return plug->item.sym;
|
return plug->item.sym;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char path[128];
|
||||||
|
snprintf(path, sizeof(path), "lib%s.so", name);
|
||||||
|
|
||||||
/* Not loaded - do it now */
|
/* Not loaded - do it now */
|
||||||
void *lib = dlopen(path, RTLD_LOCAL | RTLD_NOW);
|
void *lib = dlopen(path, RTLD_LOCAL | RTLD_NOW);
|
||||||
LOG_DBG("%s: dlopened to %p", name, lib);
|
LOG_DBG("%s: dlopened to %p", name, lib);
|
||||||
|
@ -60,11 +64,12 @@ plugin_load_module(const char *name)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tll_push_back(plugins, ((struct plugin){strdup(name), lib}));
|
tll_push_back(plugins, ((struct plugin){strdup(name), type, lib, NULL}));
|
||||||
struct plugin *plug = &tll_back(plugins);
|
struct plugin *plug = &tll_back(plugins);
|
||||||
|
|
||||||
|
/* TODO: rename to plugin_info or so, in both modules and particles */
|
||||||
dlerror(); /* Clear previous error */
|
dlerror(); /* Clear previous error */
|
||||||
plug->sym = dlsym(lib, "module_info");
|
plug->sym = dlsym(lib, type == PLUGIN_MODULE ? "module_info" : "particle_info");
|
||||||
|
|
||||||
const char *dlsym_error = dlerror();
|
const char *dlsym_error = dlerror();
|
||||||
if (dlsym_error != NULL) {
|
if (dlsym_error != NULL) {
|
||||||
|
@ -75,3 +80,15 @@ plugin_load_module(const char *name)
|
||||||
assert(plug->sym != NULL);
|
assert(plug->sym != NULL);
|
||||||
return plug->sym;
|
return plug->sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct module_info *
|
||||||
|
plugin_load_module(const char *name)
|
||||||
|
{
|
||||||
|
return _load_plugin(name, PLUGIN_MODULE);
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct particle_info *
|
||||||
|
plugin_load_particle(const char *name)
|
||||||
|
{
|
||||||
|
return _load_plugin(name, PLUGIN_PARTICLE);
|
||||||
|
}
|
||||||
|
|
2
plugin.h
2
plugin.h
|
@ -1,5 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
|
#include "particle.h"
|
||||||
|
|
||||||
const struct module_info *plugin_load_module(const char *name);
|
const struct module_info *plugin_load_module(const char *name);
|
||||||
|
const struct particle_info *plugin_load_particle(const char *name);
|
||||||
|
|
Loading…
Add table
Reference in a new issue