libkmod: Add lookup from module name

Slightly different than kmod_module_new_from_lookup(): it doesn't
consider aliases, only module names. This is useful for cases we want to
force a tool to handle something as the module name, without trying to
interpret it as an alias.

Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
This commit is contained in:
Lucas De Marchi 2022-02-15 23:10:58 -08:00
parent a859220483
commit 9becaaea25
3 changed files with 61 additions and 0 deletions

View File

@ -591,6 +591,63 @@ KMOD_EXPORT int kmod_module_new_from_lookup(struct kmod_ctx *ctx,
return err;
}
/**
* kmod_module_new_from_name_lookup:
* @ctx: kmod library context
* @modname: module name to look for
* @mod: returned module on success
*
* Lookup by module name, without considering possible aliases. This is similar
* to kmod_module_new_from_lookup(), but don't consider as source indexes and
* configurations that work with aliases. When succesful, this always resolves
* to one and only one module.
*
* The search order is: 1. module names in modules.dep index;
* 2. builtin indexes from kernel.
*
* The initial refcount is 1, and needs to be decremented to release the
* resources of the kmod_module. Since libkmod keeps track of all
* kmod_modules created, they are all released upon @ctx destruction too. Do
* not unref @ctx before all the desired operations with the returned list are
* completed.
*
* Returns: 0 on success or < 0 otherwise. It fails if any of the lookup
* methods failed, which is basically due to memory allocation failure. If
* module is not found, it still returns 0, but @mod is left untouched.
*/
KMOD_EXPORT int kmod_module_new_from_name_lookup(struct kmod_ctx *ctx,
const char *modname,
struct kmod_module **mod)
{
const lookup_func lookup[] = {
kmod_lookup_alias_from_moddep_file,
kmod_lookup_alias_from_builtin_file,
kmod_lookup_alias_from_kernel_builtin_file,
};
char name_norm[PATH_MAX];
struct kmod_list *list = NULL;
int err;
if (ctx == NULL || modname == NULL || mod == NULL)
return -ENOENT;
modname_normalize(modname, name_norm, NULL);
DBG(ctx, "input modname=%s, normalized=%s\n", modname, name_norm);
err = __kmod_module_new_from_lookup(ctx, lookup, sizeof(lookup),
name_norm, &list);
DBG(ctx, "lookup=%s found=%d\n", name_norm, err >= 0 && list);
if (err >= 0 && list != NULL)
*mod = kmod_module_get_module(list);
kmod_module_unref_list(list);
return err;
}
/**
* kmod_module_unref_list:
* @list: list of kmod modules

View File

@ -129,6 +129,9 @@ int kmod_module_new_from_path(struct kmod_ctx *ctx, const char *path,
struct kmod_module **mod);
int kmod_module_new_from_lookup(struct kmod_ctx *ctx, const char *given_alias,
struct kmod_list **list);
int kmod_module_new_from_name_lookup(struct kmod_ctx *ctx,
const char *modname,
struct kmod_module **mod);
int kmod_module_new_from_loaded(struct kmod_ctx *ctx,
struct kmod_list **list);

View File

@ -30,6 +30,7 @@ global:
kmod_module_new_from_name;
kmod_module_new_from_path;
kmod_module_new_from_lookup;
kmod_module_new_from_name_lookup;
kmod_module_new_from_loaded;
kmod_module_ref;
kmod_module_unref;