From: Stephan Bosch Date: Wed, 6 Mar 2024 00:57:26 +0000 (+0100) Subject: lib-settings: settings - Add settings_root_override_remove() X-Git-Tag: 2.4.0~262 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=61ade0016e95462986b39814d522306d2b77ea9c;p=thirdparty%2Fdovecot%2Fcore.git lib-settings: settings - Add settings_root_override_remove() --- diff --git a/src/lib-settings/settings.c b/src/lib-settings/settings.c index db92f213fe..3b61bfcdf5 100644 --- a/src/lib-settings/settings.c +++ b/src/lib-settings/settings.c @@ -2507,6 +2507,50 @@ void settings_root_override(struct settings_root *root, settings_override_fill(set, root->pool, key, value, type); } +static bool +settings_override_equals(struct settings_override *set, const char *key, + enum settings_override_type type) +{ + size_t key_len = strlen(key); + bool key_append = (key_len > 0 && key[key_len-1] == '+'); + + if (set->type != type) + return FALSE; + if (set->append != key_append) + return FALSE; + + if (key_append) { + size_t set_len = strlen(set->key); + + if (set_len != key_len - 1) + return FALSE; + return (strncmp(key, set->key, key_len - 1) == 0); + } + return (strcmp(key, set->key) == 0); +} + +bool settings_root_override_remove(struct settings_root *root, + const char *key, + enum settings_override_type type) +{ + if (!array_is_created(&root->overrides)) + return FALSE; + + struct settings_override *set; + + array_foreach_modifiable(&root->overrides, set) { + if (!settings_override_equals(set, key, type)) + continue; + + settings_override_free(set); + array_delete(&root->overrides, + array_foreach_idx(&root->overrides, set), 1); + return TRUE; + } + + return FALSE; +} + static struct settings_instance * settings_instance_alloc(void) { diff --git a/src/lib-settings/settings.h b/src/lib-settings/settings.h index 8d27ed6a1f..bffae3c4fe 100644 --- a/src/lib-settings/settings.h +++ b/src/lib-settings/settings.h @@ -263,6 +263,11 @@ void settings_root_override(struct settings_root *root, const char *key, const char *value, enum settings_override_type type); +/* Remove a setting root override by key and type. */ +bool ATTR_NOWARN_UNUSED_RESULT +settings_root_override_remove(struct settings_root *root, const char *key, + enum settings_override_type type); + /* Return a new instance for settings. */ struct settings_instance * settings_instance_new(struct settings_root *root);