Skip to content
Snippets Groups Projects
Commit 6d825631 authored by Stephan Bosch's avatar Stephan Bosch Committed by Timo Sirainen
Browse files

lib-sieve: sieve-extensions - Notify caller of sieve_extensions_set_string()...

lib-sieve: sieve-extensions - Notify caller of sieve_extensions_set_string() about extension load failures
parent e29cc91e
No related branches found
No related tags found
No related merge requests found
...@@ -259,18 +259,24 @@ void sieve_extensions_load(struct sieve_instance *svinst) ...@@ -259,18 +259,24 @@ void sieve_extensions_load(struct sieve_instance *svinst)
/* Apply sieve_extensions configuration */ /* Apply sieve_extensions configuration */
if ((extensions = sieve_setting_get( if ((extensions = sieve_setting_get(
svinst, "sieve_extensions")) != NULL) svinst, "sieve_extensions")) != NULL) {
sieve_extensions_set_string(svinst, extensions, FALSE, FALSE); (void)sieve_extensions_set_string(svinst, extensions,
FALSE, FALSE);
}
/* Apply sieve_global_extensions configuration */ /* Apply sieve_global_extensions configuration */
if ((extensions = sieve_setting_get( if ((extensions = sieve_setting_get(
svinst, "sieve_global_extensions")) != NULL) svinst, "sieve_global_extensions")) != NULL) {
sieve_extensions_set_string(svinst, extensions, TRUE, FALSE); (void)sieve_extensions_set_string(svinst, extensions,
TRUE, FALSE);
}
/* Apply sieve_implicit_extensions configuration */ /* Apply sieve_implicit_extensions configuration */
if ((extensions = sieve_setting_get( if ((extensions = sieve_setting_get(
svinst, "sieve_implicit_extensions")) != NULL) svinst, "sieve_implicit_extensions")) != NULL) {
sieve_extensions_set_string(svinst, extensions, FALSE, TRUE); (void)sieve_extensions_set_string(svinst, extensions,
FALSE, TRUE);
}
} }
void sieve_extensions_deinit(struct sieve_instance *svinst) void sieve_extensions_deinit(struct sieve_instance *svinst)
...@@ -620,46 +626,58 @@ const char *sieve_extensions_get_string(struct sieve_instance *svinst) ...@@ -620,46 +626,58 @@ const char *sieve_extensions_get_string(struct sieve_instance *svinst)
return str_c(extstr); return str_c(extstr);
} }
static void static int
sieve_extension_set_enabled(struct sieve_extension *ext, bool enabled) sieve_extension_set_enabled(struct sieve_extension *ext, bool enabled)
{ {
int ret = 0;
if (enabled) { if (enabled) {
ext->enabled = TRUE; ext->enabled = TRUE;
if (!ext->loaded) if (!ext->loaded)
(void)_sieve_extension_load(ext); ret = _sieve_extension_load(ext);
ext->loaded = TRUE; ext->loaded = TRUE;
} else { } else {
ext->enabled = FALSE; ext->enabled = FALSE;
} }
return ret;
} }
static void static int
sieve_extension_set_global(struct sieve_extension *ext, bool enabled) sieve_extension_set_global(struct sieve_extension *ext, bool enabled)
{ {
int ret = 0;
if (enabled) { if (enabled) {
sieve_extension_set_enabled(ext, TRUE); ret = sieve_extension_set_enabled(ext, TRUE);
ext->global = TRUE; ext->global = TRUE;
} else { } else {
ext->global = FALSE; ext->global = FALSE;
} }
return ret;
} }
static void static int
sieve_extension_set_implicit(struct sieve_extension *ext, bool enabled) sieve_extension_set_implicit(struct sieve_extension *ext, bool enabled)
{ {
int ret = 0;
if (enabled) { if (enabled) {
sieve_extension_set_enabled(ext, TRUE); ret = sieve_extension_set_enabled(ext, TRUE);
ext->implicit = TRUE; ext->implicit = TRUE;
} else { } else {
ext->implicit = FALSE; ext->implicit = FALSE;
} }
return ret;
} }
void sieve_extensions_set_string(struct sieve_instance *svinst, int sieve_extensions_set_string(struct sieve_instance *svinst,
const char *ext_string, bool global, const char *ext_string, bool global,
bool implicit) bool implicit)
{ {
struct sieve_extension_registry *ext_reg = svinst->ext_reg; struct sieve_extension_registry *ext_reg = svinst->ext_reg;
ARRAY(const struct sieve_extension *) enabled_extensions; ARRAY(const struct sieve_extension *) enabled_extensions;
...@@ -673,16 +691,19 @@ void sieve_extensions_set_string(struct sieve_instance *svinst, ...@@ -673,16 +691,19 @@ void sieve_extensions_set_string(struct sieve_instance *svinst,
if (ext_string == NULL) { if (ext_string == NULL) {
if (global || implicit) if (global || implicit)
return; return 0;
/* Enable all */ /* Enable all */
exts = array_get_modifiable(&ext_reg->extensions, &ext_count); exts = array_get_modifiable(&ext_reg->extensions, &ext_count);
for (i = 0; i < ext_count; i++) for (i = 0; i < ext_count; i++) {
sieve_extension_set_enabled(exts[i], TRUE); if (sieve_extension_set_enabled(exts[i], TRUE) < 0)
return; return -1;
}
return 0;
} }
int ret = 0;
T_BEGIN { T_BEGIN {
t_array_init(&enabled_extensions, t_array_init(&enabled_extensions,
array_count(&ext_reg->extensions)); array_count(&ext_reg->extensions));
...@@ -775,14 +796,29 @@ void sieve_extensions_set_string(struct sieve_instance *svinst, ...@@ -775,14 +796,29 @@ void sieve_extensions_set_string(struct sieve_instance *svinst,
} }
/* Perform actual activation/deactivation */ /* Perform actual activation/deactivation */
if (global) if (global) {
sieve_extension_set_global(exts[i], enabled); if (sieve_extension_set_global(exts[i],
else if (implicit) enabled) < 0) {
sieve_extension_set_implicit(exts[i], enabled); ret = -1;
else break;
sieve_extension_set_enabled(exts[i], enabled); }
} else if (implicit) {
if (sieve_extension_set_implicit(exts[i],
enabled) < 0) {
ret = -1;
break;
}
} else {
if (sieve_extension_set_enabled(exts[i],
enabled) < 0) {
ret = -1;
break;
}
}
} }
} T_END; } T_END;
return ret;
} }
const struct sieve_extension * const struct sieve_extension *
......
...@@ -153,9 +153,9 @@ const struct sieve_extension * ...@@ -153,9 +153,9 @@ const struct sieve_extension *
sieve_extension_get_by_name(struct sieve_instance *svinst, const char *name); sieve_extension_get_by_name(struct sieve_instance *svinst, const char *name);
const char *sieve_extensions_get_string(struct sieve_instance *svinst); const char *sieve_extensions_get_string(struct sieve_instance *svinst);
void sieve_extensions_set_string(struct sieve_instance *svinst, int sieve_extensions_set_string(struct sieve_instance *svinst,
const char *ext_string, bool global, const char *ext_string, bool global,
bool implicit); bool implicit);
const struct sieve_extension * const struct sieve_extension *
sieve_get_match_type_extension(struct sieve_instance *svinst); sieve_get_match_type_extension(struct sieve_instance *svinst);
......
...@@ -181,7 +181,7 @@ int sieve_settings_reload(struct sieve_instance *svinst) ...@@ -181,7 +181,7 @@ int sieve_settings_reload(struct sieve_instance *svinst)
void sieve_set_extensions(struct sieve_instance *svinst, const char *extensions) void sieve_set_extensions(struct sieve_instance *svinst, const char *extensions)
{ {
sieve_extensions_set_string(svinst, extensions, FALSE, FALSE); (void)sieve_extensions_set_string(svinst, extensions, FALSE, FALSE);
} }
const char * const char *
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment

Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.