diff --git a/src/core/plugin.c b/src/core/plugin.c
index a31ede30f2ed4104f104d9780bb6104ed484ed17..ca79284fe60a41b5d17b3f129db277755587e9f7 100644 (file)
--- a/src/core/plugin.c
+++ b/src/core/plugin.c
*/
struct sdb_plugin_info {
+ char *plugin_name;
+ char *filename;
+
+ /* public attributes */
char *name;
char *description;
int version;
int plugin_version;
};
-#define SDB_PLUGIN_INFO_INIT { /* name */ NULL, /* desc */ NULL, \
+#define SDB_PLUGIN_INFO_INIT { \
+ /* plugin_name */ NULL, /* filename */ NULL, \
+ /* name */ NULL, /* desc */ NULL, \
/* copyright */ NULL, /* license */ NULL, \
/* version */ -1, /* plugin_version */ -1 }
#define INFO_GET(i, attr) \
typedef struct {
sdb_object_t super;
sdb_plugin_ctx_t public;
+
+ sdb_plugin_info_t info;
} ctx_t;
#define CTX_INIT { SDB_OBJECT_INIT, \
- SDB_PLUGIN_CTX_INIT }
+ SDB_PLUGIN_CTX_INIT, SDB_PLUGIN_INFO_INIT }
#define CTX(obj) ((ctx_t *)(obj))
* private variables
*/
-static sdb_plugin_ctx_t plugin_default_ctx = SDB_PLUGIN_CTX_INIT;
+static sdb_plugin_ctx_t plugin_default_ctx = SDB_PLUGIN_CTX_INIT;
+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;
*/
static void
-sdb_plugin_info_clear(sdb_plugin_info_t *info)
+plugin_info_clear(sdb_plugin_info_t *info)
{
sdb_plugin_info_t empty_info = SDB_PLUGIN_INFO_INIT;
if (! info)
return;
+ if (info->plugin_name)
+ free(info->plugin_name);
+ if (info->filename)
+ free(info->filename);
+
if (info->name)
free(info->name);
if (info->description)
free(info->license);
*info = empty_info;
-} /* sdb_plugin_info_clear */
+} /* plugin_info_clear */
static void
ctx_key_init(void)
} /* ctx_key_init */
static int
-sdb_plugin_cmp_next_update(const sdb_object_t *a, const sdb_object_t *b)
+plugin_cmp_next_update(const sdb_object_t *a, const sdb_object_t *b)
{
const sdb_plugin_collector_cb_t *ccb1
= (const sdb_plugin_collector_cb_t *)a;
return (ccb1->ccb_next_update > ccb2->ccb_next_update)
? 1 : (ccb1->ccb_next_update < ccb2->ccb_next_update)
? -1 : 0;
-} /* sdb_plugin_cmp_next_update */
+} /* plugin_cmp_next_update */
/*
* private types
assert(ctx);
ctx->public = plugin_default_ctx;
+ ctx->info = plugin_default_info;
return 0;
} /* ctx_init */
+static void
+ctx_destroy(sdb_object_t *obj)
+{
+ ctx_t *ctx = CTX(obj);
+ plugin_info_clear(&ctx->info);
+} /* ctx_destroy */
+
static sdb_type_t ctx_type = {
sizeof(ctx_t),
ctx_init,
- NULL
+ ctx_destroy
};
static ctx_t *
} /* ctx_set */
static int
-sdb_plugin_cb_init(sdb_object_t *obj, va_list ap)
+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 *);
sdb_object_ref(ud);
SDB_PLUGIN_CB(obj)->cb_user_data = ud;
return 0;
-} /* sdb_plugin_cb_init */
+} /* plugin_cb_init */
static void
-sdb_plugin_cb_destroy(sdb_object_t *obj)
+plugin_cb_destroy(sdb_object_t *obj)
{
assert(obj);
sdb_object_deref(SDB_PLUGIN_CB(obj)->cb_user_data);
sdb_object_deref(SDB_OBJ(SDB_PLUGIN_CB(obj)->cb_ctx));
-} /* sdb_plugin_cb_destroy */
+} /* plugin_cb_destroy */
static sdb_type_t sdb_plugin_cb_type = {
sizeof(sdb_plugin_cb_t),
- sdb_plugin_cb_init,
- sdb_plugin_cb_destroy
+ plugin_cb_init,
+ plugin_cb_destroy
};
static sdb_type_t sdb_plugin_collector_cb_type = {
sizeof(sdb_plugin_collector_cb_t),
- sdb_plugin_cb_init,
- sdb_plugin_cb_destroy
+ plugin_cb_init,
+ plugin_cb_destroy
};
static int
-sdb_plugin_add_callback(sdb_llist_t **list, const char *type,
+plugin_add_callback(sdb_llist_t **list, const char *type,
const char *name, void *callback, sdb_object_t *user_data)
{
sdb_object_t *obj;
sdb_log(SDB_LOG_INFO, "plugin: Registered %s callback '%s'.",
type, name);
return 0;
-} /* sdb_plugin_add_callback */
+} /* plugin_add_callback */
/*
* public API
lt_dlhandle lh;
int (*mod_init)(sdb_plugin_info_t *);
- sdb_plugin_info_t info = SDB_PLUGIN_INFO_INIT;
-
int status;
if ((! name) || (! *name))
return -1;
}
+ ctx->info.plugin_name = strdup(name);
+ ctx->info.filename = strdup(filename);
+
if (plugin_ctx)
ctx->public = *plugin_ctx;
return -1;
}
- status = mod_init(&info);
+ status = mod_init(&ctx->info);
if (status) {
sdb_log(SDB_LOG_ERR, "plugin: Failed to initialize "
"plugin '%s'", name);
- sdb_plugin_info_clear(&info);
sdb_object_deref(SDB_OBJ(ctx));
return -1;
}
/* compare minor version */
- if ((info.version < 0)
- || ((int)(info.version / 100) != (int)(SDB_VERSION / 100)))
+ if ((ctx->info.version < 0)
+ || ((int)(ctx->info.version / 100) != (int)(SDB_VERSION / 100)))
sdb_log(SDB_LOG_WARNING, "plugin: WARNING: version of "
"plugin '%s' (%i.%i.%i) does not match our version "
"(%i.%i.%i); this might cause problems",
- name, SDB_VERSION_DECODE(info.version),
+ name, SDB_VERSION_DECODE(ctx->info.version),
SDB_VERSION_DECODE(SDB_VERSION));
sdb_log(SDB_LOG_INFO, "plugin: Successfully loaded "
"plugin '%s' v%i (%s)\n\t%s\n\tLicense: %s",
- INFO_GET(&info, name), info.plugin_version,
- INFO_GET(&info, description),
- INFO_GET(&info, copyright),
- INFO_GET(&info, license));
+ INFO_GET(&ctx->info, name), ctx->info.plugin_version,
+ INFO_GET(&ctx->info, description),
+ INFO_GET(&ctx->info, copyright),
+ INFO_GET(&ctx->info, license));
- sdb_plugin_info_clear(&info);
/* any registered callbacks took ownership of the context */
sdb_object_deref(SDB_OBJ(ctx));
int
sdb_plugin_register_config(const char *name, sdb_plugin_config_cb callback)
{
- return sdb_plugin_add_callback(&config_list, "init", name,
+ return plugin_add_callback(&config_list, "init", name,
callback, NULL);
} /* sdb_plugin_register_config */
sdb_plugin_register_init(const char *name, sdb_plugin_init_cb callback,
sdb_object_t *user_data)
{
- return sdb_plugin_add_callback(&init_list, "init", name,
+ return plugin_add_callback(&init_list, "init", name,
callback, user_data);
} /* sdb_plugin_register_init */
sdb_plugin_register_shutdown(const char *name, sdb_plugin_shutdown_cb callback,
sdb_object_t *user_data)
{
- return sdb_plugin_add_callback(&shutdown_list, "shutdown", name,
+ return plugin_add_callback(&shutdown_list, "shutdown", name,
callback, user_data);
} /* sdb_plugin_register_shutdown */
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,
+ return plugin_add_callback(&log_list, "log", name, callback,
user_data);
} /* sdb_plugin_register_log */
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,
+ return plugin_add_callback(&cname_list, "cname", name, callback,
user_data);
} /* sdb_plugin_register_cname */
@@ -560,7 +581,7 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback
}
if (sdb_llist_insert_sorted(collector_list, obj,
- sdb_plugin_cmp_next_update)) {
+ plugin_cmp_next_update)) {
sdb_object_deref(obj);
return -1;
}
}
if (sdb_llist_insert_sorted(collector_list, obj,
- sdb_plugin_cmp_next_update)) {
+ plugin_cmp_next_update)) {
sdb_log(SDB_LOG_ERR, "plugin: Failed to re-insert "
"plugin '%s' into collector list. Unable to further "
"use the plugin.",