From: Timo Sirainen Date: Thu, 10 Apr 2025 14:54:12 +0000 (+0300) Subject: lib-settings: Add settings_key_exists() X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9f6e3d6dbda159e9989720fbc11a50295995a65b;p=thirdparty%2Fdovecot%2Fcore.git lib-settings: Add settings_key_exists() --- diff --git a/src/lib-settings/settings.c b/src/lib-settings/settings.c index 4bd815a0e3..31e8862779 100644 --- a/src/lib-settings/settings.c +++ b/src/lib-settings/settings.c @@ -2710,6 +2710,30 @@ settings_get_real(struct event *event, return ret; } +bool settings_key_exists(struct event *event, const char *key) +{ + struct settings_root *root = NULL; + do { + root = event_get_ptr(event, SETTINGS_EVENT_ROOT); + event = event_get_parent(event); + } while (root == NULL && event != NULL); + if (root == NULL) + i_panic("settings_key_exists() - event has no SETTINGS_EVENT_ROOT"); + + bool ret; + T_BEGIN { + size_t len = strlen(key); + if (len > 0 && key[len-1] == SETTINGS_APPEND_KEY_SUFFIX[0]) + key = t_strndup(key, len - 1); + + enum setting_type set_type ATTR_UNUSED; + const void *blocks ATTR_UNUSED; + ret = settings_mmap_lookup_key(root->mmap, key, + &set_type, &blocks); + } T_END; + return ret; +} + struct settings_filter_array_item { union { unsigned int uint; diff --git a/src/lib-settings/settings.h b/src/lib-settings/settings.h index 5a7ee67230..59ae1584ba 100644 --- a/src/lib-settings/settings.h +++ b/src/lib-settings/settings.h @@ -257,6 +257,10 @@ settings_get_or_fatal(struct event *event, } \ } STMT_END +/* Returns TRUE if a setting key is valid. The settings must have been read + before calling this. SETTINGS_APPEND_KEY_SUFFIX is ignored in the key. */ +bool settings_key_exists(struct event *event, const char *key); + /* Override a setting. */ void settings_override(struct settings_instance *instance, const char *key, const char *value,