]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-settings: settings - Add settings_root_override_remove()
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 6 Mar 2024 00:57:26 +0000 (01:57 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:00 +0000 (10:40 +0200)
src/lib-settings/settings.c
src/lib-settings/settings.h

index db92f213fee426eaecee15e036a216d7b1a5d533..3b61bfcdf548f1a36ea563ddb21ba6d63b2a15a7 100644 (file)
@@ -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)
 {
index 8d27ed6a1f8e6f0ad76b14e601833632ffaac53a..bffae3c4fec3eaa2ab69b36b6b020edd3da7c777 100644 (file)
@@ -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);