Mercurial > dovecot > core-2.2
changeset 13569:976e414d5bf4
module_dir_load*(): Support filtering and ignoring missing modules.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 01 Oct 2011 17:22:44 +0300 |
parents | 406a1d52390b |
children | f53cf5670adf |
files | src/lib/module-dir.c src/lib/module-dir.h |
diffstat | 2 files changed, 14 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/module-dir.c Sat Oct 01 17:09:00 2011 +0300 +++ b/src/lib/module-dir.c Sat Oct 01 17:22:44 2011 +0300 @@ -263,8 +263,13 @@ return strcmp(s1, s2); } -static bool module_want_load(const char **names, const char *name) +static bool module_want_load(const struct module_dir_load_settings *set, + const char **names, const char *name) { + if (set->filter_callback != NULL) { + if (!set->filter_callback(name, set->filter_context)) + return FALSE; + } if (names == NULL) return TRUE; @@ -412,7 +417,7 @@ name = names_p[i]; stripped_name = module_file_get_name(name); suffixless_name = module_name_drop_suffix(stripped_name); - if (!module_want_load(module_names, suffixless_name) || + if (!module_want_load(set, module_names, suffixless_name) || module_is_loaded(old_modules, suffixless_name)) module = NULL; else { @@ -428,7 +433,7 @@ } } T_END; - if (module_names != NULL) { + if (module_names != NULL && !set->ignore_missing) { /* make sure all modules were found */ for (; *module_names != NULL; module_names++) { if (**module_names != '\0') {
--- a/src/lib/module-dir.h Sat Oct 01 17:09:00 2011 +0300 +++ b/src/lib/module-dir.h Sat Oct 01 17:22:44 2011 +0300 @@ -11,12 +11,18 @@ /* Setting name used in plugin dependency error message */ const char *setting_name; + /* If non-NULL, load only modules where filter_callback returns TRUE */ + bool (*filter_callback)(const char *name, void *context); + void *filter_context; + /* Require all plugins to have <plugin_name>_init() function */ unsigned int require_init_funcs:1; /* Enable debug logging */ unsigned int debug:1; /* If dlopen() fails for some modules, silently skip it. */ unsigned int ignore_dlopen_errors:1; + /* Don't fail if some specified modules weren't found */ + unsigned int ignore_missing:1; }; struct module {