diff options
Diffstat (limited to 'modutils/modutils.c')
-rw-r--r-- | modutils/modutils.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/modutils/modutils.c b/modutils/modutils.c index ef4134af5..8e9eef72d 100644 --- a/modutils/modutils.c +++ b/modutils/modutils.c | |||
@@ -16,6 +16,57 @@ extern int delete_module(const char *module, unsigned int flags); | |||
16 | # define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags) | 16 | # define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags) |
17 | #endif | 17 | #endif |
18 | 18 | ||
19 | static module_entry *helper_get_module(module_db *db, const char *module, int create) | ||
20 | { | ||
21 | char modname[MODULE_NAME_LEN]; | ||
22 | struct module_entry *e; | ||
23 | unsigned i, hash; | ||
24 | |||
25 | filename2modname(module, modname); | ||
26 | |||
27 | hash = 0; | ||
28 | for (i = 0; modname[i]; i++) | ||
29 | hash = ((hash << 5) + hash) + modname[i]; | ||
30 | hash %= MODULE_HASH_SIZE; | ||
31 | |||
32 | for (e = db->buckets[hash]; e; e = e->next) | ||
33 | if (strcmp(e->modname, modname) == 0) | ||
34 | return e; | ||
35 | if (!create) | ||
36 | return NULL; | ||
37 | |||
38 | e = xzalloc(sizeof(*e)); | ||
39 | e->modname = xstrdup(modname); | ||
40 | e->next = db->buckets[hash]; | ||
41 | db->buckets[hash] = e; | ||
42 | e->dnext = e->dprev = e; | ||
43 | |||
44 | return e; | ||
45 | } | ||
46 | module_entry* FAST_FUNC moddb_get(module_db *db, const char *module) | ||
47 | { | ||
48 | return helper_get_module(db, module, 0); | ||
49 | } | ||
50 | module_entry* FAST_FUNC moddb_get_or_create(module_db *db, const char *module) | ||
51 | { | ||
52 | return helper_get_module(db, module, 1); | ||
53 | } | ||
54 | |||
55 | void FAST_FUNC moddb_free(module_db *db) | ||
56 | { | ||
57 | module_entry *e, *n; | ||
58 | unsigned i; | ||
59 | |||
60 | for (i = 0; i < MODULE_HASH_SIZE; i++) { | ||
61 | for (e = db->buckets[i]; e; e = n) { | ||
62 | n = e->next; | ||
63 | free(e->name); | ||
64 | free(e->modname); | ||
65 | free(e); | ||
66 | } | ||
67 | } | ||
68 | } | ||
69 | |||
19 | void FAST_FUNC replace(char *s, char what, char with) | 70 | void FAST_FUNC replace(char *s, char what, char with) |
20 | { | 71 | { |
21 | while (*s) { | 72 | while (*s) { |