--- a/src/spbot/module.c Wed May 27 23:57:48 2009 +0300
+++ b/src/spbot/module.c Thu May 28 00:35:02 2009 +0300
@@ -1,5 +1,5 @@
#include "module.h"
-#include "log.h"
+#include <lib/log.h>
#include <stdlib.h>
#include <unistd.h>
@@ -8,22 +8,24 @@
#include <assert.h>
const struct error_list module_errors = ERROR_LIST("module",
- ERROR_TYPE_STRING( ERR_MODULE_NAME, "invalid module name" ),
- ERROR_TYPE( ERR_MODULE_DUP, "module already loaded" ),
- ERROR_TYPE_STRING( ERR_MODULE_PATH, "invalid module path" ),
- ERROR_TYPE_STRING( ERR_MODULE_OPEN, "module dlopen() failed" ),
- ERROR_TYPE_STRING( ERR_MODULE_SYM, "module dlsym() failed" ),
- ERROR_TYPE_STRING( ERR_MODULE_INIT_FUNC, "invalid module init func" ),
- ERROR_TYPE_STRING( ERR_MODULE_CONF, "module_conf" )
+ ERROR_TYPE_STRING( ERR_MODULE_NAME, "invalid module name" ),
+ ERROR_TYPE( ERR_MODULE_DUP, "module already loaded" ),
+ ERROR_TYPE_STRING( ERR_MODULE_PATH, "invalid module path" ),
+ ERROR_TYPE_STRING( ERR_MODULE_OPEN, "module dlopen() failed" ),
+ ERROR_TYPE_STRING( ERR_MODULE_SYM, "module dlsym() failed" ),
+ ERROR_TYPE_STRING( ERR_MODULE_INIT_FUNC, "invalid module init func" ),
+ ERROR_TYPE_STRING( ERR_MODULE_CONF, "module_conf" ),
+ ERROR_TYPE( ERR_MODULE_STATE, "module in wrong state for operation" ),
+ ERROR_TYPE( ERR_MODULE_UNLOAD, "unable to unload module" )
);
-err_t modules_create (struct modules **modules_ptr, struct nexus *nexus)
+err_t modules_create (struct modules **modules_ptr, struct nexus *nexus, error_t *err)
{
struct modules *modules;
// alloc
if ((modules = calloc(1, sizeof(*modules))) == NULL)
- return ERR_CALLOC;
+ return SET_ERROR_MEM(err);
// init
TAILQ_INIT(&modules->list);
@@ -85,12 +87,12 @@
err_t modules_unload (struct modules *modules)
{
struct module *module;
- err_t err;
+ error_t err;
// unload each module in turn
while ((module = TAILQ_FIRST(&modules->list))) {
- if ((err = module_unload(module)))
- log_warn("module_unload(%s) failed: %s", module->info.name, error_name(err));
+ if (module_unload(module, &err))
+ log_warn_error(&err, "module_unload(%s) failed", module->info.name);
}
// ok
@@ -208,7 +210,7 @@
// alloc
if ((module = calloc(1, sizeof(*module))) == NULL)
- return SET_ERROR(err, &module_errors, ERR_CALLOC);
+ return SET_ERROR_MEM(err);
// initialize
module->info = *_info;
@@ -240,8 +242,8 @@
JUMP_SET_ERROR_STR(err, &module_errors, ERR_MODULE_OPEN, dlerror());
// load the funcs symbol
- if ((ERROR_CODE(err) = module_symbol(module, (void **) &module->desc, "module")))
- JUMP_SET_ERROR_STR(err, &module_errors, ERROR_CODE(err), dlerror());
+ if (module_symbol(module, (void **) &module->desc, "module", err))
+ goto error;
// call the init func
if ((module->desc->init(modules->nexus, &module->ctx, err)))
@@ -279,11 +281,11 @@
{
// sanity-check
if (!module->desc->config_options)
- RETURN_SET_ERROR_STR(err, &module_errors, ERR_MODULE_CONF, "module does not have any config options");
+ return SET_ERROR_STR(err, &module_errors, ERR_MODULE_CONF, "module does not have any config options");
// wrong state
if (module->unloading)
- RETURN_SET_ERROR_STR(err, &module_errors, ERR_MODULE_CONF, "module is being unloaded");
+ return SET_ERROR_STR(err, &module_errors, ERR_MODULE_CONF, "module is being unloaded");
// parse/apply using the module's stuff
// XXX: error namespaces?
@@ -308,20 +310,18 @@
{
// wrong state
if (module->unloading)
- RETURN_SET_ERROR_STR(err, &module_errors, ERR_MODULE_CONF, "module is being unloaded");
+ return SET_ERROR_STR(err, &module_errors, ERR_MODULE_CONF, "module is being unloaded");
// apply with the module's ctx
// XXX: error namespaces?
return config_apply_opt(opt, module->ctx, value, err);
}
-err_t module_unload (struct module *module)
+err_t module_unload (struct module *module, error_t *err)
{
- err_t err;
-
// wrong state
if (module->unloading)
- return ERR_MODULE_STATE;
+ return SET_ERROR(err, &module_errors, ERR_MODULE_STATE);
// remove from modules list
TAILQ_REMOVE(&module->modules->list, module, modules_list);
@@ -332,11 +332,11 @@
if (module->desc->unload) {
// invoke the unload func, passing it our reference
// note that the module might not exist anymore after calling this
- if ((err = module->desc->unload(module->ctx, module))) {
+ if (module->desc->unload(module->ctx, module, err)) {
// mark it as "unloaded"
module_unloaded(module);
-
- return err;
+
+ return PUSH_ERROR(err, &module_errors, ERR_MODULE_UNLOAD);
}
} else {