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) { |
