From: Timo Sirainen Date: Sat, 1 Oct 2011 14:22:44 +0000 (+0300) Subject: module_dir_load*(): Support filtering and ignoring missing modules. X-Git-Tag: 2.1.beta1~110 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=39d3ce140bb088d97e2b79d309941fb4c0095a92;p=thirdparty%2Fdovecot%2Fcore.git module_dir_load*(): Support filtering and ignoring missing modules. --- diff --git a/src/lib/module-dir.c b/src/lib/module-dir.c index 7ae41c0b97..6183b96265 100644 --- a/src/lib/module-dir.c +++ b/src/lib/module-dir.c @@ -263,8 +263,13 @@ static int module_name_cmp(const char *const *n1, const char *const *n2) 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 @@ module_dir_load_real(struct module *old_modules, 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 @@ module_dir_load_real(struct module *old_modules, } } 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') { diff --git a/src/lib/module-dir.h b/src/lib/module-dir.h index c4191e1e0d..855a1e5d4d 100644 --- a/src/lib/module-dir.h +++ b/src/lib/module-dir.h @@ -11,12 +11,18 @@ struct module_dir_load_settings { /* 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 _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 {