/* * module.C: Module management. * * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in COPYING. */ #include #include #include modules::modules (impl::srcinf const &si, char const * const name, bool norestart, bool (*init)(module *), void (*fini)(), char const * const vendor, char const * const modversion) { if (provides (name)) throw module_exception (si, "Trying to register two modules with the same name: %s", name); module *mod = new module (name, norestart, init, fini, vendor, modversion); modlist ().push_back (mod); provides (name); } bool modules::provides (char const * const name) { if (find (name) != NULL) return true; return false; } fault::code modules::enable (char const * const name) { module *m = find (name); if (!m) return fault::nosuch_target; if (m->enabled) return fault::nochange; m->enabled = m->init (m); return m->enabled ? fault::ok : fault::failed; } fault::code modules::disable (char const * const name) { module *m = find (name); if (!m) return fault::nosuch_target; if (m->norestart) return fault::noprivs; if (m->enabled) m->fini (); else return fault::nochange; m->enabled = false; return fault::ok; } module * modules::find (char const * const name) { foreach (module *m, modlist ()) if (!strcmp (m->name, name)) return m; return NULL; } void modules::cleanup () { while (!modlist ().empty ()) { module *m = modlist ().back (); if (m->enabled) m->fini (); delete m; modlist ().pop_back (); } }