File: Design.Plugins.txt

package info (click to toggle)
dovecot 1%3A2.2.13-11
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 38,472 kB
  • sloc: ansic: 341,153; sh: 16,920; makefile: 5,385; cpp: 1,474; perl: 265; xml: 44; python: 34; pascal: 27
file content (62 lines) | stat: -rw-r--r-- 2,486 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Plugins
=======

Plugins in Dovecot are really simple. They basically have two functions:

 * <plugin_name>_init(module) is called when 'module_dir_init()' is called.
 * <plugin_name>_deinit() is called when 'module_dir_deinit()' or
   'module_dir_unload()' is called.

The <plugin_name> is the short version of the plugin name, based on the
filename. For example if the filename is 'lib11_imap_quota_plugin.so', the
<plugin_name> is "imap_quota" and the init function to be called is
imap_quota_plugin_init().

Versioning
----------

Since different Dovecot versions can have different APIs, your plugin should
usually also define<plugin_name>_version, like:

---%<-------------------------------------------------------------------------
const char *imap_quota_plugin_version = DOVECOT_VERSION;
---%<-------------------------------------------------------------------------

If the version string in plugin doesn't match the version of the running
binary, the plugin loading fails. The DOVECOT_VERSION is defined in Dovecot's
'config.h', which you're typically including.

Dependencies
------------

Some plugins depend on another one. In some systems (but not all) it's possible
to handle this by giving a nicer error message than "symbol xyz not found".
There are two steps for this:

First create <plugin_name>_dependencies array listing plugin names that the
plugin depends on, like:

---%<-------------------------------------------------------------------------
const char *imap_quota_plugin_dependencies[] = { "quota", NULL };
---%<-------------------------------------------------------------------------

Then you'll also have to make the plugin .so binary link to the other plugins:

---%<-------------------------------------------------------------------------
if PLUGIN_DEPS
lib11_imap_quota_plugin_la_LIBADD = \
        ../quota/lib10_quota_plugin.la
endif
---%<-------------------------------------------------------------------------

PLUGIN_DEPS is set only if plugin dependencies are actually supported.
Otherwise the build might fail or plugin loading might fail.

Once all this is done, trying to load imap_quota plugin without quota plugin
gives a nice error message:

---%<-------------------------------------------------------------------------
Error: Can't load plugin imap_quota_plugin: Plugin quota must be loaded also
---%<-------------------------------------------------------------------------

(This file was created from the wiki on 2013-11-24 04:42)