Mercurial > dovecot > core-2.2
changeset 11134:88959ce9c8e4 HEAD
module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 13 Apr 2010 13:23:31 +0300 |
parents | b24789f95476 |
children | 7d541fcfcb5e |
files | src/lib/module-dir.c |
diffstat | 1 files changed, 45 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- 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;