Code

utils llist: Fixed a segfault in functions doing lookups.
[sysdb.git] / src / core / plugin.c
index a31ede30f2ed4104f104d9780bb6104ed484ed17..ca79284fe60a41b5d17b3f129db277755587e9f7 100644 (file)
  */
 
 struct sdb_plugin_info {
+       char *plugin_name;
+       char *filename;
+
+       /* public attributes */
        char *name;
 
        char *description;
@@ -60,7 +64,9 @@ struct sdb_plugin_info {
        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) \
@@ -69,9 +75,11 @@ struct sdb_plugin_info {
 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))
 
@@ -101,7 +109,8 @@ typedef struct {
  * 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;
@@ -118,12 +127,17 @@ static sdb_llist_t      *log_list = NULL;
  */
 
 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)
@@ -134,7 +148,7 @@ sdb_plugin_info_clear(sdb_plugin_info_t *info)
                free(info->license);
 
        *info = empty_info;
-} /* sdb_plugin_info_clear */
+} /* plugin_info_clear */
 
 static void
 ctx_key_init(void)
@@ -147,7 +161,7 @@ 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;
@@ -159,7 +173,7 @@ sdb_plugin_cmp_next_update(const sdb_object_t *a, const sdb_object_t *b)
        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
@@ -173,14 +187,22 @@ ctx_init(sdb_object_t *obj, va_list __attribute__((unused)) ap)
        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 *
@@ -220,7 +242,7 @@ ctx_set(ctx_t *new)
 } /* 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 *);
@@ -245,32 +267,32 @@ sdb_plugin_cb_init(sdb_object_t *obj, va_list ap)
        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;
@@ -301,7 +323,7 @@ sdb_plugin_add_callback(sdb_llist_t **list, const char *type,
        sdb_log(SDB_LOG_INFO, "plugin: Registered %s callback '%s'.",
                        type, name);
        return 0;
-} /* sdb_plugin_add_callback */
+} /* plugin_add_callback */
 
 /*
  * public API
@@ -320,8 +342,6 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx)
        lt_dlhandle lh;
 
        int (*mod_init)(sdb_plugin_info_t *);
-       sdb_plugin_info_t info = SDB_PLUGIN_INFO_INIT;
-
        int status;
 
        if ((! name) || (! *name))
@@ -368,6 +388,9 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *plugin_ctx)
                return -1;
        }
 
+       ctx->info.plugin_name = strdup(name);
+       ctx->info.filename = strdup(filename);
+
        if (plugin_ctx)
                ctx->public = *plugin_ctx;
 
@@ -379,32 +402,30 @@ sdb_plugin_load(const char *name, const sdb_plugin_ctx_t *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));
 
@@ -485,7 +506,7 @@ sdb_plugin_set_info(sdb_plugin_info_t *info, int type, ...)
 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 */
 
@@ -493,7 +514,7 @@ int
 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 */
 
@@ -501,7 +522,7 @@ int
 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 */
 
@@ -509,7 +530,7 @@ 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,
+       return plugin_add_callback(&log_list, "log", name, callback,
                        user_data);
 } /* sdb_plugin_register_log */
 
@@ -517,7 +538,7 @@ 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,
+       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;
        }
@@ -743,7 +764,7 @@ sdb_plugin_collector_loop(sdb_plugin_loop_t *loop)
                }
 
                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.",