*/
struct kmod_module {
struct kmod_ctx *ctx;
+ char *hashkey;
char *name;
char *path;
struct kmod_list *dep;
return 0;
}
- m = malloc(sizeof(*m) + namelen + 1);
+ namesep = strchr(name_norm, '/');
+ m = malloc(sizeof(*m) + (namesep == NULL ? 1 : 2) * namelen + 2);
if (m == NULL) {
free(m);
return -ENOMEM;
m->name = (char *)m + sizeof(*m);
memcpy(m->name, name_norm, namelen + 1);
- m->refcount = 1;
-
- /* set alias later, so m->name is still modname/modalias */
- kmod_pool_add_module(ctx, m);
+ if (namesep) {
+ size_t len = namesep - name_norm;
- namesep = strchr(m->name, '/');
- if (namesep != NULL) {
- *namesep = '\0';
- m->alias = namesep + 1;
+ m->name[len] = '\0';
+ m->alias = m->name + len + 1;
+ m->hashkey = m->name + namelen + 1;
+ memcpy(m->hashkey, name_norm, namelen + 1);
+ } else {
+ m->hashkey = m->name;
}
+ m->refcount = 1;
+ kmod_pool_add_module(ctx, m, m->hashkey);
*mod = m;
return 0;
m->name = (char *)m + sizeof(*m);
memcpy(m->name, name, namelen);
m->path = abspath;
+ m->hashkey = m->name;
m->refcount = 1;
- kmod_pool_add_module(ctx, m);
+ kmod_pool_add_module(ctx, m, m->hashkey);
*mod = m;
char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name) __attribute__((nonnull(1,2)));
-struct kmod_module *kmod_pool_get_module(struct kmod_ctx *ctx, const char *name) __attribute__((nonnull(1,2)));
-void kmod_pool_add_module(struct kmod_ctx *ctx, struct kmod_module *mod) __attribute__((nonnull(1,2)));
-void kmod_pool_del_module(struct kmod_ctx *ctx, struct kmod_module *mod) __attribute__((nonnull(1,2)));
+struct kmod_module *kmod_pool_get_module(struct kmod_ctx *ctx, const char *key) __attribute__((nonnull(1,2)));
+void kmod_pool_add_module(struct kmod_ctx *ctx, struct kmod_module *mod, const char *key) __attribute__((nonnull(1,2, 3)));
+void kmod_pool_del_module(struct kmod_ctx *ctx, struct kmod_module *mod, const char *key) __attribute__((nonnull(1,2, 3)));
const struct kmod_list *kmod_get_options(const struct kmod_ctx *ctx) __must_check __attribute__((nonnull(1)));
const struct kmod_list *kmod_get_install_commands(const struct kmod_ctx *ctx) __must_check __attribute__((nonnull(1)));
}
struct kmod_module *kmod_pool_get_module(struct kmod_ctx *ctx,
- const char *name)
+ const char *key)
{
struct kmod_module *mod;
- mod = kmod_hash_find(ctx->modules_by_name, name);
+ mod = kmod_hash_find(ctx->modules_by_name, key);
- DBG(ctx, "get module name='%s' found=%p\n", name, mod);
+ DBG(ctx, "get module name='%s' found=%p\n", key, mod);
return mod;
}
-void kmod_pool_add_module(struct kmod_ctx *ctx, struct kmod_module *mod)
+void kmod_pool_add_module(struct kmod_ctx *ctx, struct kmod_module *mod,
+ const char *key)
{
- const char *name = kmod_module_get_name(mod);
+ DBG(ctx, "add %p key='%s'\n", mod, key);
- DBG(ctx, "add %p name='%s'\n", mod, name);
-
- kmod_hash_add(ctx->modules_by_name, name, mod);
+ kmod_hash_add(ctx->modules_by_name, key, mod);
}
-void kmod_pool_del_module(struct kmod_ctx *ctx, struct kmod_module *mod)
+void kmod_pool_del_module(struct kmod_ctx *ctx, struct kmod_module *mod,
+ const char *key)
{
- const char *name = kmod_module_get_name(mod);
-
- DBG(ctx, "del %p name='%s'\n", mod, name);
+ DBG(ctx, "del %p key='%s'\n", mod, key);
- kmod_hash_del(ctx->modules_by_name, name);
+ kmod_hash_del(ctx->modules_by_name, key);
}
static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx,