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