ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/ermyth/src/module.C
Revision: 1.7
Committed: Sat Sep 22 14:27:30 2007 UTC (16 years, 8 months ago) by pippijn
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +6 -6 lines
Log Message:
split up ermyth into ermyth-modules, libermyth (currently just ermyth-util) and ermyth-core

File Contents

# User Rev Content
1 pippijn 1.6 /*
2     * module.C: Module management.
3     *
4     * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team
5     * Rights to this code are as documented in COPYING.
6     */
7 pippijn 1.4 #include <svsconfig.h>
8     #include <common.h>
9     #include <ermyth/module.h>
10 pippijn 1.1
11 pippijn 1.5 modules::modules (impl::srcinf const &si, char const * const name, bool norestart, bool (*init)(module *), void (*fini)(),
12 pippijn 1.4 char const * const vendor, char const * const modversion)
13 pippijn 1.1 {
14 pippijn 1.4 if (provides (name))
15 pippijn 1.7 throw module_exception (si, "Trying to register two modules with the same name: %s", name);
16 pippijn 1.4 module *mod = new module (name, norestart, init, fini, vendor, modversion);
17     modlist ().push_back (mod);
18     provides (name);
19 pippijn 1.1 }
20    
21 pippijn 1.4 bool
22     modules::provides (char const * const name)
23 pippijn 1.1 {
24 pippijn 1.4 if (find (name) != NULL)
25     return true;
26     return false;
27 pippijn 1.1 }
28    
29 pippijn 1.5 fault::code
30 pippijn 1.4 modules::enable (char const * const name)
31 pippijn 1.1 {
32 pippijn 1.4 module *m = find (name);
33 pippijn 1.1
34 pippijn 1.4 if (!m)
35 pippijn 1.5 return fault::nosuch_target;
36 pippijn 1.4
37     if (m->enabled)
38 pippijn 1.5 return fault::nochange;
39 pippijn 1.1
40 pippijn 1.4 m->enabled = m->init (m);
41 pippijn 1.1
42 pippijn 1.5 return m->enabled ? fault::ok : fault::failed;
43 pippijn 1.1 }
44    
45 pippijn 1.5 fault::code
46 pippijn 1.4 modules::disable (char const * const name)
47 pippijn 1.1 {
48 pippijn 1.4 module *m = find (name);
49 pippijn 1.1
50     if (!m)
51 pippijn 1.5 return fault::nosuch_target;
52 pippijn 1.1
53 pippijn 1.4 if (m->norestart)
54 pippijn 1.5 return fault::noprivs;
55 pippijn 1.1
56 pippijn 1.4 if (m->enabled)
57     m->fini ();
58     else
59 pippijn 1.5 return fault::nochange;
60 pippijn 1.1
61 pippijn 1.4 m->enabled = false;
62 pippijn 1.1
63 pippijn 1.5 return fault::ok;
64 pippijn 1.1 }
65    
66 pippijn 1.4 module *
67     modules::find (char const * const name)
68 pippijn 1.1 {
69 pippijn 1.4 foreach (module *m, modlist ())
70     if (!strcmp (m->name, name))
71 pippijn 1.1 return m;
72    
73     return NULL;
74     }
75    
76 pippijn 1.4 void
77     modules::cleanup ()
78 pippijn 1.1 {
79 pippijn 1.7 while (!modlist ().empty ())
80     {
81     module *m = modlist ().back ();
82 pippijn 1.1
83 pippijn 1.4 if (m->enabled)
84     m->fini ();
85     delete m;
86 pippijn 1.7
87     modlist ().pop_back ();
88 pippijn 1.4 }
89 pippijn 1.1 }