Mercurial > dovecot > core-2.2
changeset 10009:bdd87f9ccccf HEAD
module_dir_load(): Support <name>_dependencies array listing required modules.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 08 Oct 2009 21:19:29 -0400 |
parents | a15182f41f30 |
children | 399d769e593c |
files | src/lib/module-dir.c |
diffstat | 1 files changed, 40 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/module-dir.c Thu Oct 08 20:49:31 2009 -0400 +++ b/src/lib/module-dir.c Thu Oct 08 21:19:29 2009 -0400 @@ -82,9 +82,40 @@ i_free(module); } +static bool +module_check_missing_dependencies(struct module *module, + struct module *all_modules) +{ + const char **deps; + struct module *m; + unsigned int len; + + deps = dlsym(module->handle, + t_strconcat(module->name, "_dependencies", NULL)); + if (deps == NULL) + return TRUE; + + for (; *deps != NULL; deps++) { + len = strlen(*deps); + for (m = all_modules; m != NULL; m = m->next) { + if (strncmp(m->name, *deps, len) == 0 && + (m->name[len] == '\0' || + strcmp(m->name+len, "_plugin") == 0)) + break; + } + if (m == NULL) { + i_error("Can't load plugin %s: " + "Plugin %s must be loaded also", + module->name, *deps); + return FALSE; + } + } + return TRUE; +} + static struct module * module_load(const char *path, const char *name, bool require_init_funcs, - const char *version) + const char *version, struct module *all_modules) { void *handle; struct module *module; @@ -128,6 +159,12 @@ return NULL; } + if (!module_check_missing_dependencies(module, all_modules)) { + module->deinit = NULL; + module_free(module); + return NULL; + } + if (getenv("DEBUG") != NULL) i_info("Module loaded: %s", path); return module; @@ -258,7 +295,8 @@ else { path = t_strconcat(dir, "/", name, NULL); module = module_load(path, stripped_name, - require_init_funcs, version); + require_init_funcs, version, + modules); if (module == NULL && module_names_arr != NULL) i_fatal("Couldn't load required plugins"); }