From: Timo Sirainen Date: Tue, 7 Mar 2023 12:19:20 +0000 (+0200) Subject: lib-master, lib-storage: Move key+=append and plugin/ handling to lib-master X-Git-Tag: 2.4.0~2240 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e3e4d2add850b16722103ece47629732fce8598;p=thirdparty%2Fdovecot%2Fcore.git lib-master, lib-storage: Move key+=append and plugin/ handling to lib-master This is necessary because all settings roots won't be known after following changes. The plugin/ handling should eventually go away once all plugin settings have been converted. --- diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index a24f97e4b7..87526ab5fa 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -1053,6 +1053,31 @@ int master_service_set(struct master_service_settings_instance *instance, return 1; } + const char *append_value = NULL; + size_t len = strlen(key); + if (len > 0 && key[len-1] == '+') { + /* key+=value */ + append_value = value; + key = t_strndup(key, len-1); + } + + enum setting_type value_type; + const void *old_value = + master_service_settings_find(instance, key, &value_type); + if (old_value == NULL && !str_begins_with(key, "plugin/")) { + /* assume it's a plugin setting */ + key = t_strconcat("plugin/", key, NULL); + old_value = master_service_settings_find(instance, key, &value_type); + } + + if (append_value != NULL) { + if (old_value == NULL || value_type != SET_STR) { + *error_r = "'+' can only be used for strings"; + return -1; + } + const char *const *strp = old_value; + value = t_strconcat(*strp, append_value, NULL); + } ret = settings_parse_keyvalue(instance->parser, key, value); if (ret <= 0) diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 07c2c37150..cd720b3aea 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -108,38 +108,12 @@ static int set_keyvalue(struct mail_storage_service_user *user, const char *key, const char *value, const char **error_r) { - const char *append_value = NULL; - const void *old_value; - enum setting_type type; - size_t len; int ret; - len = strlen(key); - if (len > 0 && key[len-1] == '+') { - /* key+=value */ - append_value = value; - key = t_strndup(key, len-1); - } /* Ignore empty keys rather than prepend 'plugin/=' to them. */ if (*key == '\0') return 1; - old_value = master_service_settings_find(user->set_instance, key, &type); - if (old_value == NULL && !str_begins_with(key, "plugin/")) { - /* assume it's a plugin setting */ - key = t_strconcat("plugin/", key, NULL); - old_value = master_service_settings_find(user->set_instance, key, &type); - } - - if (append_value != NULL) { - if (old_value == NULL || type != SET_STR) { - *error_r = "'+' can only be used for strings"; - return -1; - } - const char *const *strp = old_value; - value = t_strconcat(*strp, append_value, NULL); - } - ret = master_service_set(user->set_instance, key, value, MASTER_SERVICE_SET_TYPE_USERDB, error_r); if (ret < 0)