diff --git a/inc/lektor/reg.h b/inc/lektor/reg.h index e64b641479d9e1d948794bb5af50a44872bd9e0c..1799246981c570d7739a14a146fccc803867242a 100644 --- a/inc/lektor/reg.h +++ b/inc/lektor/reg.h @@ -6,16 +6,21 @@ struct lkt_state; with a name that can be generated or red from a config file. */ struct module_reg { const char *name; - void (*func)(void); + union { + void (*func)(void); + void *obj; + }; }; -#define REG_BEGIN(reg) struct module_reg reg[] = { -#define REG_ADD(__f) { .name = #__f, .func = (void(*)(void)) __f }, -#define REG_ADD_NAMED(__n, __f) { .name = __n, .func = (void(*)(void)) __f }, -#define REG_END() { .name = NULL, .func = NULL } }; +#define REG_EXPORT_NAME "__reg__" +#define REG_BEGIN(reg) struct module_reg reg[] = { +#define REG_ADD(f) { .name = #f, .func = (void(*)(void)) f }, +#define REG_ADD_NAMED(n, f) { .name = n, .func = (void(*)(void)) f }, +#define REG_END() { .name = NULL, .func = NULL } }; +/* Use only once per .so files or you will have some problems... */ #if ! defined(_STATIC_MODULES) -#define REG_EXPORT(__reg) struct module_reg *__reg__ = __reg; +#define REG_EXPORT(__reg) struct module_reg *__reg__ = __reg; #else #define REG_EXPORT(__reg) #endif @@ -29,10 +34,14 @@ void *reg_pick(const char *file, void **handle, const char *symbol); shared library with REG_EXPORT. Note that this reg is named `__reg__`, thus no symbol must be named `__reg__` in the .so file. Returns 0 on success, something else on error. */ -int reg_from_file(const char *file, struct module_reg *ret); +int reg_from_file(const char *file, struct module_reg **ret, void **handle); -/* Set the ref for this .a / .so file */ -void reg_set(struct module_reg *); +/* Set the __reg__ pointer. */ +void reg_export(struct module_reg *reg); + +/* Get the object named with 'name' from the reg. Returns NULL on error + or 'not found'. */ +void *__reg_get(struct module_reg *reg, const char *name); /* Load a module by its name. Also initialize the mod pointer. No check on data type is done, it is up to the user to check if the structure passed as a diff --git a/src/main/server.c b/src/main/server.c index 0e2f5dedf39d1425fc161d99b9c378eb3742b97f..3527e199813af4434de05c104ebb17b06f29b8e7 100644 --- a/src/main/server.c +++ b/src/main/server.c @@ -66,7 +66,7 @@ main(int argc, char *argv[]) } normal_launch: - reg_set(server_reg); + reg_export(server_reg); mthread_init(); pthread_create(&th, NULL, mthread_main, NULL); if (read_self_exe(exe, PATH_MAX)) diff --git a/src/mkv/mkv.c b/src/mkv/mkv.c index a108cdcddbb1322c353c6f1666c7b224130fbe70..70e10586529b343c571bf82bcf1d50864f0f8cc8 100644 --- a/src/mkv/mkv.c +++ b/src/mkv/mkv.c @@ -608,9 +608,8 @@ kara_read_length(double *len, const char *filename) } else { if (mkv_read_element_length(&file, &elength) < 0) goto error; - if (bufferfd_skip(&file, elength) < 0) { + if (bufferfd_skip(&file, elength) < 0) goto error; - } } } diff --git a/src/reg.c b/src/reg.c index c0ba8596d723b93959d92bd01734357811f23a6c..d42614021086c358ad72c96ca930d1d85a47d7de 100644 --- a/src/reg.c +++ b/src/reg.c @@ -10,12 +10,27 @@ #include <strings.h> #include <stddef.h> -struct module_reg *reg; +struct module_reg *__reg__; + +void +reg_export(struct module_reg *reg) +{ + __reg__ = reg; +} void * -reg_pick(const char *file, void **handle, const char *symbol) +__reg_get(struct module_reg *reg, const char *name) { int i; + for (i = 0; reg[i].name && reg[i].func; ++i) + if (STR_MATCH(reg[i].name, name)) + return *(void **) ®[i].func; + return NULL; +} + +void * +reg_pick(const char *file, void **handle, const char *symbol) +{ if (!symbol) return NULL; @@ -48,17 +63,7 @@ reg_pick(const char *file, void **handle, const char *symbol) /* Read the reg */ use_reg: LOG_INFO("REG", "Using the reg structure to find %s", symbol); - for (i = 0; reg[i].name && reg[i].func; ++i) - if (STR_MATCH(reg[i].name, symbol)) - return *(void **) ®[i].func; - - return NULL; -} - -void -reg_set(struct module_reg *_reg) -{ - reg = _reg; + return __reg_get(__reg__, symbol); } int @@ -104,3 +109,9 @@ load_module_by_name(struct lkt_state *srv, const char *name, void *mod) return load_so(mod_path, mod_load, mod, srv); } +int +reg_from_file(const char *file, struct module_reg **ret, void **handle) +{ + *ret = reg_pick(file, handle, REG_EXPORT_NAME); + return *ret != NULL; +}