diff --git a/Makefile b/Makefile index 480bd4c9..129683b6 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ CFLAGS += -I$(INCLUDES_INSTALL_BASE) $(HTS_CFLAGS) CFLAGS += -Wno-deprecated-declarations CFLAGS += -D_LARGEFILE64_SOURCE CFLAGS += -DENABLE_INPUT_IPTV -DENABLE_INPUT_DVB -DENABLE_INPUT_V4L -LDFLAGS += -L$(LIBS_INSTALL_BASE) +LDFLAGS += -L$(LIBS_INSTALL_BASE) -rdynamic SLIBS += ${LIBHTS_SLIBS} DLIBS += ${LIBHTS_DLIBS} diff --git a/main.c b/main.c index 9e4b2c1f..a29f2069 100644 --- a/main.c +++ b/main.c @@ -54,6 +54,7 @@ #include "buffer.h" #include "htmlui.h" #include "avgen.h" +#include "plugin.h" int running; int xmltvreload; @@ -196,6 +197,8 @@ main(int argc, char **argv) avgen_init(); + plugin_init(); + running = 1; while(running) { diff --git a/plugin.c b/plugin.c index 1ee64104..8c919702 100644 --- a/plugin.c +++ b/plugin.c @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include "tvhead.h" #include "plugin.h" @@ -88,3 +90,54 @@ plugin_alloc(const char *name, void *opaque, size_t minsiz) return p; } + +/** + * + */ +void +plugin_init(void) +{ + const char *path; + char file[400]; + DIR *dir; + struct dirent *d; + char *c; + void *h; + + void (*ini)(void); + + if((path = config_get_str("plugins", NULL)) == NULL) + return; + + if((dir = opendir(path)) == NULL) + return; + + while((d = readdir(dir)) != NULL) { + if(d->d_name[0] == '.') + continue; + + if((c = strrchr(d->d_name, '.')) == NULL) + continue; + + if(strcmp(c, ".so")) + continue; + + snprintf(file, sizeof(file), "%s/%s", path, d->d_name); + + h = dlopen(file, RTLD_NOW | RTLD_LOCAL); + if(h == NULL) { + syslog(LOG_ERR, "%s", dlerror()); + continue; + } + + ini = dlsym(h, "plugin_init"); + if(ini == NULL) { + syslog(LOG_ERR, "Plugin \"%s\" lacks init function", file); + continue; + } + + ini(); + + closedir(dir); + } +} diff --git a/plugin.h b/plugin.h index 6eeb786e..b615734a 100644 --- a/plugin.h +++ b/plugin.h @@ -58,4 +58,6 @@ void plugin_aux_destroy(void *pa); th_plugin_t *plugin_alloc(const char *name, void *opaque, size_t minsiz); +void plugin_init(void); + #endif /* PLUGIN_H_ */