The function module_load_one() fills a hash table with modules that were successfuly loaded. However, that table is a static variable of module_load_one(). This patch changes it and creates a function that informs whether a given module was loaded or not.
It also creates a function that returns the module name given the typename. Signed-off-by: Jose R. Ziviani <jzivi...@suse.de> --- include/qemu/module.h | 4 +++ util/module.c | 57 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/include/qemu/module.h b/include/qemu/module.h index 3deac0078b..f45773718d 100644 --- a/include/qemu/module.h +++ b/include/qemu/module.h @@ -14,6 +14,7 @@ #ifndef QEMU_MODULE_H #define QEMU_MODULE_H +#include <stdbool.h> #define DSO_STAMP_FUN glue(qemu_stamp, CONFIG_STAMP) #define DSO_STAMP_FUN_STR stringify(DSO_STAMP_FUN) @@ -74,6 +75,9 @@ void module_load_qom_one(const char *type); void module_load_qom_all(void); void module_allow_arch(const char *arch); +bool module_is_loaded(const char *name); +const char *module_get_name_from_obj(const char *obj); + /** * DOC: module info annotation macros * diff --git a/util/module.c b/util/module.c index 6bb4ad915a..f23adc65bf 100644 --- a/util/module.c +++ b/util/module.c @@ -119,6 +119,8 @@ static const QemuModinfo module_info_stub[] = { { static const QemuModinfo *module_info = module_info_stub; static const char *module_arch; +static GHashTable *loaded_modules; + void module_init_info(const QemuModinfo *info) { module_info = info; @@ -206,13 +208,10 @@ static int module_load_file(const char *fname, bool mayfail, bool export_symbols out: return ret; } -#endif bool module_load_one(const char *prefix, const char *lib_name, bool mayfail) { bool success = false; - -#ifdef CONFIG_MODULES char *fname = NULL; #ifdef CONFIG_MODULE_UPGRADES char *version_dir; @@ -223,7 +222,6 @@ bool module_load_one(const char *prefix, const char *lib_name, bool mayfail) int i = 0, n_dirs = 0; int ret; bool export_symbols = false; - static GHashTable *loaded_modules; const QemuModinfo *modinfo; const char **sl; @@ -307,12 +305,9 @@ bool module_load_one(const char *prefix, const char *lib_name, bool mayfail) g_free(dirs[i]); } -#endif return success; } -#ifdef CONFIG_MODULES - static bool module_loaded_qom_all; void module_load_qom_one(const char *type) @@ -377,6 +372,39 @@ void qemu_load_module_for_opts(const char *group) } } +bool module_is_loaded(const char *name) +{ + if (!loaded_modules || !g_hash_table_contains(loaded_modules, name)) { + return false; + } + + return true; +} + +const char *module_get_name_from_obj(const char *obj) +{ + const QemuModinfo *modinfo; + const char **sl; + + if (!obj) { + return NULL; + } + + for (modinfo = module_info; modinfo->name != NULL; modinfo++) { + if (!modinfo->objs) { + continue; + } + + for (sl = modinfo->objs; *sl != NULL; sl++) { + if (strcmp(obj, *sl) == 0) { + return modinfo->name; + } + } + } + + return NULL; +} + #else void module_allow_arch(const char *arch) {} @@ -384,4 +412,19 @@ void qemu_load_module_for_opts(const char *group) {} void module_load_qom_one(const char *type) {} void module_load_qom_all(void) {} +bool module_load_one(const char *prefix, const char *lib_name, bool mayfail) +{ + return false; +} + +bool module_is_loaded(const char *name) +{ + return false; +} + +char *module_get_name_from_obj(const char *obj) +{ + return NULL; +} + #endif -- 2.32.0