]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
module_dir_load*(): Support filtering and ignoring missing modules.
authorTimo Sirainen <tss@iki.fi>
Sat, 1 Oct 2011 14:22:44 +0000 (17:22 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 1 Oct 2011 14:22:44 +0000 (17:22 +0300)
src/lib/module-dir.c
src/lib/module-dir.h

index 7ae41c0b970e9a6706eda9a27020c00a73fbf7f1..6183b9626573bae92c8f9d809af231a7ad2082fc 100644 (file)
@@ -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') {
index c4191e1e0dbfcdfe642f14da26b13fcbc7306db1..855a1e5d4d6303cd17f5095fd2573a9d8d9cdc27 100644 (file)
@@ -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 <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 {