diff -r 7728d6ec3abf -r 5229a5d098b2 src/spbot/module.c --- 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 #include #include @@ -8,22 +8,24 @@ #include 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 {