src/spbot/module.c
branchnew-lib-errors
changeset 218 5229a5d098b2
parent 217 7728d6ec3abf
--- 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 {