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