diff options
Diffstat (limited to 'src/module.c')
-rw-r--r-- | src/module.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/module.c b/src/module.c index 212b740..c009971 100644 --- a/src/module.c +++ b/src/module.c @@ -257,3 +257,44 @@ module_flush(const char *name, void *modcfg) if (mod->flush) mod->flush(modcfg); } + +void +module_help(const char *modname) +{ + lt_dladvise advise = NULL; + struct module mod; + void (*help)(void); + + if (lt_dlinit()) { + wy_log(LOG_ERR, _("failed to initialize libtool")); + exit(EX_UNAVAILABLE); + } + + lt_dladdsearchdir(WYDAWCA_MODDIR); + + if (lt_dladvise_init(&advise)) + wy_log(LOG_ERR, "lt_dladvise_init: %s", lt_dlerror()); + else { + if (lt_dladvise_ext(&advise)) + wy_log(LOG_ERR, "lt_dladvise_ext: %s", lt_dlerror()); + if (lt_dladvise_global(&advise)) + wy_log(LOG_ERR, "lt_dladvise_global: %s", + lt_dlerror()); + } + + memset(&mod, 0, sizeof(mod)); + mod.path = modname; + + if (modload(&mod, advise)) + exit(EX_UNAVAILABLE); + + lt_dladvise_destroy(&advise); + + help = resolve_sym(&mod, "help"); + if (!help) + wy_log(LOG_NOTICE, "no help for %s", modname); + else + help(); + + lt_dlclose(mod.handle); +} |