annotate src/lib/module-dir.c @ 23007:36e01285b5b8

lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 18 Mar 2019 00:52:37 +0100
parents 6d6ae8f334f3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2003-2018 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;
22945
6d6ae8f334f3 lib: Call module's preinit function, when loading
Sergey Kitov <sergey.kitov@open-xchange.com>
parents: 22713
diff changeset
190 void (*preinit)(void);
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
191
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 *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
193 *error_r = NULL;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
195 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
196 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
197 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
198 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
199 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
200 "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
201 "(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
202 "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
203 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
204 }
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
205 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
206 }
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
207 } else {
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
208 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
209 if (handle == NULL) {
18314
d978da323d44 lib: Small error logging improvements for module_dir_load()
Timo Sirainen <tss@iki.fi>
parents: 18313
diff changeset
210 *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
211 dlerror());
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
212 #ifdef RTLD_LAZY
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
213 /* 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
214 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
215 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
216 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
217 return -1;
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
218 #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
219 return -1;
11748
10ff5c7e7f40 module_dir_load(): Added support for checking binary name dependency.
Timo Sirainen <tss@iki.fi>
parents: 11725
diff changeset
220 #endif
11708
d52e9033c3bf openbsd: Hide errors written by dlopen() if we wanted to ignore them.
Timo Sirainen <tss@iki.fi>
parents: 11134
diff changeset
221 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223
2084
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
224 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
225 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
226 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
227 module->handle = handle;
9ba79ebae6ab Added support for password scheme plugins. auth module dir defaults under
Timo Sirainen <tss@iki.fi>
parents: 1564
diff changeset
228
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
229 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
230 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
231 if (module_version != NULL &&
15199
73916b7be94e Plugin ABI version checking improvements.
Timo Sirainen <tss@iki.fi>
parents: 14921
diff changeset
232 !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
233 *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
234 "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
235 *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
236 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
237 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
238 }
47e393c4eb4b If module contains a <module_name>_version string, fail if it doesn't match
Timo Sirainen <tss@iki.fi>
parents: 5159
diff changeset
239
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 /* 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
241 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
242 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
243 !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
244 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
245 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
246 !set->require_init_funcs);
22945
6d6ae8f334f3 lib: Call module's preinit function, when loading
Sergey Kitov <sergey.kitov@open-xchange.com>
parents: 22713
diff changeset
247 preinit = (void (*)(void))
6d6ae8f334f3 lib: Call module's preinit function, when loading
Sergey Kitov <sergey.kitov@open-xchange.com>
parents: 22713
diff changeset
248 get_symbol(module, t_strconcat(name, "_preinit", NULL),
6d6ae8f334f3 lib: Call module's preinit function, when loading
Sergey Kitov <sergey.kitov@open-xchange.com>
parents: 22713
diff changeset
249 TRUE);
6d6ae8f334f3 lib: Call module's preinit function, when loading
Sergey Kitov <sergey.kitov@open-xchange.com>
parents: 22713
diff changeset
250 if (preinit != NULL)
6d6ae8f334f3 lib: Call module's preinit function, when loading
Sergey Kitov <sergey.kitov@open-xchange.com>
parents: 22713
diff changeset
251 preinit();
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252
5148
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
253 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
254 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
255 *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
256 "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
257 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
258 } 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
259 /* 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
260 } 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
261 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
262 /* 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
263 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264
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
265 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
266 module->deinit = NULL;
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
267 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
268 return -1;
10009
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
269 }
bdd87f9ccccf module_dir_load(): Support <name>_dependencies array listing required modules.
Timo Sirainen <tss@iki.fi>
parents: 9491
diff changeset
270
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
271 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
272 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
273 *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
274 return 1;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 9448
diff changeset
277 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
278 {
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
279 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
280
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
281 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
282 s1 += 3;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
283 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
284 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
285
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
286 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
287 }
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
288
13569
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
289 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
290 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
291 {
13569
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
292 if (set->filter_callback != NULL) {
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
293 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
294 return FALSE;
976e414d5bf4 module_dir_load*(): Support filtering and ignoring missing modules.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
295 }
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
296 if (names == NULL)
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
297 return TRUE;
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
298
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
299 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
300 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
301 *names = "";
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
302 return TRUE;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
303 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
304 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
305 return FALSE;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
306 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
307
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
308 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
309 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
310 {
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 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
312 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
313
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 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
315 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
316 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
317 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
318
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
319 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
320 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
321 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
322 }
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
323 }
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
324
15415
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
325 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
326 {
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
327 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
328 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
329
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
330 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
331 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
332 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
333 strcmp(module->name + len, "_plugin") == 0)
15415
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
334 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
335 }
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
336 }
15415
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
337 return NULL;
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
338 }
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
339
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
340 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
341 {
8f0994194f45 liblib: Added module_dir_find()
Timo Sirainen <tss@iki.fi>
parents: 15390
diff changeset
342 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
343 }
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
344
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
345 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
346 {
11715
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
347 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
348
11725
bc35bf7f7502 module_dir_load(): Don't crash with "" plugin list.
Timo Sirainen <tss@iki.fi>
parents: 11715
diff changeset
349 if (module_names[0] == NULL)
bc35bf7f7502 module_dir_load(): Don't crash with "" plugin list.
Timo Sirainen <tss@iki.fi>
parents: 11715
diff changeset
350 return;
bc35bf7f7502 module_dir_load(): Don't crash with "" plugin list.
Timo Sirainen <tss@iki.fi>
parents: 11715
diff changeset
351
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
352 /* 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
353 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
354 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
355 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
356
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
357 /* @UNSAFE: drop duplicates */
14921
d3db2ba15d00 Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
358 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
359 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
360 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
361 module_names[j++] = module_names[i];
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
362 }
e586c030e430 module_dir_load(): Ignore duplicates in module names.
Timo Sirainen <tss@iki.fi>
parents: 11708
diff changeset
363 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
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
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 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
367 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
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 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
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 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
372 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
373 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
374 }
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
375 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
376 }
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
377
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
378 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
379 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
380 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
381 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
382 char **error_r)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 {
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 DIR *dirp;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 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
386 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
387 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
388 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
389 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
390 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
391 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
392
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
393 *error_r = NULL;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394
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
395 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
396 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
397 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
398 }
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
399
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10416
diff changeset
400 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
401 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
402
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 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
404 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
405 *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
406 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
407 /* 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
408 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
409 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
410 }
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
411 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
412 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413
9448
1348d374e574 Increased some memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 9024
diff changeset
414 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
415 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
416
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 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
418 for (errno = 0; (d = readdir(dirp)) != NULL; errno = 0) {
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 name = d->d_name;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 if (name[0] == '.')
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 continue;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423
7826
b63aa0ffe564 Use dynamic module suffix provided by libtool rather than hardcoded ".so".
Timo Sirainen <tss@iki.fi>
parents: 7561
diff changeset
424 p = strstr(name, MODULE_SUFFIX);
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 if (p == NULL || strlen(p) != 3)
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 continue;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
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
428 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
429 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
430 } 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
431
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
432 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
433 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
434 }
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
435 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
436 *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
437 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
438 *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
439 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
440 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
441 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
442 }
3753
d531130a0e4d Load plugins in sorted order. Prefixed plugins with nn_ set their order.
Timo Sirainen <tss@iki.fi>
parents: 3746
diff changeset
443
9491
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 9448
diff changeset
444 array_sort(&names, module_name_cmp);
0059b2381024 Use array_sort() instead of qsort() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 9448
diff changeset
445 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
446
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
447 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
448 module_pos = &modules;
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
449 while (*module_pos != NULL)
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
450 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
451 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
452 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
453
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
454 name = names_p[i];
4167
32dd28f96dce Allow giving module names in non-basename form.
Timo Sirainen <tss@iki.fi>
parents: 4074
diff changeset
455 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
456 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
457 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
458 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
459 module = NULL;
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
460 else {
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
461 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
462 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
463 if (ret >= 0)
18313
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
464 ;
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
465 else if (module_names != NULL) {
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
466 *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
467 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
468 i = count;
18313
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
469 } else {
8cb9f50f5b40 lib: Recent module_dir_load() changes broke error logging.
Timo Sirainen <tss@iki.fi>
parents: 18227
diff changeset
470 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
471 }
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
472 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 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
475 *module_pos = module;
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
476 module_pos = &module->next;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 }
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
478 } 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
479 pool_unref(&pool);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
480
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 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
482 /* 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
483 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
484 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
485 *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
486 *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
487 break;
4074
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
488 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
489 }
dadc6e2cccb8 Replaced mail_use_modules and mail_modules settings with mail_plugins and
Timo Sirainen <tss@iki.fi>
parents: 4043
diff changeset
490 }
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
491 *_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
492 return *error_r != NULL ? -1 : 0;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494
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
495 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
496 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
497 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
498 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
499 {
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
500 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
501 int ret;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
502
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
503 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
504 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
505
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
506 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
507 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
508 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
509 }
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
510
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
511 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
512 } 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
513 *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
514 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
515 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
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
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 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
519 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
520 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
521 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
522 {
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 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
524 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
525
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 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
527 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
528 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
529 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
530 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
531 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
532 }
88b09d5912c0 lib: Added module_dir_try_load_missing() that returns error instead of logging it.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
533 return new_modules;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
534 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
535
5148
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
536 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
537 {
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
538 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
539
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
540 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
541 if (!module->initialized) {
10416
f0a6461b86ee Added module_dir_load_missing() and module_get_plugin_name().
Timo Sirainen <tss@iki.fi>
parents: 10412
diff changeset
542 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
543 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
544 module->init(module);
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
545 } T_END;
70f1d2bb0bd9 module-dir: Allow plugins to have deinit() function without init() function
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
546 }
5148
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
547 }
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
548 }
7f2c39d7a2cc module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents: 4952
diff changeset
549
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
550 void module_dir_deinit(struct module *modules)
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
551 {
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
552 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
553 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
554
15388
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
555 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
556 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
557 count++;
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
558 }
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
559
5159
627a085dac39 Don't crash at deinit if no modules are loaded.
Timo Sirainen <tss@iki.fi>
parents: 5156
diff changeset
560 if (count == 0)
627a085dac39 Don't crash at deinit if no modules are loaded.
Timo Sirainen <tss@iki.fi>
parents: 5156
diff changeset
561 return;
627a085dac39 Don't crash at deinit if no modules are loaded.
Timo Sirainen <tss@iki.fi>
parents: 5156
diff changeset
562
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
563 /* @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
564 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
565 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
566 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
567 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
568 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
569 i++;
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
570 }
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
571 module = module->next;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
572 }
5156
644342a79f15 module_dir_init() was calling the init() functions in reverse order.
Timo Sirainen <tss@iki.fi>
parents: 5148
diff changeset
573
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
574 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
575 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
576
15388
6fc2502d6021 module_dir_deinit(): If no modules were actually initialized, avoid doing memory allocation.
Timo Sirainen <tss@iki.fi>
parents: 15199
diff changeset
577 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
578 module->initialized = FALSE;
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
579 }
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
580 } T_END;
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
581 }
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
582
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
583 void module_dir_unload(struct module **modules)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
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 struct module *module, *next;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586
4747
e46eb913bcee Call deinit() for all modules first before unloading them.
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
587 /* 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
588 others' functions. */
e46eb913bcee Call deinit() for all modules first before unloading them.
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
589 module_dir_deinit(*modules);
e46eb913bcee Call deinit() for all modules first before unloading them.
Timo Sirainen <tss@iki.fi>
parents: 4602
diff changeset
590
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
591 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
592 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
593 module_free(module);
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 }
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
595
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
596 *modules = NULL;
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 #else
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600
18380
1bbde199a6e3 lib: Fixed potential build error when building without modules.
Timo Sirainen <tss@iki.fi>
parents: 18315
diff changeset
601 #ifndef MODULE_SUFFIX
1bbde199a6e3 lib: Fixed potential build error when building without modules.
Timo Sirainen <tss@iki.fi>
parents: 18315
diff changeset
602 # 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
603 #endif
1bbde199a6e3 lib: Fixed potential build error when building without modules.
Timo Sirainen <tss@iki.fi>
parents: 18315
diff changeset
604
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
605 struct module *
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
606 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
607 const char *dir ATTR_UNUSED,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
608 const char *module_names,
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
609 const struct module_dir_load_settings *set ATTR_UNUSED)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610 {
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
611 #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
612 if (module_names == NULL)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
613 i_error(NO_SUPPORT_ERRSTR);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
614 else {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
615 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
616 module_names);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
617 }
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 return NULL;
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
621 void module_dir_init(struct module *modules ATTR_UNUSED)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
622 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
623 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
624
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6363
diff changeset
625 void module_dir_deinit(struct module *modules ATTR_UNUSED)
3988
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
626 {
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
627 }
ab1a0a377851 Added module_dir_deinit().
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
628
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6363
diff changeset
629 void module_dir_unload(struct module **modules ATTR_UNUSED)
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
630 {
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 }
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632
17944
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
633 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
634 const char *name ATTR_UNUSED)
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
635 {
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
636 return NULL;
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
637 }
ca6f330781e6 Compile fix for systems without dlopen()
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
638
10423
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
639 void *module_get_symbol(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
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
645 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
646 const char *symbol ATTR_UNUSED)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
647 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
648 return NULL;
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
1466
5ecbc9f82019 missing
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 #endif
10423
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 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
654 const struct module_dir_load_settings *set)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
655 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
656 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
657 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
658
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
659 const char *module_file_get_name(const char *fname)
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 const char *p;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
662
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
663 /* [lib][nn_]name(.so) */
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
664 if (strncmp(fname, "lib", 3) == 0)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
665 fname += 3;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
666
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
667 for (p = fname; *p != '\0'; p++) {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
668 if (*p < '0' || *p > '9')
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
669 break;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
670 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
671 if (*p == '_')
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
672 fname = p + 1;
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 p = strstr(fname, MODULE_SUFFIX);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
675 if (p == NULL)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
676 return fname;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
677
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
678 return t_strdup_until(fname, p);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
679 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
680
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
681 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
682 {
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21116
diff changeset
683 size_t len;
10423
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 len = strlen(name);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
686 if (len > 7 && strcmp(name + len - 7, "_plugin") == 0)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
687 name = t_strndup(name, len - 7);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
688 return name;
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
689 }
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
690
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
691 const char *module_get_plugin_name(struct module *module)
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
692 {
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
693 return module_name_drop_suffix(module->name);
7bfb37044928 Fixed compiling without module support.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
694 }