X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fplugin.c;h=8ca0fd74472a23b7b7f0ff0daa953ff1329ce0cf;hb=73272856dba3b5e49710205601017724fbb6c424;hp=431264266ea66df7b10eadbe5c1d425487b1dac8;hpb=ae3324ade282506976a21dbab487e99e41935b88;p=sysdb.git diff --git a/src/core/plugin.c b/src/core/plugin.c index 4312642..8ca0fd7 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -27,9 +27,10 @@ #include "sysdb.h" #include "core/plugin.h" -#include "utils/error.h" +#include "core/error.h" +#include "core/time.h" #include "utils/llist.h" -#include "utils/time.h" +#include "utils/strbuf.h" #include @@ -65,18 +66,16 @@ struct sdb_plugin_info { typedef struct { sdb_object_t super; - char cb_name[64]; void *cb_callback; sdb_object_t *cb_user_data; sdb_plugin_ctx_t cb_ctx; } sdb_plugin_cb_t; -#define SDB_PLUGIN_CB_INIT { SDB_OBJECT_INIT, /* name = */ "", \ +#define SDB_PLUGIN_CB_INIT { SDB_OBJECT_INIT, \ /* callback = */ NULL, /* user_data = */ NULL, \ SDB_PLUGIN_CTX_INIT } typedef struct { sdb_plugin_cb_t super; -#define ccb_name super.cb_name #define ccb_callback super.cb_callback #define ccb_user_data super.cb_user_data #define ccb_ctx super.cb_ctx @@ -99,7 +98,9 @@ static _Bool plugin_ctx_key_initialized = 0; static sdb_llist_t *config_list = NULL; static sdb_llist_t *init_list = NULL; static sdb_llist_t *collector_list = NULL; +static sdb_llist_t *cname_list = NULL; static sdb_llist_t *shutdown_list = NULL; +static sdb_llist_t *log_list = NULL; /* * private helper functions @@ -140,16 +141,6 @@ sdb_plugin_ctx_create(void) return ctx; } /* sdb_plugin_ctx_create */ -static int -sdb_plugin_cmp_name(const sdb_object_t *a, const sdb_object_t *b) -{ - const sdb_plugin_cb_t *cb1 = (const sdb_plugin_cb_t *)a; - const sdb_plugin_cb_t *cb2 = (const sdb_plugin_cb_t *)b; - - assert(cb1 && cb2); - return strcasecmp(cb1->cb_name, cb2->cb_name); -} /* sdb_plugin_cmp_name */ - static int sdb_plugin_cmp_next_update(const sdb_object_t *a, const sdb_object_t *b) { @@ -165,25 +156,6 @@ sdb_plugin_cmp_next_update(const sdb_object_t *a, const sdb_object_t *b) ? -1 : 0; } /* sdb_plugin_cmp_next_update */ -static sdb_plugin_cb_t * -sdb_plugin_find_by_name(sdb_llist_t *list, const char *name) -{ - sdb_plugin_cb_t tmp = SDB_PLUGIN_CB_INIT; - - sdb_object_t *obj; - assert(name); - - if (! list) - return NULL; - - snprintf(tmp.cb_name, sizeof(tmp.cb_name), "%s", name); - tmp.cb_name[sizeof(tmp.cb_name) - 1] = '\0'; - obj = sdb_llist_search(list, SDB_OBJ(&tmp), sdb_plugin_cmp_name); - if (! obj) - return NULL; - return SDB_PLUGIN_CB(obj); -} /* sdb_plugin_find_by_name */ - /* * private types */ @@ -192,26 +164,21 @@ static int sdb_plugin_cb_init(sdb_object_t *obj, va_list ap) { sdb_llist_t **list = va_arg(ap, sdb_llist_t **); - const char *type = va_arg(ap, const char *); - const char *name = va_arg(ap, const char *); - void *callback = va_arg(ap, void *); + const char *type = va_arg(ap, const char *); + void *callback = va_arg(ap, void *); sdb_object_t *ud = va_arg(ap, sdb_object_t *); assert(list); assert(type); assert(obj); - if (sdb_plugin_find_by_name(*list, name)) { + if (sdb_llist_search_by_name(*list, obj->name)) { sdb_log(SDB_LOG_WARNING, "plugin: %s callback '%s' " "has already been registered. Ignoring newly " - "registered version.", type, name); + "registered version.", type, obj->name); return -1; } - snprintf(SDB_PLUGIN_CB(obj)->cb_name, - sizeof(SDB_PLUGIN_CB(obj)->cb_name), - "%s", name); - SDB_PLUGIN_CB(obj)->cb_name[sizeof(SDB_PLUGIN_CB(obj)->cb_name) - 1] = '\0'; SDB_PLUGIN_CB(obj)->cb_callback = callback; SDB_PLUGIN_CB(obj)->cb_ctx = sdb_plugin_get_ctx(); @@ -257,8 +224,8 @@ sdb_plugin_add_callback(sdb_llist_t **list, const char *type, if (! *list) return -1; - obj = sdb_object_create(sdb_plugin_cb_type, - list, type, name, callback, user_data); + obj = sdb_object_create(name, sdb_plugin_cb_type, + list, type, callback, user_data); if (! obj) return -1; @@ -439,6 +406,22 @@ sdb_plugin_register_shutdown(const char *name, sdb_plugin_shutdown_cb callback, 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 sdb_plugin_add_callback(&log_list, "log", name, callback, + user_data); +} /* sdb_plugin_register_log */ + +int +sdb_plugin_register_cname(const char *name, sdb_plugin_cname_cb callback, + sdb_object_t *user_data) +{ + return sdb_plugin_add_callback(&cname_list, "cname", name, callback, + user_data); +} /* sdb_plugin_register_cname */ + int sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback, const sdb_time_t *interval, sdb_object_t *user_data) @@ -453,8 +436,8 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback if (! collector_list) return -1; - obj = sdb_object_create(sdb_plugin_collector_cb_type, - &collector_list, "collector", name, callback, user_data); + obj = sdb_object_create(name, sdb_plugin_collector_cb_type, + &collector_list, "collector", callback, user_data); if (! obj) return -1; @@ -541,7 +524,7 @@ sdb_plugin_configure(const char *name, oconfig_item_t *ci) if ((! name) || (! ci)) return -1; - plugin = sdb_plugin_find_by_name(config_list, name); + 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 " @@ -578,6 +561,7 @@ sdb_plugin_init_all(void) } sdb_plugin_set_ctx(old_ctx); } + sdb_llist_iter_destroy(iter); return 0; } /* sdb_plugin_init_all */ @@ -642,7 +626,7 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) if (! interval) { sdb_log(SDB_LOG_WARNING, "plugin: No interval configured " "for plugin '%s'; skipping any further " - "iterations.", SDB_PLUGIN_CCB(obj)->ccb_name); + "iterations.", obj->name); sdb_object_deref(obj); continue; } @@ -659,7 +643,7 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) if (now > SDB_PLUGIN_CCB(obj)->ccb_next_update) { sdb_log(SDB_LOG_WARNING, "plugin: Plugin '%s' took too " "long; skipping iterations to keep up.", - SDB_PLUGIN_CCB(obj)->ccb_name); + obj->name); SDB_PLUGIN_CCB(obj)->ccb_next_update = now; } @@ -668,7 +652,7 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) sdb_log(SDB_LOG_ERR, "plugin: Failed to re-insert " "plugin '%s' into collector list. Unable to further " "use the plugin.", - SDB_PLUGIN_CCB(obj)->ccb_name); + obj->name); sdb_object_deref(obj); return -1; } @@ -679,5 +663,106 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop) return 0; } /* sdb_plugin_read_loop */ +char * +sdb_plugin_cname(char *hostname) +{ + sdb_llist_iter_t *iter; + + if (! hostname) + return NULL; + + if (! cname_list) + return hostname; + + iter = sdb_llist_get_iter(cname_list); + while (sdb_llist_iter_has_next(iter)) { + sdb_plugin_cname_cb callback; + char *cname; + + sdb_object_t *obj = sdb_llist_iter_get_next(iter); + assert(obj); + + callback = SDB_PLUGIN_CB(obj)->cb_callback; + cname = callback(hostname, SDB_PLUGIN_CB(obj)->cb_user_data); + if (cname) { + free(hostname); + hostname = cname; + } + /* else: don't change hostname */ + } + sdb_llist_iter_destroy(iter); + return hostname; +} /* sdb_plugin_cname */ + +int +sdb_plugin_log(int prio, const char *msg) +{ + sdb_llist_iter_t *iter; + int ret = -1; + + if (! msg) + return 0; + + if (! log_list) + return fprintf(stderr, "[%s] %s\n", SDB_LOG_PRIO_TO_STRING(prio), msg); + + iter = sdb_llist_get_iter(log_list); + while (sdb_llist_iter_has_next(iter)) { + sdb_plugin_log_cb callback; + int tmp; + + sdb_object_t *obj = sdb_llist_iter_get_next(iter); + assert(obj); + + callback = SDB_PLUGIN_CB(obj)->cb_callback; + tmp = callback(prio, msg, SDB_PLUGIN_CB(obj)->cb_user_data); + if (tmp > ret) + ret = tmp; + } + sdb_llist_iter_destroy(iter); + return ret; +} /* sdb_plugin_log */ + +int +sdb_plugin_vlogf(int prio, const char *fmt, va_list ap) +{ + sdb_strbuf_t *buf; + int ret; + + if (! fmt) + return 0; + + buf = sdb_strbuf_create(64); + if (! buf) { + ret = fprintf(stderr, "[%s] ", SDB_LOG_PRIO_TO_STRING(prio)); + ret += vfprintf(stderr, fmt, ap); + return ret; + } + + if (sdb_strbuf_vsprintf(buf, fmt, ap) < 0) { + sdb_strbuf_destroy(buf); + return -1; + } + + ret = sdb_plugin_log(prio, sdb_strbuf_string(buf)); + sdb_strbuf_destroy(buf); + return ret; +} /* sdb_plugin_vlogf */ + +int +sdb_plugin_logf(int prio, const char *fmt, ...) +{ + va_list ap; + int ret; + + if (! fmt) + return 0; + + va_start(ap, fmt); + ret = sdb_plugin_vlogf(prio, fmt, ap); + va_end(ap); + return ret; +} /* sdb_plugin_logf */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */