changeset 10009:bdd87f9ccccf HEAD

module_dir_load(): Support <name>_dependencies array listing required modules.
author Timo Sirainen <tss@iki.fi>
date Thu, 08 Oct 2009 21:19:29 -0400
parents a15182f41f30
children 399d769e593c
files src/lib/module-dir.c
diffstat 1 files changed, 40 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/module-dir.c	Thu Oct 08 20:49:31 2009 -0400
+++ b/src/lib/module-dir.c	Thu Oct 08 21:19:29 2009 -0400
@@ -82,9 +82,40 @@
 	i_free(module);
 }
 
+static bool
+module_check_missing_dependencies(struct module *module,
+				  struct module *all_modules)
+{
+	const char **deps;
+	struct module *m;
+	unsigned int len;
+
+	deps = dlsym(module->handle,
+		     t_strconcat(module->name, "_dependencies", NULL));
+	if (deps == NULL)
+		return TRUE;
+
+	for (; *deps != NULL; deps++) {
+		len = strlen(*deps);
+		for (m = all_modules; m != NULL; m = m->next) {
+			if (strncmp(m->name, *deps, len) == 0 &&
+			    (m->name[len] == '\0' ||
+			     strcmp(m->name+len, "_plugin") == 0))
+				break;
+		}
+		if (m == NULL) {
+			i_error("Can't load plugin %s: "
+				"Plugin %s must be loaded also",
+				module->name, *deps);
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
+
 static struct module *
 module_load(const char *path, const char *name, bool require_init_funcs,
-	    const char *version)
+	    const char *version, struct module *all_modules)
 {
 	void *handle;
 	struct module *module;
@@ -128,6 +159,12 @@
 		return NULL;
 	}
 
+	if (!module_check_missing_dependencies(module, all_modules)) {
+		module->deinit = NULL;
+		module_free(module);
+		return NULL;
+	}
+
 	if (getenv("DEBUG") != NULL)
 		i_info("Module loaded: %s", path);
 	return module;
@@ -258,7 +295,8 @@
 		else {
 			path = t_strconcat(dir, "/", name, NULL);
 			module = module_load(path, stripped_name,
-					     require_init_funcs, version);
+					     require_init_funcs, version,
+					     modules);
 			if (module == NULL && module_names_arr != NULL)
 				i_fatal("Couldn't load required plugins");
 		}