diff --git a/src/core/plugin.c b/src/core/plugin.c
index 0a69bff2364a50e2b7566e4f4d0c4aaa6ec5b74c..26677979b26257e4a9ef89aeed363e9d032e3418 100644 (file)
--- a/src/core/plugin.c
+++ b/src/core/plugin.c
#include "core/error.h"
#include "core/time.h"
#include "utils/llist.h"
+#include "utils/strbuf.h"
#include <assert.h>
int version;
int plugin_version;
};
-#define SDB_PLUGIN_INFO_INIT { "no name set", "no description set", \
- /* copyright */ "", /* license */ "", \
+#define SDB_PLUGIN_INFO_INIT { /* name */ NULL, /* desc */ NULL, \
+ /* copyright */ NULL, /* license */ NULL, \
/* version */ -1, /* plugin_version */ -1 }
+#define INFO_GET(i, attr) \
+ ((i)->attr ? (i)->attr : #attr" not set")
typedef struct {
sdb_object_t super;
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
*/
+static void
+sdb_plugin_info_clear(sdb_plugin_info_t *info)
+{
+ sdb_plugin_info_t empty_info = SDB_PLUGIN_INFO_INIT;
+ if (! info)
+ return;
+
+ if (info->name)
+ free(info->name);
+ if (info->description)
+ free(info->description);
+ if (info->copyright)
+ free(info->copyright);
+ if (info->license)
+ free(info->license);
+
+ *info = empty_info;
+} /* sdb_plugin_info_clear */
+
static void
sdb_plugin_ctx_destructor(void *ctx)
{
sizeof(sdb_plugin_cb_t),
sdb_plugin_cb_init,
- sdb_plugin_cb_destroy,
- /* clone = */ NULL
+ sdb_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,
- /* clone = */ NULL
+ sdb_plugin_cb_destroy
};
static int
lt_dlhandle lh;
int (*mod_init)(sdb_plugin_info_t *);
- sdb_plugin_info_t plugin_info = SDB_PLUGIN_INFO_INIT;
+ sdb_plugin_info_t info = SDB_PLUGIN_INFO_INIT;
int status;
return -1;
}
- status = mod_init(&plugin_info);
+ status = mod_init(&info);
if (status) {
sdb_log(SDB_LOG_ERR, "plugin: Failed to initialize "
"plugin '%s'", name);
+ sdb_plugin_info_clear(&info);
return -1;
}
/* compare minor version */
- if ((plugin_info.version < 0)
- || ((int)(plugin_info.version / 100) != (int)(SDB_VERSION / 100)))
+ if ((info.version < 0)
+ || ((int)(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(plugin_info.version),
+ name, SDB_VERSION_DECODE(info.version),
SDB_VERSION_DECODE(SDB_VERSION));
sdb_log(SDB_LOG_INFO, "plugin: Successfully loaded "
- "plugin '%s' v%i (%s)\n\t%s",
- plugin_info.name, plugin_info.plugin_version,
- plugin_info.description, plugin_info.copyright);
+ "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));
+ sdb_plugin_info_clear(&info);
return 0;
} /* sdb_plugin_load */
case SDB_PLUGIN_INFO_NAME:
{
char *name = va_arg(ap, char *);
- info->name = name;
+ if (name) {
+ if (info->name)
+ free(info->name);
+ info->name = strdup(name);
+ }
}
break;
case SDB_PLUGIN_INFO_DESC:
{
char *desc = va_arg(ap, char *);
- info->description = desc;
+ if (desc) {
+ if (info->description)
+ free(info->description);
+ info->description = strdup(desc);
+ }
}
break;
case SDB_PLUGIN_INFO_COPYRIGHT:
{
char *copyright = va_arg(ap, char *);
- info->copyright = copyright;
+ if (copyright)
+ info->copyright = strdup(copyright);
}
break;
case SDB_PLUGIN_INFO_LICENSE:
{
char *license = va_arg(ap, char *);
- info->license = license;
+ if (license) {
+ if (info->license)
+ free(info->license);
+ info->license = strdup(license);
+ }
}
break;
case SDB_PLUGIN_INFO_VERSION:
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)
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);
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 : */