X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fplugin.c;h=92440a5e69e913ebc8b63f1da8ccb0f370dffb45;hb=69892731c1a337485c955f5c292d8cf7c179a162;hp=472396fa5bb0efd20944d06c5e60e8ac733c5741;hpb=ed153c700909360c97f4d025fe0434e03efcbe55;p=sysdb.git diff --git a/src/core/plugin.c b/src/core/plugin.c index 472396f..92440a5 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -25,10 +25,14 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + #include "sysdb.h" #include "core/plugin.h" -#include "core/error.h" #include "core/time.h" +#include "utils/error.h" #include "utils/llist.h" #include "utils/strbuf.h" @@ -117,6 +121,9 @@ static sdb_plugin_info_t plugin_default_info = SDB_PLUGIN_INFO_INIT; static pthread_key_t plugin_ctx_key; static _Bool plugin_ctx_key_initialized = 0; +/* a list of the plugin contexts of all registered plugins */ +static sdb_llist_t *all_plugins = NULL; + static sdb_llist_t *config_list = NULL; static sdb_llist_t *init_list = NULL; static sdb_llist_t *collector_list = NULL; @@ -218,7 +225,7 @@ plugin_unregister_by_name(const char *plugin_name) if (! obj) break; - sdb_log(SDB_LOG_INFO, "plugin: Unregistering " + sdb_log(SDB_LOG_INFO, "core: Unregistering " "%s callback '%s' (module %s)", type, obj->name, cb->cb_ctx->info.plugin_name); sdb_object_deref(obj); @@ -257,11 +264,11 @@ static sdb_type_t ctx_type = { }; static ctx_t * -ctx_create(void) +ctx_create(const char *name) { ctx_t *ctx; - ctx = CTX(sdb_object_create("plugin-context", ctx_type)); + ctx = CTX(sdb_object_create(name, ctx_type)); if (! ctx) return NULL; @@ -305,7 +312,7 @@ plugin_cb_init(sdb_object_t *obj, va_list ap) assert(obj); if (sdb_llist_search_by_name(*list, obj->name)) { - sdb_log(SDB_LOG_WARNING, "plugin: %s callback '%s' " + sdb_log(SDB_LOG_WARNING, "core: %s callback '%s' " "has already been registered. Ignoring newly " "registered version.", type, obj->name); return -1; @@ -371,7 +378,7 @@ plugin_add_callback(sdb_llist_t **list, const char *type, /* pass control to the list */ sdb_object_deref(obj); - sdb_log(SDB_LOG_INFO, "plugin: Registered %s callback '%s'.", + sdb_log(SDB_LOG_INFO, "core: Registered %s callback '%s'.", type, name); return 0; } /* plugin_add_callback */ @@ -383,7 +390,7 @@ plugin_add_callback(sdb_llist_t **list, const char *type, int sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx) { - char real_name[strlen(name) > 0 ? strlen(name) : 1]; + char real_name[name ? strlen(name) + 1 : 1]; const char *name_ptr; char *tmp; @@ -414,7 +421,7 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx) if (access(filename, R_OK)) { char errbuf[1024]; - sdb_log(SDB_LOG_ERR, "plugin: Failed to load plugin '%s' (%s): %s", + sdb_log(SDB_LOG_ERR, "core: Failed to load plugin '%s' (%s): %s", name, filename, sdb_strerror(errno, errbuf, sizeof(errbuf))); return -1; } @@ -424,18 +431,18 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx) lh = lt_dlopen(filename); if (! lh) { - sdb_log(SDB_LOG_ERR, "plugin: Failed to load plugin '%s': %s" + sdb_log(SDB_LOG_ERR, "core: Failed to load plugin '%s': %s" "The most common cause for this problem are missing " "dependencies.\n", name, lt_dlerror()); return -1; } if (ctx_get()) - sdb_log(SDB_LOG_WARNING, "plugin: Discarding old plugin context"); + sdb_log(SDB_LOG_WARNING, "core: Discarding old plugin context"); - ctx = ctx_create(); + ctx = ctx_create(real_name); if (! ctx) { - sdb_log(SDB_LOG_ERR, "plugin: Failed to initialize plugin context"); + sdb_log(SDB_LOG_ERR, "core: Failed to initialize plugin context"); return -1; } @@ -447,7 +454,7 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx) mod_init = (int (*)(sdb_plugin_info_t *))lt_dlsym(lh, "sdb_module_init"); if (! mod_init) { - sdb_log(SDB_LOG_ERR, "plugin: Failed to load plugin '%s': " + sdb_log(SDB_LOG_ERR, "core: Failed to load plugin '%s': " "could not find symbol 'sdb_module_init'", name); sdb_object_deref(SDB_OBJ(ctx)); return -1; @@ -455,7 +462,7 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx) status = mod_init(&ctx->info); if (status) { - sdb_log(SDB_LOG_ERR, "plugin: Failed to initialize " + sdb_log(SDB_LOG_ERR, "core: Failed to initialize " "module '%s'", name); plugin_unregister_by_name(ctx->info.plugin_name); sdb_object_deref(SDB_OBJ(ctx)); @@ -465,13 +472,25 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx) /* compare minor version */ if ((ctx->info.version < 0) || ((int)(ctx->info.version / 100) != (int)(SDB_VERSION / 100))) - sdb_log(SDB_LOG_WARNING, "plugin: WARNING: version of " + sdb_log(SDB_LOG_WARNING, "core: WARNING: version of " "plugin '%s' (%i.%i.%i) does not match our version " "(%i.%i.%i); this might cause problems", name, SDB_VERSION_DECODE(ctx->info.version), SDB_VERSION_DECODE(SDB_VERSION)); - sdb_log(SDB_LOG_INFO, "plugin: Successfully loaded " + if (! all_plugins) { + if (! (all_plugins = sdb_llist_create())) { + sdb_log(SDB_LOG_ERR, "core: Failed to load plugin '%s': " + "internal error while creating linked list", name); + plugin_unregister_by_name(ctx->info.plugin_name); + sdb_object_deref(SDB_OBJ(ctx)); + return -1; + } + } + + sdb_llist_append(all_plugins, SDB_OBJ(ctx)); + + sdb_log(SDB_LOG_INFO, "core: Successfully loaded " "plugin '%s' v%i (%s)\n\t%s\n\tLicense: %s", INFO_GET(&ctx->info, name), ctx->info.plugin_version, INFO_GET(&ctx->info, description), @@ -559,7 +578,7 @@ int sdb_plugin_register_config(const char *name, sdb_plugin_config_cb callback) { return plugin_add_callback(&config_list, "init", name, - callback, NULL); + (void *)callback, NULL); } /* sdb_plugin_register_config */ int @@ -567,7 +586,7 @@ sdb_plugin_register_init(const char *name, sdb_plugin_init_cb callback, sdb_object_t *user_data) { return plugin_add_callback(&init_list, "init", name, - callback, user_data); + (void *)callback, user_data); } /* sdb_plugin_register_init */ int @@ -575,14 +594,14 @@ sdb_plugin_register_shutdown(const char *name, sdb_plugin_shutdown_cb callback, sdb_object_t *user_data) { return plugin_add_callback(&shutdown_list, "shutdown", name, - callback, user_data); + (void *)callback, user_data); } /* sdb_plugin_register_shutdown */ int sdb_plugin_register_log(const char *name, sdb_plugin_log_cb callback, sdb_object_t *user_data) { - return plugin_add_callback(&log_list, "log", name, callback, + return plugin_add_callback(&log_list, "log", name, (void *)callback, user_data); } /* sdb_plugin_register_log */ @@ -590,7 +609,7 @@ int sdb_plugin_register_cname(const char *name, sdb_plugin_cname_cb callback, sdb_object_t *user_data) { - return plugin_add_callback(&cname_list, "cname", name, callback, + return plugin_add_callback(&cname_list, "cname", name, (void *)callback, user_data); } /* sdb_plugin_register_cname */ @@ -626,7 +645,7 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback if (! (SDB_PLUGIN_CCB(obj)->ccb_next_update = sdb_gettime())) { char errbuf[1024]; - sdb_log(SDB_LOG_ERR, "plugin: Failed to determine current " + sdb_log(SDB_LOG_ERR, "core: Failed to determine current " "time: %s", sdb_strerror(errno, errbuf, sizeof(errbuf))); sdb_object_deref(obj); return -1; @@ -641,7 +660,7 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback /* pass control to the list */ sdb_object_deref(obj); - sdb_log(SDB_LOG_INFO, "plugin: Registered collector callback '%s' " + sdb_log(SDB_LOG_INFO, "core: Registered collector callback '%s' " "(interval = %.3fs).", name, SDB_TIME_TO_DOUBLE(SDB_PLUGIN_CCB(obj)->ccb_interval)); return 0; @@ -654,7 +673,7 @@ sdb_plugin_get_ctx(void) c = ctx_get(); if (! c) { - sdb_plugin_log(SDB_LOG_ERR, "plugin: Invalid read access to plugin " + sdb_plugin_log(SDB_LOG_ERR, "core: Invalid read access to plugin " "context outside a plugin"); return plugin_default_ctx; } @@ -668,7 +687,7 @@ sdb_plugin_set_ctx(sdb_plugin_ctx_t ctx, sdb_plugin_ctx_t *old) c = ctx_get(); if (! c) { - sdb_plugin_log(SDB_LOG_ERR, "plugin: Invalid write access to plugin " + sdb_plugin_log(SDB_LOG_ERR, "core: Invalid write access to plugin " "context outside a plugin"); return -1; } @@ -695,14 +714,18 @@ sdb_plugin_configure(const char *name, oconfig_item_t *ci) plugin = SDB_PLUGIN_CB(sdb_llist_search_by_name(config_list, name)); if (! plugin) { /* XXX: check if any such plugin has been loaded */ - sdb_log(SDB_LOG_ERR, "plugin: Plugin '%s' did not register " - "a config callback.", name); + ctx_t *ctx = CTX(sdb_llist_search_by_name(all_plugins, name)); + if (! ctx) + sdb_log(SDB_LOG_ERR, "core: Plugin '%s' not loaded.", name); + else + sdb_log(SDB_LOG_ERR, "core: Plugin '%s' did not register " + "a config callback.", name); errno = ENOENT; return -1; } old_ctx = ctx_set(plugin->cb_ctx); - callback = plugin->cb_callback; + callback = (sdb_plugin_config_cb)plugin->cb_callback; status = callback(ci); ctx_set(old_ctx); return status; @@ -724,11 +747,11 @@ sdb_plugin_init_all(void) assert(obj); cb = SDB_PLUGIN_CB(obj); - callback = cb->cb_callback; + callback = (sdb_plugin_init_cb)cb->cb_callback; old_ctx = ctx_set(cb->cb_ctx); if (callback(cb->cb_user_data)) { - sdb_log(SDB_LOG_ERR, "plugin: Failed to initialize plugin " + sdb_log(SDB_LOG_ERR, "core: Failed to initialize plugin " "'%s'. Unregistering all callbacks.", obj->name); plugin_unregister_by_name(cb->cb_ctx->info.plugin_name); ++ret; @@ -743,7 +766,7 @@ int sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) { if (! collector_list) { - sdb_log(SDB_LOG_WARNING, "plugin: No collectors registered. " + sdb_log(SDB_LOG_WARNING, "core: No collectors registered. " "Quiting main loop."); return -1; } @@ -761,12 +784,13 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) if (! obj) return -1; - callback = SDB_PLUGIN_CCB(obj)->ccb_callback; + callback = (sdb_plugin_collector_cb)SDB_PLUGIN_CCB(obj)->ccb_callback; if (! (now = sdb_gettime())) { char errbuf[1024]; - sdb_log(SDB_LOG_ERR, "plugin: Failed to determine current " - "time: %s", sdb_strerror(errno, errbuf, sizeof(errbuf))); + sdb_log(SDB_LOG_ERR, "core: Failed to determine current " + "time in collector main loop: %s", + sdb_strerror(errno, errbuf, sizeof(errbuf))); now = SDB_PLUGIN_CCB(obj)->ccb_next_update; } @@ -777,7 +801,8 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) while (loop->do_loop && sdb_sleep(interval, &interval)) { if (errno != EINTR) { char errbuf[1024]; - sdb_log(SDB_LOG_ERR, "plugin: Failed to sleep: %s", + sdb_log(SDB_LOG_ERR, "core: Failed to sleep " + "in collector main loop: %s", sdb_strerror(errno, errbuf, sizeof(errbuf))); return -1; } @@ -798,7 +823,7 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) if (! interval) interval = loop->default_interval; if (! interval) { - sdb_log(SDB_LOG_WARNING, "plugin: No interval configured " + sdb_log(SDB_LOG_WARNING, "core: No interval configured " "for plugin '%s'; skipping any further " "iterations.", obj->name); sdb_object_deref(obj); @@ -809,13 +834,14 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) if (! (now = sdb_gettime())) { char errbuf[1024]; - sdb_log(SDB_LOG_ERR, "plugin: Failed to determine current " - "time: %s", sdb_strerror(errno, errbuf, sizeof(errbuf))); + sdb_log(SDB_LOG_ERR, "core: Failed to determine current " + "time in collector main loop: %s", + sdb_strerror(errno, errbuf, sizeof(errbuf))); now = SDB_PLUGIN_CCB(obj)->ccb_next_update; } if (now > SDB_PLUGIN_CCB(obj)->ccb_next_update) { - sdb_log(SDB_LOG_WARNING, "plugin: Plugin '%s' took too " + sdb_log(SDB_LOG_WARNING, "core: Plugin '%s' took too " "long; skipping iterations to keep up.", obj->name); SDB_PLUGIN_CCB(obj)->ccb_next_update = now; @@ -823,7 +849,7 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) if (sdb_llist_insert_sorted(collector_list, obj, plugin_cmp_next_update)) { - sdb_log(SDB_LOG_ERR, "plugin: Failed to re-insert " + sdb_log(SDB_LOG_ERR, "core: Failed to re-insert " "plugin '%s' into collector list. Unable to further " "use the plugin.", obj->name); @@ -856,7 +882,7 @@ sdb_plugin_cname(char *hostname) sdb_object_t *obj = sdb_llist_iter_get_next(iter); assert(obj); - callback = SDB_PLUGIN_CB(obj)->cb_callback; + callback = (sdb_plugin_cname_cb)SDB_PLUGIN_CB(obj)->cb_callback; cname = callback(hostname, SDB_PLUGIN_CB(obj)->cb_user_data); if (cname) { free(hostname); @@ -888,7 +914,7 @@ sdb_plugin_log(int prio, const char *msg) sdb_object_t *obj = sdb_llist_iter_get_next(iter); assert(obj); - callback = SDB_PLUGIN_CB(obj)->cb_callback; + callback = (sdb_plugin_log_cb)SDB_PLUGIN_CB(obj)->cb_callback; tmp = callback(prio, msg, SDB_PLUGIN_CB(obj)->cb_user_data); if (tmp > ret) ret = tmp;