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