--- 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;
+}
+