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;
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 {
}
} 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') {
/* 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 {