src/module.c
changeset 70 a9a4c5e6aa30
parent 66 ef8c9d7daf62
child 100 cfb7776bd6f0
--- a/src/module.c	Mon Mar 16 22:06:39 2009 +0200
+++ b/src/module.c	Mon Mar 16 23:34:05 2009 +0200
@@ -62,6 +62,7 @@
     
     // store
     module->info = *info;
+    module->modules = modules;
 
     // clear dlerrors
     (void) dlerror();
@@ -114,3 +115,44 @@
     // call the conf func
     return module->funcs->conf(module->ctx, name, value, err);
 }
+
+err_t module_unload (struct module *module)
+{
+    err_t err;
+    
+    // invoke the unload func
+    if ((err = module->funcs->unload(module->ctx)))
+        return err;
+
+    // ok
+    return SUCCESS;
+}
+
+void module_destroy (struct module *module)
+{
+    // remove from modules list
+    TAILQ_REMOVE(&module->modules->list, module, modules_list);
+
+    // unload the dl handle
+    if (dlclose(module->handle))
+        log_error("dlclose(%s): %s", module->info.name, dlerror());
+    
+    // free the module info
+    free(module);
+}
+
+err_t modules_unload (struct modules *modules)
+{
+    struct module *module;
+    err_t err;
+
+    // unload each module in turn
+    TAILQ_FOREACH(module, &modules->list, modules_list) {
+        if ((err = module_unload(module)))
+            log_warn("module_unload(%s) failed: %s", module->info.name, error_name(err));
+    }
+
+    // ok
+    return SUCCESS;
+}
+