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 {