dovecot-2.1: module_dir_load*(): Support filtering and ignoring ...

dovecot at dovecot.org dovecot at dovecot.org
Sat Oct 1 17:26:18 EEST 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/976e414d5bf4
changeset: 13569:976e414d5bf4
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Oct 01 17:22:44 2011 +0300
description:
module_dir_load*(): Support filtering and ignoring missing modules.

diffstat:

 src/lib/module-dir.c |  11 ++++++++---
 src/lib/module-dir.h |   6 ++++++
 2 files changed, 14 insertions(+), 3 deletions(-)

diffs (58 lines):

diff -r 406a1d52390b -r 976e414d5bf4 src/lib/module-dir.c
--- 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') {
diff -r 406a1d52390b -r 976e414d5bf4 src/lib/module-dir.h
--- 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 {


More information about the dovecot-cvs mailing list