dovecot-2.0: module_dir_load_missing(): If all modules are alrea...

dovecot at dovecot.org dovecot at dovecot.org
Tue Apr 13 13:23:34 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/88959ce9c8e4
changeset: 11134:88959ce9c8e4
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Apr 13 13:23:31 2010 +0300
description:
module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.

diffstat:

 src/lib/module-dir.c |  64 ++++++++++++++++++++++---------
 1 files changed, 45 insertions(+), 19 deletions(-)

diffs (127 lines):

diff -r b24789f95476 -r 88959ce9c8e4 src/lib/module-dir.c
--- a/src/lib/module-dir.c	Tue Apr 13 12:49:48 2010 +0300
+++ b/src/lib/module-dir.c	Tue Apr 13 13:23:31 2010 +0300
@@ -172,7 +172,6 @@
 	if (names == NULL)
 		return TRUE;
 
-	name = module_name_drop_suffix(name);
 	for (; *names != NULL; names++) {
 		if (strcmp(*names, name) == 0) {
 			*names = "";
@@ -202,14 +201,40 @@
 static bool module_is_loaded(struct module *modules, const char *name)
 {
 	struct module *module;
+	unsigned int len = strlen(name);
 
 	for (module = modules; module != NULL; module = module->next) {
-		if (strcmp(module->name, name) == 0)
-			return TRUE;
+		if (strncmp(module->name, name, len) == 0) {
+			if (module->name[len] == '\0' ||
+			    strcmp(module->name + len, "_plugin") == 0)
+				return TRUE;
+		}
 	}
 	return FALSE;
 }
 
+static void module_names_fix(const char **module_names)
+{
+	unsigned int i;
+
+	/* allow giving the module names also in non-base form.
+	   convert them in here. */
+	for (i = 0; module_names[i] != NULL; i++)
+		module_names[i] = module_file_get_name(module_names[i]);
+}
+
+static bool
+module_dir_is_all_loaded(struct module *old_modules, const char **module_names)
+{
+	unsigned int i;
+
+	for (i = 0; module_names[i] != NULL; i++) {
+		if (!module_is_loaded(old_modules, module_names[i]))
+			return FALSE;
+	}
+	return TRUE;
+}
+
 static struct module *
 module_dir_load_real(struct module *old_modules,
 		     const char *dir, const char **module_names,
@@ -223,6 +248,11 @@
 	ARRAY_TYPE(const_string) names;
 	pool_t pool;
 
+	if (module_names != NULL) {
+		if (module_dir_is_all_loaded(old_modules, module_names))
+			return old_modules;
+	}
+
 	if (set->debug)
 		i_debug("Loading modules from directory: %s", dir);
 
@@ -259,28 +289,24 @@
 		name = p_strdup(pool, d->d_name);
 		array_append(&names, &name, 1);
 	}
+	if (closedir(dirp) < 0)
+		i_error("closedir(%s) failed: %m", dir);
 
 	array_sort(&names, module_name_cmp);
 	names_p = array_get(&names, &count);
 
-	if (module_names != NULL) {
-		/* allow giving the module names also in non-base form.
-		   convert them in here. */
-		for (i = 0; module_names[i] != NULL; i++)
-			module_names[i] = module_file_get_name(module_names[i]);
-	}
-
 	modules = old_modules;
 	module_pos = &modules;
 	while (*module_pos != NULL)
 		module_pos = &(*module_pos)->next;
 	for (i = 0; i < count; i++) T_BEGIN {
-		const char *path, *stripped_name;
+		const char *path, *stripped_name, *suffixless_name;
 
 		name = names_p[i];
 		stripped_name = module_file_get_name(name);
-		if (!module_want_load(module_names, stripped_name) ||
-		    module_is_loaded(old_modules, stripped_name))
+		suffixless_name = module_name_drop_suffix(stripped_name);
+		if (!module_want_load(module_names, suffixless_name) ||
+		    module_is_loaded(old_modules, suffixless_name))
 			module = NULL;
 		else {
 			path = t_strconcat(dir, "/", name, NULL);
@@ -305,10 +331,6 @@
 		}
 	}
 	pool_unref(&pool);
-
-	if (closedir(dirp) < 0)
-		i_error("closedir(%s) failed: %m", dir);
-
 	return modules;
 }
 
@@ -320,8 +342,12 @@
 	struct module *modules;
 
 	T_BEGIN {
-		const char **arr = module_names == NULL ? NULL :
-			t_strsplit_spaces(module_names, ", ");
+		const char **arr = NULL;
+
+		if (module_names != NULL) {
+			arr = t_strsplit_spaces(module_names, ", ");
+			module_names_fix(arr);
+		}
 
 		modules = module_dir_load_real(old_modules, dir, arr, set);
 	} T_END;


More information about the dovecot-cvs mailing list