annotate src/lib/module-dir.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21322
diff changeset
1 /* Copyright (c) 2003-2017 Dovecot authors, see the included COPYING file */
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
4 #include "array.h"
11906
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
5 #include "str.h"
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "module-dir.h"
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #ifdef HAVE_MODULES
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include <unistd.h>
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
11 #include <fcntl.h>
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <dirent.h>
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <dlfcn.h>
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
1525
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
15 #ifndef RTLD_GLOBAL
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
16 # define RTLD_GLOBAL 0
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
17 #endif
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
18
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
19 #ifndef RTLD_NOW
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
20 # define RTLD_NOW 0
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
21 #endif
89aabeac23a3 All systems don't define RTLD_GLOBAL and RTLD_NOW. Default them to 0.
Timo Sirainen <tss@iki.fi>
parents: 1466
diff changeset
22
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
23 static const char *module_name_drop_suffix(const char *name);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
24
10335
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
25 void *module_get_symbol_quiet(struct module *module, const char *symbol)
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
26 {
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
27 /* clear out old errors */
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
28 (void)dlerror();
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
29
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
30 return dlsym(module->handle, symbol);
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
31 }
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
32
2084
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
33 void *module_get_symbol(struct module *module, const char *symbol)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 {
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 const char *error;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 void *ret;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
10335
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
38 ret = module_get_symbol_quiet(module, symbol);
4376
364d9c7563df Handle errors more correctly. Fixes problems with some OSes.
Timo Sirainen <tss@iki.fi>
parents: 4254
diff changeset
39 if (ret == NULL) {
364d9c7563df Handle errors more correctly. Fixes problems with some OSes.
Timo Sirainen <tss@iki.fi>
parents: 4254
diff changeset
40 error = dlerror();
364d9c7563df Handle errors more correctly. Fixes problems with some OSes.
Timo Sirainen <tss@iki.fi>
parents: 4254
diff changeset
41 if (error != NULL) {
364d9c7563df Handle errors more correctly. Fixes problems with some OSes.
Timo Sirainen <tss@iki.fi>
parents: 4254
diff changeset
42 i_error("module %s: dlsym(%s) failed: %s",
364d9c7563df Handle errors more correctly. Fixes problems with some OSes.
Timo Sirainen <tss@iki.fi>
parents: 4254
diff changeset
43 module->path, symbol, error);
364d9c7563df Handle errors more correctly. Fixes problems with some OSes.
Timo Sirainen <tss@iki.fi>
parents: 4254
diff changeset
44 ret = NULL;
364d9c7563df Handle errors more correctly. Fixes problems with some OSes.
Timo Sirainen <tss@iki.fi>
parents: 4254
diff changeset
45 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 return ret;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3753
diff changeset
50 static void *get_symbol(struct module *module, const char *symbol, bool quiet)
2090
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
51 {
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
52 if (quiet)
10335
12434655f2e5 Added module_get_symbol_quiet().
Timo Sirainen <tss@iki.fi>
parents: 10009
diff changeset
53 return module_get_symbol_quiet(module, symbol);
2090
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
54
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
55 return module_get_symbol(module, symbol);
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
56 }
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
57
2084
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
58 static void module_free(struct module *module)
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
59 {
10834
65a91a112d7f Don't call module's deinit() if its init() hasn't been called.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
60 if (module->deinit != NULL && module->initialized)
2084
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
61 module->deinit();
15390
af331bc452d0 module_dir_unload(): Don't dlclose() modules if GDB environment is set.
Timo Sirainen <tss@iki.fi>
parents: 15388
diff changeset
62 /* dlclose()ing removes all symbols from valgrind's visibility.
af331bc452d0 module_dir_unload(): Don't dlclose() modules if GDB environment is set.
Timo Sirainen <tss@iki.fi>
parents: 15388
diff changeset
63 if GDB environment is set, don't actually unload the module
af331bc452d0 module_dir_unload(): Don't dlclose() modules if GDB environment is set.
Timo Sirainen <tss@iki.fi>
parents: 15388
diff changeset
64 (the GDB environment is used elsewhere too) */
af331bc452d0 module_dir_unload(): Don't dlclose() modules if GDB environment is set.
Timo Sirainen <tss@iki.fi>
parents: 15388
diff changeset
65 if (getenv("GDB") == NULL) {
af331bc452d0 module_dir_unload(): Don't dlclose() modules if GDB environment is set.
Timo Sirainen <tss@iki.fi>
parents: 15388
diff changeset
66 if (dlclose(module->handle) != 0)
af331bc452d0 module_dir_unload(): Don't dlclose() modules if GDB environment is set.
Timo Sirainen <tss@iki.fi>
parents: 15388
diff changeset
67 i_error("dlclose(%s) failed: %m", module->path);
af331bc452d0 module_dir_unload(): Don't dlclose() modules if GDB environment is set.
Timo Sirainen <tss@iki.fi>
parents: 15388
diff changeset
68 }
2084
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
69 i_free(module->path);
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
70 i_free(module->name);
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
71 i_free(module);
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
72 }
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
73
10009
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
74 static bool
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
75 module_check_wrong_binary_dependency(const struct module_dir_load_settings *set,
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
76 struct module *module, const char **error_r)
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
77 {
11980
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
78 const char *symbol_name, *binary_dep, *const *names;
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
79 string_t *errstr;
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
80
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
81 if (set->binary_name == NULL)
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
82 return TRUE;
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
83
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
84 symbol_name = t_strconcat(module->name, "_binary_dependency", NULL);
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
85 binary_dep = dlsym(module->handle, symbol_name);
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
86 if (binary_dep == NULL)
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
87 return TRUE;
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
88
11980
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
89 names = t_strsplit(binary_dep, " ");
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
90 if (str_array_find(names, set->binary_name))
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
91 return TRUE;
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
92
11980
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
93 errstr = t_str_new(128);
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
94 str_printfa(errstr, "Can't load plugin %s: "
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
95 "Plugin is intended to be used only by ", module->name);
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
96 if (names[1] == NULL)
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
97 str_printfa(errstr, "%s binary", binary_dep);
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
98 else
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
99 str_printfa(errstr, "binaries: %s", binary_dep);
4b59b19628b1 module_dir_load(): Support multiple binaries for checking dependency
Timo Sirainen <tss@iki.fi>
parents: 11955
diff changeset
100 str_printfa(errstr, " (we're %s)", set->binary_name);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
101 *error_r = str_c(errstr);
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
102 return FALSE;
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
103 }
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
104
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
105 static bool
11906
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
106 module_check_missing_plugin_dependencies(const struct module_dir_load_settings *set,
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
107 struct module *module,
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
108 struct module *all_modules,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
109 const char **error_r)
10009
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
110 {
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
111 const char **deps;
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
112 struct module *m;
11906
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
113 string_t *errmsg;
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21116
diff changeset
114 size_t len;
10009
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
115
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
116 deps = dlsym(module->handle,
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
117 t_strconcat(module->name, "_dependencies", NULL));
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
118 if (deps == NULL)
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
119 return TRUE;
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
120
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
121 for (; *deps != NULL; deps++) {
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
122 len = strlen(*deps);
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
123 for (m = all_modules; m != NULL; m = m->next) {
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
124 if (strncmp(m->name, *deps, len) == 0 &&
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
125 (m->name[len] == '\0' ||
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
126 strcmp(m->name+len, "_plugin") == 0))
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
127 break;
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
128 }
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
129 if (m == NULL) {
11906
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
130 errmsg = t_str_new(128);
18314
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
131 str_printfa(errmsg, "Plugin %s must be loaded also",
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
132 *deps);
11906
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
133 if (set->setting_name != NULL) {
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
134 str_printfa(errmsg,
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
135 " (you must set: %s=$%s %s)",
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
136 set->setting_name,
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
137 set->setting_name, *deps);
02c9154efe81 If module can't be loaded due to missing dependency, suggest a setting how to do it.
Timo Sirainen <tss@iki.fi>
parents: 11748
diff changeset
138 }
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
139 *error_r = str_c(errmsg);
10009
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
140 return FALSE;
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
141 }
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
142 }
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
143 return TRUE;
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
144 }
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
145
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
146 static void *quiet_dlopen(const char *path, int flags)
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
147 {
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
148 #ifndef __OpenBSD__
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
149 return dlopen(path, flags);
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
150 #else
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
151 void *handle;
21116
61d0c09b50f0 global: use dev_null_fd instead of opening /dev/null
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
152 int fd;
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
153
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
154 /* OpenBSD likes to print all "undefined symbol" errors to stderr.
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
155 Hide them by sending them to /dev/null. */
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
156 fd = dup(STDERR_FILENO);
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
157 if (fd == -1)
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
158 i_fatal("dup() failed: %m");
21116
61d0c09b50f0 global: use dev_null_fd instead of opening /dev/null
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
159 if (dup2(dev_null_fd, STDERR_FILENO) < 0)
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
160 i_fatal("dup2() failed: %m");
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
161 handle = dlopen(path, flags);
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
162 if (dup2(fd, STDERR_FILENO) < 0)
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
163 i_fatal("dup2() failed: %m");
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
164 if (close(fd) < 0)
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
165 i_error("close() failed: %m");
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
166 return handle;
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
167 #endif
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
168 }
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
169
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
170 static bool versions_equal(const char *str1, const char *str2)
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
171 {
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
172 while (*str1 == *str2) {
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
173 if (*str1 == '\0' || *str1 == '(')
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
174 return TRUE;
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
175 str1++;
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
176 str2++;
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
177 }
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
178 return FALSE;
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
179 }
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
180
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
181 static int
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
182 module_load(const char *path, const char *name,
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
183 const struct module_dir_load_settings *set,
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
184 struct module *all_modules,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
185 struct module **module_r, const char **error_r)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 {
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 void *handle;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 struct module *module;
5186
a7627141ec7f Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents: 5184
diff changeset
189 const char *const *module_version;
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
190
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
191 *module_r = NULL;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
192 *error_r = NULL;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
194 if (set->ignore_dlopen_errors) {
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
195 handle = quiet_dlopen(path, RTLD_GLOBAL | RTLD_NOW);
11955
99996236fa51 module_dir_load(): If ignore_dlopen_errors and debug is set, still log a debug message about failure.
Timo Sirainen <tss@iki.fi>
parents: 11906
diff changeset
196 if (handle == NULL) {
99996236fa51 module_dir_load(): If ignore_dlopen_errors and debug is set, still log a debug message about failure.
Timo Sirainen <tss@iki.fi>
parents: 11906
diff changeset
197 if (set->debug) {
99996236fa51 module_dir_load(): If ignore_dlopen_errors and debug is set, still log a debug message about failure.
Timo Sirainen <tss@iki.fi>
parents: 11906
diff changeset
198 i_debug("Skipping module %s, "
12178
bac6907a14a8 module_dir_load(): Make it clearer that "Skipping module" debug message is normal.
Timo Sirainen <tss@iki.fi>
parents: 11980
diff changeset
199 "because dlopen() failed: %s "
bac6907a14a8 module_dir_load(): Make it clearer that "Skipping module" debug message is normal.
Timo Sirainen <tss@iki.fi>
parents: 11980
diff changeset
200 "(this is usually intentional, "
bac6907a14a8 module_dir_load(): Make it clearer that "Skipping module" debug message is normal.
Timo Sirainen <tss@iki.fi>
parents: 11980
diff changeset
201 "so just ignore this message)",
11955
99996236fa51 module_dir_load(): If ignore_dlopen_errors and debug is set, still log a debug message about failure.
Timo Sirainen <tss@iki.fi>
parents: 11906
diff changeset
202 name, dlerror());
99996236fa51 module_dir_load(): If ignore_dlopen_errors and debug is set, still log a debug message about failure.
Timo Sirainen <tss@iki.fi>
parents: 11906
diff changeset
203 }
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
204 return 0;
11955
99996236fa51 module_dir_load(): If ignore_dlopen_errors and debug is set, still log a debug message about failure.
Timo Sirainen <tss@iki.fi>
parents: 11906
diff changeset
205 }
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
206 } else {
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
207 handle = dlopen(path, RTLD_GLOBAL | RTLD_NOW);
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
208 if (handle == NULL) {
18314
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
209 *error_r = t_strdup_printf("dlopen() failed: %s",
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
210 dlerror());
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
211 #ifdef RTLD_LAZY
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
212 /* try to give a better error message by lazily loading
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
213 the plugin and checking its dependencies */
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
214 handle = dlopen(path, RTLD_LAZY);
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
215 if (handle == NULL)
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
216 return -1;
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
217 #else
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
218 return -1;
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
219 #endif
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
220 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222
2084
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
223 module = i_new(struct module, 1);
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
224 module->path = i_strdup(path);
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
225 module->name = i_strdup(name);
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
226 module->handle = handle;
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
227
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
228 module_version = set->abi_version == NULL ? NULL :
5186
a7627141ec7f Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents: 5184
diff changeset
229 get_symbol(module, t_strconcat(name, "_version", NULL), TRUE);
a7627141ec7f Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents: 5184
diff changeset
230 if (module_version != NULL &&
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
231 !versions_equal(*module_version, set->abi_version)) {
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
232 *error_r = t_strdup_printf(
18314
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
233 "Module is for different ABI version %s (we have %s)",
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
234 *module_version, set->abi_version);
5184
47e393c4eb4b If module contains a <module_name>_version string, fail if it doesn't match
Timo Sirainen <tss@iki.fi>
parents: 5159
diff changeset
235 module_free(module);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
236 return -1;
5184
47e393c4eb4b If module contains a <module_name>_version string, fail if it doesn't match
Timo Sirainen <tss@iki.fi>
parents: 5159
diff changeset
237 }
47e393c4eb4b If module contains a <module_name>_version string, fail if it doesn't match
Timo Sirainen <tss@iki.fi>
parents: 5159
diff changeset
238
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 /* get our init func */
10412
a9eda7672869 lib-storage: Plugin hook API changed to support per-user plugins within a process.
Timo Sirainen <tss@iki.fi>
parents: 10335
diff changeset
240 module->init = (void (*)(struct module *))
2090
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
241 get_symbol(module, t_strconcat(name, "_init", NULL),
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
242 !set->require_init_funcs);
16899
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
243 module->deinit = (void (*)(void))
2090
0a4b2c006096 Be quiet when we don't want to call init() / deinit() and they don't exist
Timo Sirainen <tss@iki.fi>
parents: 2084
diff changeset
244 get_symbol(module, t_strconcat(name, "_deinit", NULL),
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
245 !set->require_init_funcs);
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246
5148
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
247 if ((module->init == NULL || module->deinit == NULL) &&
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
248 set->require_init_funcs) {
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
249 *error_r = t_strdup_printf(
18314
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
250 "Module doesn't have %s function",
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
251 module->init == NULL ? "init" : "deinit");
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
252 } else if (!module_check_wrong_binary_dependency(set, module, error_r)) {
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
253 /* failed */
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
254 } else if (!module_check_missing_plugin_dependencies(set, module,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
255 all_modules, error_r)) {
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
256 /* failed */
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
257 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
259 if (*error_r != NULL) {
10009
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
260 module->deinit = NULL;
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
261 module_free(module);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
262 return -1;
10009
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
263 }
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
264
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
265 if (set->debug)
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
266 i_debug("Module loaded: %s", path);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
267 *module_r = module;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
268 return 1;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 9448
diff changeset
271 static int module_name_cmp(const char *const *n1, const char *const *n2)
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
272 {
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
273 const char *s1 = *n1, *s2 = *n2;
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
274
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
275 if (strncmp(s1, "lib", 3) == 0)
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
276 s1 += 3;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
277 if (strncmp(s2, "lib", 3) == 0)
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
278 s2 += 3;
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
279
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
280 return strcmp(s1, s2);
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
281 }
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
282
13569
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
283 static bool module_want_load(const struct module_dir_load_settings *set,
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
284 const char **names, const char *name)
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
285 {
13569
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
286 if (set->filter_callback != NULL) {
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
287 if (!set->filter_callback(name, set->filter_context))
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
288 return FALSE;
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
289 }
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
290 if (names == NULL)
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
291 return TRUE;
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
292
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
293 for (; *names != NULL; names++) {
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
294 if (strcmp(*names, name) == 0) {
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
295 *names = "";
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
296 return TRUE;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
297 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
298 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
299 return FALSE;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
300 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
301
4945
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
302 static void check_duplicates(ARRAY_TYPE(const_string) *names,
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
303 const char *name, const char *dir)
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
304 {
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
305 const char *const *names_p, *base_name, *tmp;
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
306 unsigned int i, count;
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
307
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
308 base_name = module_file_get_name(name);
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
309 names_p = array_get(names, &count);
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
310 for (i = 0; i < count; i++) {
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
311 tmp = module_file_get_name(names_p[i]);
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
312
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
313 if (strcmp(tmp, base_name) == 0)
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
314 i_fatal("Multiple files for module %s: %s/%s, %s/%s",
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
315 base_name, dir, name, dir, names_p[i]);
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
316 }
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
317 }
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
318
15415
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
319 struct module *module_dir_find(struct module *modules, const char *name)
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
320 {
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
321 struct module *module;
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21116
diff changeset
322 size_t len = strlen(name);
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
323
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
324 for (module = modules; module != NULL; module = module->next) {
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
325 if (strncmp(module->name, name, len) == 0) {
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
326 if (module->name[len] == '\0' ||
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
327 strcmp(module->name + len, "_plugin") == 0)
15415
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
328 return module;
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
329 }
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
330 }
15415
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
331 return NULL;
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
332 }
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
333
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
334 static bool module_is_loaded(struct module *modules, const char *name)
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
335 {
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
336 return module_dir_find(modules, name) != NULL;
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
337 }
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
338
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
339 static void module_names_fix(const char **module_names)
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
340 {
11715
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
341 unsigned int i, j;
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
342
11725
bc35bf7f7502 module_dir_load(): Don't crash with "" plugin list.
Timo Sirainen <tss@iki.fi>
parents: 11715
diff changeset
343 if (module_names[0] == NULL)
bc35bf7f7502 module_dir_load(): Don't crash with "" plugin list.
Timo Sirainen <tss@iki.fi>
parents: 11715
diff changeset
344 return;
bc35bf7f7502 module_dir_load(): Don't crash with "" plugin list.
Timo Sirainen <tss@iki.fi>
parents: 11715
diff changeset
345
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
346 /* allow giving the module names also in non-base form.
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
347 convert them in here. */
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
348 for (i = 0; module_names[i] != NULL; i++)
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
349 module_names[i] = module_file_get_name(module_names[i]);
11715
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
350
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
351 /* @UNSAFE: drop duplicates */
14921
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
352 i_qsort(module_names, i, sizeof(*module_names), i_strcmp_p);
11715
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
353 for (i = j = 1; module_names[i] != NULL; i++) {
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
354 if (strcmp(module_names[i-1], module_names[i]) != 0)
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
355 module_names[j++] = module_names[i];
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
356 }
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
357 module_names[j] = NULL;
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
358 }
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
359
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
360 static bool
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
361 module_dir_is_all_loaded(struct module *old_modules, const char **module_names)
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
362 {
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
363 unsigned int i;
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
364
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
365 for (i = 0; module_names[i] != NULL; i++) {
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
366 if (!module_is_loaded(old_modules, module_names[i]))
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
367 return FALSE;
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
368 }
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
369 return TRUE;
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
370 }
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
371
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
372 static int
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
373 module_dir_load_real(struct module **_modules,
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
374 const char *dir, const char **module_names,
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
375 const struct module_dir_load_settings *set,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
376 char **error_r)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 {
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 DIR *dirp;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 struct dirent *d;
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
380 const char *name, *p, *error, *const *names_p;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
381 struct module *modules, *module, **module_pos, *old_modules = *_modules;
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
382 unsigned int i, count;
4945
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
383 ARRAY_TYPE(const_string) names;
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
384 pool_t pool;
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
385 int ret;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
386
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
387 *error_r = NULL;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
389 if (module_names != NULL) {
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
390 if (module_dir_is_all_loaded(old_modules, module_names))
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
391 return 0;
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
392 }
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
393
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
394 if (set->debug)
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
395 i_debug("Loading modules from directory: %s", dir);
3531
c506ec006de5 If DEBUG environment is set, module_load_dir() now prints some debugging
Timo Sirainen <tss@iki.fi>
parents: 2338
diff changeset
396
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 dirp = opendir(dir);
4952
67561e996a00 If the module dir doesn't exist, die only if we were given a list of modules
Timo Sirainen <tss@iki.fi>
parents: 4945
diff changeset
398 if (dirp == NULL) {
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
399 *error_r = i_strdup_printf("opendir(%s) failed: %m", dir);
4952
67561e996a00 If the module dir doesn't exist, die only if we were given a list of modules
Timo Sirainen <tss@iki.fi>
parents: 4945
diff changeset
400 if (module_names != NULL) {
67561e996a00 If the module dir doesn't exist, die only if we were given a list of modules
Timo Sirainen <tss@iki.fi>
parents: 4945
diff changeset
401 /* we were given a list of modules to load.
67561e996a00 If the module dir doesn't exist, die only if we were given a list of modules
Timo Sirainen <tss@iki.fi>
parents: 4945
diff changeset
402 we can't fail. */
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
403 return -1;
4952
67561e996a00 If the module dir doesn't exist, die only if we were given a list of modules
Timo Sirainen <tss@iki.fi>
parents: 4945
diff changeset
404 }
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
405 return errno == ENOENT ? 0 : -1;
4952
67561e996a00 If the module dir doesn't exist, die only if we were given a list of modules
Timo Sirainen <tss@iki.fi>
parents: 4945
diff changeset
406 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407
9448
1348d374e574 Increased some memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 9024
diff changeset
408 pool = pool_alloconly_create("module loader", 4096);
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
409 p_array_init(&names, pool, 32);
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
410
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 modules = NULL;
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
412 for (errno = 0; (d = readdir(dirp)) != NULL; errno = 0) {
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 name = d->d_name;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 if (name[0] == '.')
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 continue;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417
7826
b63aa0ffe564 Use dynamic module suffix provided by libtool rather than hardcoded ".so".
Timo Sirainen <tss@iki.fi>
parents: 7561
diff changeset
418 p = strstr(name, MODULE_SUFFIX);
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 if (p == NULL || strlen(p) != 3)
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 continue;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
422 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
423 check_duplicates(&names, name, dir);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
424 } T_END;
4945
cc9832968e8e Give an error if there are duplicate files for a single module. Also if the
Timo Sirainen <tss@iki.fi>
parents: 4747
diff changeset
425
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
426 name = p_strdup(pool, d->d_name);
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
427 array_append(&names, &name, 1);
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
428 }
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
429 if (errno != 0)
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
430 *error_r = i_strdup_printf("readdir(%s) failed: %m", dir);
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
431 if (closedir(dirp) < 0 && *error_r == NULL)
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
432 *error_r = i_strdup_printf("closedir(%s) failed: %m", dir);
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
433 if (*error_r != NULL) {
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
434 pool_unref(&pool);
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
435 return -1;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
436 }
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
437
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 9448
diff changeset
438 array_sort(&names, module_name_cmp);
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 9448
diff changeset
439 names_p = array_get(&names, &count);
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
440
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
441 modules = old_modules;
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
442 module_pos = &modules;
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
443 while (*module_pos != NULL)
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
444 module_pos = &(*module_pos)->next;
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
445 for (i = 0; i < count; i++) T_BEGIN {
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
446 const char *path, *stripped_name, *suffixless_name;
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
447
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
448 name = names_p[i];
4167
32dd28f96dce Allow giving module names in non-basename form.
Timo Sirainen <tss@iki.fi>
parents: 4074
diff changeset
449 stripped_name = module_file_get_name(name);
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
450 suffixless_name = module_name_drop_suffix(stripped_name);
13569
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
451 if (!module_want_load(set, module_names, suffixless_name) ||
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
452 module_is_loaded(old_modules, suffixless_name))
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
453 module = NULL;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
454 else {
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
455 path = t_strconcat(dir, "/", name, NULL);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
456 ret = module_load(path, stripped_name, set, modules, &module, &error);
18315
4d19d56e09fb lib: And another module_dir_load() bugfix..
Timo Sirainen <tss@iki.fi>
parents: 18314
diff changeset
457 if (ret >= 0)
18313
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
458 ;
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
459 else if (module_names != NULL) {
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
460 *error_r = i_strdup_printf("Couldn't load required plugin %s: %s",
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
461 path, error);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
462 i = count;
18313
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
463 } else {
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
464 i_error("Couldn't load plugin %s: %s", path, error);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
465 }
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
466 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 if (module != NULL) {
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
469 *module_pos = module;
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
470 module_pos = &module->next;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 }
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
472 } T_END;
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
473 pool_unref(&pool);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
474
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
475 if (module_names != NULL && *error_r == NULL && !set->ignore_missing) {
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
476 /* make sure all modules were found */
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
477 for (; *module_names != NULL; module_names++) {
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
478 if (**module_names != '\0') {
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
479 *error_r = i_strdup_printf("Plugin '%s' not found from directory %s",
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
480 *module_names, dir);
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
481 break;
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
482 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
483 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
484 }
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
485 *_modules = modules;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
486 return *error_r != NULL ? -1 : 0;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
489 int module_dir_try_load_missing(struct module **modules,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
490 const char *dir, const char *module_names,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
491 const struct module_dir_load_settings *set,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
492 const char **error_r)
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
493 {
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
494 char *error = NULL;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
495 int ret;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
496
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
497 T_BEGIN {
11134
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
498 const char **arr = NULL;
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
499
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
500 if (module_names != NULL) {
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
501 arr = t_strsplit_spaces(module_names, ", ");
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
502 module_names_fix(arr);
88959ce9c8e4 module_dir_load_missing(): If all modules are already loaded, don't scan plugin directory.
Timo Sirainen <tss@iki.fi>
parents: 10858
diff changeset
503 }
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
504
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
505 ret = module_dir_load_real(modules, dir, arr, set, &error);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
506 } T_END;
18225
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
507 *error_r = t_strdup(error);
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
508 i_free(error);
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
509 return ret;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
510 }
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
511
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
512 struct module *
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
513 module_dir_load_missing(struct module *old_modules,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
514 const char *dir, const char *module_names,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
515 const struct module_dir_load_settings *set)
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
516 {
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
517 struct module *new_modules = old_modules;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
518 const char *error;
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
519
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
520 if (module_dir_try_load_missing(&new_modules, dir, module_names,
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
521 set, &error) < 0) {
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
522 if (module_names != NULL)
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
523 i_fatal("%s", error);
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
524 else
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
525 i_error("%s", error);
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
526 }
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
527 return new_modules;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
528 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
529
5148
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
530 void module_dir_init(struct module *modules)
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
531 {
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
532 struct module *module;
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
533
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
534 for (module = modules; module != NULL; module = module->next) {
16899
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
535 if (!module->initialized) {
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
536 module->initialized = TRUE;
16899
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
537 if (module->init != NULL) T_BEGIN {
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
538 module->init(module);
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
539 } T_END;
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
540 }
5148
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
541 }
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
542 }
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
543
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
544 void module_dir_deinit(struct module *modules)
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
545 {
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
546 struct module *module, **rev;
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
547 unsigned int i, count = 0;
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
548
15388
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
549 for (module = modules; module != NULL; module = module->next) {
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
550 if (module->deinit != NULL && module->initialized)
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
551 count++;
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
552 }
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
553
5159
627a085dac39 Don't crash at deinit if no modules are loaded.
Timo Sirainen <tss@iki.fi>
parents: 5156
diff changeset
554 if (count == 0)
627a085dac39 Don't crash at deinit if no modules are loaded.
Timo Sirainen <tss@iki.fi>
parents: 5156
diff changeset
555 return;
627a085dac39 Don't crash at deinit if no modules are loaded.
Timo Sirainen <tss@iki.fi>
parents: 5156
diff changeset
556
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
557 /* @UNSAFE: deinitialize in reverse order */
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
558 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
559 rev = t_new(struct module *, count);
15388
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
560 for (i = 0, module = modules; i < count; ) {
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
561 if (module->deinit != NULL && module->initialized) {
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
562 rev[count-i-1] = module;
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
563 i++;
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
564 }
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
565 module = module->next;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
566 }
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
567
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
568 for (i = 0; i < count; i++) {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
569 module = rev[i];
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
570
15388
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
571 module->deinit();
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
572 module->initialized = FALSE;
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
573 }
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
574 } T_END;
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
575 }
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
576
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
577 void module_dir_unload(struct module **modules)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
579 struct module *module, *next;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580
4747
e46eb913bcee Call deinit() for all modules first before unloading them.
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
581 /* Call all modules' deinit() first, so that they may still call each
e46eb913bcee Call deinit() for all modules first before unloading them.
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
582 others' functions. */
e46eb913bcee Call deinit() for all modules first before unloading them.
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
583 module_dir_deinit(*modules);
e46eb913bcee Call deinit() for all modules first before unloading them.
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
584
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
585 for (module = *modules; module != NULL; module = next) {
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
586 next = module->next;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
587 module_free(module);
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 }
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
589
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
590 *modules = NULL;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 #else
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594
18380
1bbde199a6e3 lib: Fixed potential build error when building without modules.
Timo Sirainen <tss@iki.fi>
parents: 18315
diff changeset
595 #ifndef MODULE_SUFFIX
1bbde199a6e3 lib: Fixed potential build error when building without modules.
Timo Sirainen <tss@iki.fi>
parents: 18315
diff changeset
596 # define MODULE_SUFFIX ".so" /* just to avoid build failure */
1bbde199a6e3 lib: Fixed potential build error when building without modules.
Timo Sirainen <tss@iki.fi>
parents: 18315
diff changeset
597 #endif
1bbde199a6e3 lib: Fixed potential build error when building without modules.
Timo Sirainen <tss@iki.fi>
parents: 18315
diff changeset
598
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
599 struct module *
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
600 module_dir_load_missing(struct module *old_modules ATTR_UNUSED,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
601 const char *dir ATTR_UNUSED,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
602 const char *module_names,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
603 const struct module_dir_load_settings *set ATTR_UNUSED)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604 {
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
605 #define NO_SUPPORT_ERRSTR "Dynamically loadable module support not built in"
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
606 if (module_names == NULL)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
607 i_error(NO_SUPPORT_ERRSTR);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
608 else {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
609 i_fatal(NO_SUPPORT_ERRSTR", can't load plugins: %s",
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
610 module_names);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
611 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 return NULL;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
615 void module_dir_init(struct module *modules ATTR_UNUSED)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
616 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
617 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
618
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6363
diff changeset
619 void module_dir_deinit(struct module *modules ATTR_UNUSED)
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
620 {
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
621 }
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
622
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6363
diff changeset
623 void module_dir_unload(struct module **modules ATTR_UNUSED)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 {
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
625 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626
17944
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
627 struct module *module_dir_find(struct module *modules ATTR_UNUSED,
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
628 const char *name ATTR_UNUSED)
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
629 {
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
630 return NULL;
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
631 }
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
632
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
633 void *module_get_symbol(struct module *module ATTR_UNUSED,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
634 const char *symbol ATTR_UNUSED)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
635 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
636 return NULL;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
637 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
638
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
639 void *module_get_symbol_quiet(struct module *module ATTR_UNUSED,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
640 const char *symbol ATTR_UNUSED)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
641 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
642 return NULL;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
643 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
644
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 #endif
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
646
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
647 struct module *module_dir_load(const char *dir, const char *module_names,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
648 const struct module_dir_load_settings *set)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
649 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
650 return module_dir_load_missing(NULL, dir, module_names, set);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
651 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
652
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
653 const char *module_file_get_name(const char *fname)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
654 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
655 const char *p;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
656
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
657 /* [lib][nn_]name(.so) */
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
658 if (strncmp(fname, "lib", 3) == 0)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
659 fname += 3;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
660
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
661 for (p = fname; *p != '\0'; p++) {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
662 if (*p < '0' || *p > '9')
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
663 break;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
664 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
665 if (*p == '_')
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
666 fname = p + 1;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
667
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
668 p = strstr(fname, MODULE_SUFFIX);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
669 if (p == NULL)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
670 return fname;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
671
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
672 return t_strdup_until(fname, p);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
673 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
674
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
675 static const char *module_name_drop_suffix(const char *name)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
676 {
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21116
diff changeset
677 size_t len;
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
678
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
679 len = strlen(name);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
680 if (len > 7 && strcmp(name + len - 7, "_plugin") == 0)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
681 name = t_strndup(name, len - 7);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
682 return name;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
683 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
684
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
685 const char *module_get_plugin_name(struct module *module)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
686 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
687 return module_name_drop_suffix(module->name);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
688 }