#include #include #include modules::modules (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; } faultcode_t 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; } faultcode_t 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 () { list_type::iterator it = modlist().begin (); list_type::iterator et = modlist().end (); while (--et != it) { module *m = *et; if (m->enabled) m->fini (); delete m; } }