dovecot-2.2-pigeonhole: lib-sieve: Implemented means to override...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Sat Nov 7 11:43:07 UTC 2015
details: http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/62fb7272c675
changeset: 2127:62fb7272c675
user: Stephan Bosch <stephan at rename-it.nl>
date: Mon Nov 02 18:56:39 2015 +0100
description:
lib-sieve: Implemented means to override existing (standard) extensions.
diffstat:
src/lib-sieve/sieve-extensions.c | 101 ++++++++++++++++++++++++++++----------
src/lib-sieve/sieve-extensions.h | 5 +
2 files changed, 79 insertions(+), 27 deletions(-)
diffs (170 lines):
diff -r 8442c6d04ce8 -r 62fb7272c675 src/lib-sieve/sieve-extensions.c
--- a/src/lib-sieve/sieve-extensions.c Mon Nov 02 18:56:39 2015 +0100
+++ b/src/lib-sieve/sieve-extensions.c Mon Nov 02 18:56:39 2015 +0100
@@ -361,34 +361,64 @@
return FALSE;
}
+static struct sieve_extension *sieve_extension_lookup
+(struct sieve_instance *svinst, const char *name)
+{
+ struct sieve_extension_registry *ext_reg = svinst->ext_reg;
+
+ return hash_table_lookup(ext_reg->extension_index, name);
+}
+
+static void sieve_extension_insert
+(struct sieve_instance *svinst, const char *name,
+ struct sieve_extension *ext)
+{
+ struct sieve_extension_registry *ext_reg = svinst->ext_reg;
+
+ hash_table_insert(ext_reg->extension_index, name, ext);
+}
+
+static struct sieve_extension *sieve_extension_alloc
+(struct sieve_instance *svinst,
+ const struct sieve_extension_def *extdef)
+{
+ struct sieve_extension_registry *ext_reg = svinst->ext_reg;
+ struct sieve_extension *ext, **extr;
+ int ext_id;
+
+ ext_id = (int)array_count(&ext_reg->extensions);
+
+ /* Add extension to the registry */
+ extr = array_append_space(&ext_reg->extensions);
+ *extr = ext = p_new(svinst->pool, struct sieve_extension, 1);
+ ext->id = ext_id;
+ ext->def = extdef;
+ ext->svinst = svinst;
+ return ext;
+}
+
static struct sieve_extension *_sieve_extension_register
(struct sieve_instance *svinst, const struct sieve_extension_def *extdef,
bool load, bool required)
{
- struct sieve_extension_registry *ext_reg = svinst->ext_reg;
- struct sieve_extension *ext =
- hash_table_lookup(ext_reg->extension_index, extdef->name);
+ struct sieve_extension *ext;
+
+ ext = sieve_extension_lookup(svinst, extdef->name);
/* Register extension if it is not registered already */
if ( ext == NULL ) {
- struct sieve_extension **extr;
+ ext = sieve_extension_alloc(svinst, extdef);
+ sieve_extension_insert(svinst, extdef->name, ext);
- int ext_id = (int)array_count(&ext_reg->extensions);
+ } else if ( ext->overridden ) {
+ /* Create a dummy */
+ ext = sieve_extension_alloc(svinst, extdef);
- /* Add extension to the registry */
-
- extr = array_append_space(&ext_reg->extensions);
- *extr = ext = p_new(svinst->pool, struct sieve_extension, 1);
- ext->id = ext_id;
- ext->def = extdef;
- ext->svinst = svinst;
-
- hash_table_insert(ext_reg->extension_index, extdef->name, ext);
-
- /* Re-register it if it were previously unregistered
- * (not going to happen)
- */
- } else if ( ext->def == NULL ) {
+ } else {
+ /* Re-register it if it were previously unregistered
+ * (not going to happen)
+ */
+ i_assert( ext->def == NULL || ext->def == extdef );
ext->def = extdef;
}
@@ -426,11 +456,11 @@
if ( ext_id >= 0 && ext_id < (int) array_count(&ext_reg->extensions) ) {
mod_ext = array_idx(&ext_reg->extensions, ext_id);
- sieve_extension_capabilities_unregister(*mod_ext);
- _sieve_extension_unload(*mod_ext);
- (*mod_ext)->loaded = FALSE;
- (*mod_ext)->enabled = FALSE;
- (*mod_ext)->def = NULL;
+ sieve_extension_capabilities_unregister(*mod_ext);
+ _sieve_extension_unload(*mod_ext);
+ (*mod_ext)->loaded = FALSE;
+ (*mod_ext)->enabled = FALSE;
+ (*mod_ext)->def = NULL;
}
}
@@ -441,6 +471,25 @@
return _sieve_extension_register(svinst, extdef, load, TRUE);
}
+void sieve_extension_override
+(struct sieve_instance *svinst, const char *name,
+ const struct sieve_extension *ext)
+{
+ struct sieve_extension_registry *ext_reg = ext->svinst->ext_reg;
+ struct sieve_extension * const *mod_ext;
+ struct sieve_extension *old_ext;
+
+ i_assert( ext->id >= 0 &&
+ ext->id < (int) array_count(&ext_reg->extensions) );
+ mod_ext = array_idx(&ext_reg->extensions, ext->id);
+
+ old_ext = sieve_extension_lookup(svinst, name);
+ i_assert( old_ext == NULL || !old_ext->overridden );
+
+ sieve_extension_insert(svinst, name, *mod_ext);
+ (*mod_ext)->overridden = TRUE;
+}
+
int sieve_extensions_get_count(struct sieve_instance *svinst)
{
struct sieve_extension_registry *ext_reg = svinst->ext_reg;
@@ -467,7 +516,6 @@
const struct sieve_extension *sieve_extension_get_by_name
(struct sieve_instance *svinst, const char *name)
{
- struct sieve_extension_registry *ext_reg = svinst->ext_reg;
const struct sieve_extension *ext;
if ( *name == '@' )
@@ -476,8 +524,7 @@
if ( strlen(name) > 128 )
return NULL;
- ext = hash_table_lookup(ext_reg->extension_index, name);
-
+ ext = sieve_extension_lookup(svinst, name);
if ( ext == NULL || ext->def == NULL || (!ext->enabled && !ext->required))
return NULL;
diff -r 8442c6d04ce8 -r 62fb7272c675 src/lib-sieve/sieve-extensions.h
--- a/src/lib-sieve/sieve-extensions.h Mon Nov 02 18:56:39 2015 +0100
+++ b/src/lib-sieve/sieve-extensions.h Mon Nov 02 18:56:39 2015 +0100
@@ -95,6 +95,7 @@
unsigned int enabled:1;
unsigned int dummy:1;
unsigned int global:1;
+ unsigned int overridden:1;
};
#define sieve_extension_is(ext, definition) \
@@ -137,6 +138,10 @@
void sieve_extension_unregister(const struct sieve_extension *ext);
+void sieve_extension_override
+ (struct sieve_instance *svinst, const char *name,
+ const struct sieve_extension *ext);
+
int sieve_extensions_get_count(struct sieve_instance *svinst);
const struct sieve_extension *sieve_extension_get_by_id
More information about the dovecot-cvs
mailing list