From: Timo Sirainen Date: Fri, 9 Oct 2009 01:19:29 +0000 (-0400) Subject: module_dir_load(): Support _dependencies array listing required modules. X-Git-Tag: 2.0.alpha1~43 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ce36711c87c50d2b44665470123d2c05afe349da;p=thirdparty%2Fdovecot%2Fcore.git module_dir_load(): Support _dependencies array listing required modules. --HG-- branch : HEAD --- diff --git a/src/lib/module-dir.c b/src/lib/module-dir.c index a025200648..f1f967c8ec 100644 --- a/src/lib/module-dir.c +++ b/src/lib/module-dir.c @@ -82,9 +82,40 @@ static void module_free(struct module *module) 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 @@ module_load(const char *path, const char *name, bool require_init_funcs, 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 @@ module_dir_load_real(const char *dir, const char *module_names, 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"); }