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