commit ef58324: [Rework] More steps to do refactoring
Vsevolod Stakhov
vsevolod at rspamd.com
Thu Aug 17 11:49:12 UTC 2023
Author: Vsevolod Stakhov
Date: 2023-08-16 14:20:15 +0100
URL: https://github.com/rspamd/rspamd/commit/ef583245356015ce29961e0f7ffdb5880edc5fc2
[Rework] More steps to do refactoring
---
src/libmime/lang_detection.c | 8 +-
src/libmime/lang_detection_fasttext.cxx | 6 +-
src/libserver/cfg_file.h | 30 +--
src/libserver/cfg_rcl.cxx | 224 +++++++++-------------
src/libserver/cfg_utils.cxx | 8 +-
src/libserver/dns.c | 10 +-
src/libserver/fuzzy_backend/fuzzy_backend_redis.c | 8 +-
src/libserver/http/http_context.c | 8 +-
src/libstat/backends/redis_backend.c | 8 +-
src/libstat/learn_cache/redis_cache.c | 8 +-
src/libutil/cxx/file_util.hxx | 15 +-
src/lua/lua_cfg_file.c | 8 +-
src/lua/lua_config.c | 16 +-
src/lua/lua_util.c | 10 +-
src/plugins/regexp.c | 8 +-
src/rspamadm/configdump.c | 14 +-
src/rspamadm/confighelp.c | 8 +-
17 files changed, 180 insertions(+), 217 deletions(-)
diff --git a/src/libmime/lang_detection.c b/src/libmime/lang_detection.c
index 52221cd32..aa5447c8b 100644
--- a/src/libmime/lang_detection.c
+++ b/src/libmime/lang_detection.c
@@ -1,11 +1,11 @@
-/*-
- * Copyright 2017 Vsevolod Stakhov
+/*
+ * Copyright 2023 Vsevolod Stakhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -800,7 +800,7 @@ rspamd_language_detector_init(struct rspamd_config *cfg)
ucl_object_t *stop_words;
bool prefer_fasttext = true;
- section = ucl_object_lookup(cfg->rcl_obj, "lang_detection");
+ section = ucl_object_lookup(cfg->cfg_ucl_obj, "lang_detection");
if (section != NULL) {
elt = ucl_object_lookup(section, "languages");
diff --git a/src/libmime/lang_detection_fasttext.cxx b/src/libmime/lang_detection_fasttext.cxx
index f06e8ccb6..a1490fc11 100644
--- a/src/libmime/lang_detection_fasttext.cxx
+++ b/src/libmime/lang_detection_fasttext.cxx
@@ -1,11 +1,11 @@
-/*-
+/*
* Copyright 2023 Vsevolod Stakhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -45,7 +45,7 @@ private:
public:
explicit fasttext_langdet(struct rspamd_config *cfg)
{
- const auto *ucl_obj = cfg->rcl_obj;
+ const auto *ucl_obj = cfg->cfg_ucl_obj;
const auto *opts_section = ucl_object_find_key(ucl_obj, "lang_detection");
if (opts_section) {
diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h
index 703ca57ff..0d85e5f5e 100644
--- a/src/libserver/cfg_file.h
+++ b/src/libserver/cfg_file.h
@@ -392,21 +392,21 @@ struct rspamd_config {
GList *script_modules; /**< linked list of script modules to load */
GHashTable *explicit_modules; /**< modules that should be always loaded */
- GList *filters; /**< linked list of all filters */
- GList *workers; /**< linked list of all workers params */
- struct rspamd_rcl_sections_map *rcl_parser; /**< parser for RCL config */
- ucl_object_t *rcl_obj; /**< rcl object */
- ucl_object_t *config_comments; /**< comments saved from the config */
- ucl_object_t *doc_strings; /**< documentation strings for config options */
- GPtrArray *c_modules; /**< list of C modules */
- void *composites_manager; /**< hash of composite symbols indexed by its name */
- GList *classifiers; /**< list of all classifiers defined */
- GList *statfiles; /**< list of all statfiles in config file order */
- GHashTable *classifiers_symbols; /**< hashtable indexed by symbol name of classifiers */
- GHashTable *cfg_params; /**< all cfg params indexed by its name in this structure */
- gchar *dynamic_conf; /**< path to dynamic configuration */
- ucl_object_t *current_dynamic_conf; /**< currently loaded dynamic configuration */
- gint clock_res; /**< resolution of clock used */
+ GList *filters; /**< linked list of all filters */
+ GList *workers; /**< linked list of all workers params */
+ struct rspamd_rcl_sections_map *rcl_top_section; /**< top section for RCL config */
+ ucl_object_t *cfg_ucl_obj; /**< ucl object */
+ ucl_object_t *config_comments; /**< comments saved from the config */
+ ucl_object_t *doc_strings; /**< documentation strings for config options */
+ GPtrArray *c_modules; /**< list of C modules */
+ void *composites_manager; /**< hash of composite symbols indexed by its name */
+ GList *classifiers; /**< list of all classifiers defined */
+ GList *statfiles; /**< list of all statfiles in config file order */
+ GHashTable *classifiers_symbols; /**< hashtable indexed by symbol name of classifiers */
+ GHashTable *cfg_params; /**< all cfg params indexed by its name in this structure */
+ gchar *dynamic_conf; /**< path to dynamic configuration */
+ ucl_object_t *current_dynamic_conf; /**< currently loaded dynamic configuration */
+ gint clock_res; /**< resolution of clock used */
GList *maps; /**< maps active */
gdouble map_timeout; /**< maps watch timeout */
diff --git a/src/libserver/cfg_rcl.cxx b/src/libserver/cfg_rcl.cxx
index aadcc50a6..5234e4fa3 100644
--- a/src/libserver/cfg_rcl.cxx
+++ b/src/libserver/cfg_rcl.cxx
@@ -33,7 +33,9 @@
#include <memory>
#include <algorithm>
#include "contrib/ankerl/unordered_dense.h"
+#include "fmt/core.h"
#include "libutil/cxx/util.hxx"
+#include "libutil/cxx/file_util.hxx"
#ifdef HAVE_SYSLOG_H
#include <syslog.h>
@@ -58,6 +60,7 @@ struct rspamd_rcl_section {
enum ucl_type type; /**< type of attribute */
bool required; /**< whether this param is required */
bool strict_type; /**< whether we need strict type */
+ mutable bool processed; /**< whether this section was processed */
ankerl::unordered_dense::map<std::string, std::shared_ptr<struct rspamd_rcl_section>> subsections;
ankerl::unordered_dense::map<std::string, struct rspamd_rcl_default_handler_data> default_parser; /**< generic parsing fields */
rspamd_rcl_section_fin_t fin; /** called at the end of section parsing */
@@ -2446,8 +2449,14 @@ rspamd_rcl_process_section(struct rspamd_config *cfg,
auto is_nested = true;
const gchar *key = nullptr;
+ if (sec.processed) {
+ /* Section has been already processed */
+ return TRUE;
+ }
g_assert(obj != nullptr);
g_assert(sec.handler != nullptr);
+ /* Set processed flag */
+ sec.processed = true;
if (sec.key_attr) {
it = ucl_object_iterate_new(obj);
@@ -3248,7 +3257,7 @@ void rspamd_rcl_register_worker_option(struct rspamd_config *cfg,
gint flags,
const gchar *doc_string)
{
- auto parser_it = cfg->rcl_parser->workers_parser.try_emplace(type, rspamd_worker_cfg_parser{});
+ auto parser_it = cfg->rcl_top_section->workers_parser.try_emplace(type, rspamd_worker_cfg_parser{});
auto &parser = parser_it.first->second;
auto handler_it = parser.parsers.try_emplace(std::make_pair(std::string{name}, target), rspamd_worker_param_parser{});
@@ -3398,7 +3407,7 @@ void rspamd_rcl_maybe_apply_lua_transform(struct rspamd_config *cfg)
lua_pushvalue(L, -2);
/* Push the existing config */
- ucl_object_push_lua(L, cfg->rcl_obj, true);
+ ucl_object_push_lua(L, cfg->cfg_ucl_obj, true);
if ((ret = lua_pcall(L, 1, 2, err_idx)) != 0) {
msg_err("call to rspamadm lua script failed (%d): %s", ret,
@@ -3409,10 +3418,10 @@ void rspamd_rcl_maybe_apply_lua_transform(struct rspamd_config *cfg)
}
if (lua_toboolean(L, -2) && lua_type(L, -1) == LUA_TTABLE) {
- ucl_object_t *old_cfg = cfg->rcl_obj;
+ ucl_object_t *old_cfg = cfg->cfg_ucl_obj;
msg_info_config("configuration has been transformed in Lua");
- cfg->rcl_obj = ucl_object_lua_import(L, -1);
+ cfg->cfg_ucl_obj = ucl_object_lua_import(L, -1);
ucl_object_unref(old_cfg);
}
@@ -3427,7 +3436,7 @@ rspamd_rcl_decrypt_handler(struct ucl_parser *parser,
void *user_data)
{
GError *err = nullptr;
- struct rspamd_cryptobox_keypair *kp = (struct rspamd_cryptobox_keypair *) user_data;
+ auto *kp = (struct rspamd_cryptobox_keypair *) user_data;
if (!rspamd_keypair_decrypt(kp, source, source_len,
destination, dest_len, &err)) {
@@ -3446,12 +3455,11 @@ rspamd_rcl_jinja_handler(struct ucl_parser *parser,
unsigned char **destination, size_t *dest_len,
void *user_data)
{
- struct rspamd_config *cfg = (struct rspamd_config *) user_data;
- lua_State *L = cfg->lua_state;
- gint err_idx;
+ auto *cfg = (struct rspamd_config *) user_data;
+ auto *L = RSPAMD_LUA_CFG_STATE(cfg);
lua_pushcfunction(L, &rspamd_lua_traceback);
- err_idx = lua_gettop(L);
+ auto err_idx = lua_gettop(L);
/* Obtain function */
if (!rspamd_lua_require_function(L, "lua_util", "jinja_template")) {
@@ -3461,7 +3469,7 @@ rspamd_rcl_jinja_handler(struct ucl_parser *parser,
return false;
}
- lua_pushlstring(L, source, source_len);
+ lua_pushlstring(L, (const char *) source, source_len);
lua_getglobal(L, "rspamd_env");
lua_pushboolean(L, false);
@@ -3478,7 +3486,7 @@ rspamd_rcl_jinja_handler(struct ucl_parser *parser,
gsize nsize;
ndata = lua_tolstring(L, -1, &nsize);
- *destination = UCL_ALLOC(nsize);
+ *destination = (unsigned char *) UCL_ALLOC(nsize);
memcpy(*destination, ndata, nsize);
*dest_len = nsize;
}
@@ -3515,7 +3523,7 @@ void rspamd_config_calculate_cksum(struct rspamd_config *cfg)
f.ucl_emitter_append_len = rspamd_rcl_emitter_append_len;
f.ucl_emitter_free_func = nullptr;
f.ud = &hs;
- ucl_object_emit_full(cfg->rcl_obj, UCL_EMIT_MSGPACK,
+ ucl_object_emit_full(cfg->cfg_ucl_obj, UCL_EMIT_MSGPACK,
&f, cfg->config_comments);
rspamd_cryptobox_hash_final(&hs, cksumbuf);
cfg->checksum = rspamd_encode_base32(cksumbuf, sizeof(cksumbuf), RSPAMD_BASE32_DEFAULT);
@@ -3533,55 +3541,30 @@ rspamd_config_parse_ucl(struct rspamd_config *cfg,
gboolean skip_jinja,
GError **err)
{
- struct stat st;
- gint fd;
- struct ucl_parser *parser;
- gchar keypair_path[PATH_MAX];
struct rspamd_cryptobox_keypair *decrypt_keypair = nullptr;
- gchar *data;
+ auto cfg_file_maybe = rspamd::util::raii_mmaped_file::mmap_shared(filename, O_RDONLY, PROT_READ, 0);
- if ((fd = open(filename, O_RDONLY)) == -1) {
+ if (!cfg_file_maybe) {
g_set_error(err, cfg_rcl_error_quark(), errno,
- "cannot open %s: %s", filename, strerror(errno));
+ "cannot open %s: %*s", filename, (int) cfg_file_maybe.error().error_message.size(),
+ cfg_file_maybe.error().error_message.data());
return FALSE;
}
- if (fstat(fd, &st) == -1) {
- g_set_error(err, cfg_rcl_error_quark(), errno,
- "cannot stat %s: %s", filename, strerror(errno));
- close(fd);
- return FALSE;
- }
- /* Now mmap this file to simplify reading process */
- if ((data = mmap(nullptr, st.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
- g_set_error(err, cfg_rcl_error_quark(), errno,
- "cannot mmap %s: %s", filename, strerror(errno));
- close(fd);
-
- return FALSE;
- }
-
- close(fd);
+ auto &cfg_file = cfg_file_maybe.value();
/* Try to load keyfile if available */
- rspamd_snprintf(keypair_path, sizeof(keypair_path), "%s.key",
- filename);
- if ((fd = open(keypair_path, O_RDONLY)) != -1) {
- struct ucl_parser *kp_parser;
-
- kp_parser = ucl_parser_new(0);
-
- if (ucl_parser_add_fd(kp_parser, fd)) {
- ucl_object_t *kp_obj;
-
- kp_obj = ucl_parser_get_object(kp_parser);
+ rspamd::util::raii_file::open(fmt::format("{}.key", filename), O_RDONLY).map([&](const auto &keyfile) {
+ auto *kp_parser = ucl_parser_new(0);
+ if (ucl_parser_add_fd(kp_parser, keyfile.get_fd())) {
+ auto *kp_obj = ucl_parser_get_object(kp_parser);
g_assert(kp_obj != nullptr);
decrypt_keypair = rspamd_keypair_from_ucl(kp_obj);
if (decrypt_keypair == nullptr) {
- msg_err_config_forced("cannot load keypair from %s: invalid keypair",
- keypair_path);
+ msg_err_config_forced("cannot load keypair from %s.key: invalid keypair",
+ filename);
}
else {
/* Add decryption support to UCL */
@@ -3593,62 +3576,52 @@ rspamd_config_parse_ucl(struct rspamd_config *cfg,
ucl_object_unref(kp_obj);
}
else {
- msg_err_config_forced("cannot load keypair from %s: %s",
- keypair_path, ucl_parser_get_error(kp_parser));
+ msg_err_config_forced("cannot load keypair from %s.key: %s",
+ filename, ucl_parser_get_error(kp_parser));
}
-
ucl_parser_free(kp_parser);
- close(fd);
- }
+ });
- parser = ucl_parser_new(UCL_PARSER_SAVE_COMMENTS);
- rspamd_ucl_add_conf_variables(parser, vars);
- rspamd_ucl_add_conf_macros(parser, cfg);
- ucl_parser_set_filevars(parser, filename, true);
+ auto parser = std::shared_ptr<ucl_parser>(ucl_parser_new(UCL_PARSER_SAVE_COMMENTS), ucl_parser_free);
+ rspamd_ucl_add_conf_variables(parser.get(), vars);
+ rspamd_ucl_add_conf_macros(parser.get(), cfg);
+ ucl_parser_set_filevars(parser.get(), filename, true);
if (inc_trace) {
- ucl_parser_set_include_tracer(parser, inc_trace, trace_data);
+ ucl_parser_set_include_tracer(parser.get(), inc_trace, trace_data);
}
if (decrypt_keypair) {
- struct ucl_parser_special_handler *decrypt_handler;
-
- decrypt_handler = rspamd_mempool_alloc0(cfg->cfg_pool,
- sizeof(*decrypt_handler));
+ auto *decrypt_handler = rspamd_mempool_alloc0_type(cfg->cfg_pool,
+ struct ucl_parser_special_handler);
decrypt_handler->user_data = decrypt_keypair;
decrypt_handler->magic = encrypted_magic;
decrypt_handler->magic_len = sizeof(encrypted_magic);
decrypt_handler->handler = rspamd_rcl_decrypt_handler;
decrypt_handler->free_function = rspamd_rcl_decrypt_free;
- ucl_parser_add_special_handler(parser, decrypt_handler);
+ ucl_parser_add_special_handler(parser.get(), decrypt_handler);
}
if (!skip_jinja) {
- struct ucl_parser_special_handler *jinja_handler;
-
- jinja_handler = rspamd_mempool_alloc0(cfg->cfg_pool,
- sizeof(*jinja_handler));
+ auto *jinja_handler = rspamd_mempool_alloc0_type(cfg->cfg_pool,
+ struct ucl_parser_special_handler);
jinja_handler->user_data = cfg;
jinja_handler->flags = UCL_SPECIAL_HANDLER_PREPROCESS_ALL;
jinja_handler->handler = rspamd_rcl_jinja_handler;
- ucl_parser_add_special_handler(parser, jinja_handler);
+ ucl_parser_add_special_handler(parser.get(), jinja_handler);
}
- if (!ucl_parser_add_chunk(parser, data, st.st_size)) {
+ if (!ucl_parser_add_chunk(parser.get(), (unsigned char *) cfg_file.get_map(), cfg_file.get_size())) {
g_set_error(err, cfg_rcl_error_quark(), errno,
- "ucl parser error: %s", ucl_parser_get_error(parser));
- ucl_parser_free(parser);
- munmap(data, st.st_size);
+ "ucl parser error: %s", ucl_parser_get_error(parser.get()));
return FALSE;
}
- munmap(data, st.st_size);
- cfg->rcl_obj = ucl_parser_get_object(parser);
- cfg->config_comments = ucl_object_ref(ucl_parser_get_comments(parser));
- ucl_parser_free(parser);
+ cfg->cfg_ucl_obj = ucl_parser_get_object(parser.get());
+ cfg->config_comments = ucl_object_ref(ucl_parser_get_comments(parser.get()));
return TRUE;
}
@@ -3663,12 +3636,10 @@ rspamd_config_read(struct rspamd_config *cfg,
gchar **lua_env)
{
GError *err = nullptr;
- struct rspamd_rcl_section *top, *logger_section;
- const ucl_object_t *logger_obj;
- rspamd_lua_set_path(cfg->lua_state, nullptr, vars);
+ rspamd_lua_set_path(RSPAMD_LUA_CFG_STATE(cfg), nullptr, vars);
- if (!rspamd_lua_set_env(cfg->lua_state, vars, lua_env, &err)) {
+ if (!rspamd_lua_set_env(RSPAMD_LUA_CFG_STATE(cfg), vars, lua_env, &err)) {
msg_err_config_forced("failed to set up environment: %e", err);
g_error_free(err);
@@ -3682,25 +3653,27 @@ rspamd_config_read(struct rspamd_config *cfg,
return FALSE;
}
- top = rspamd_rcl_config_init(cfg, nullptr);
+ auto *top = rspamd_rcl_config_init(cfg, nullptr);
+ cfg->rcl_top_section = top;
/* Add new paths if defined in options */
- rspamd_lua_set_path(cfg->lua_state, cfg->rcl_obj, vars);
- rspamd_lua_set_globals(cfg, cfg->lua_state);
- rspamd_mempool_add_destructor(cfg->cfg_pool, rspamd_rcl_section_free, top);
+ rspamd_lua_set_path(RSPAMD_LUA_CFG_STATE(cfg), cfg->cfg_ucl_obj, vars);
+ rspamd_lua_set_globals(cfg, RSPAMD_LUA_CFG_STATE(cfg));
+ rspamd_mempool_add_destructor(cfg->cfg_pool, (rspamd_mempool_destruct_t) rspamd_rcl_sections_free, top);
err = nullptr;
+ /* Pre-init logging if possible */
if (logger_fin != nullptr) {
- HASH_FIND_STR(top, "logging", logger_section);
+ auto logging_section_maybe = rspamd::find_map(top->sections, "logging");
- if (logger_section != nullptr) {
- logger_obj = ucl_object_lookup_any(cfg->rcl_obj, "logging",
- "logger", nullptr);
+ if (logging_section_maybe) {
+ const auto *logger_obj = ucl_object_lookup_any(cfg->cfg_ucl_obj, "logging",
+ "logger", nullptr);
if (logger_obj == nullptr) {
logger_fin(cfg->cfg_pool, logger_ud);
}
else {
- if (!rspamd_rcl_process_section(cfg, logger_section, cfg,
+ if (!rspamd_rcl_process_section(cfg, *logging_section_maybe.value().get().get(), cfg,
logger_obj, cfg->cfg_pool, &err)) {
msg_err_config_forced("cannot init logger: %e", err);
g_error_free(err);
@@ -3712,38 +3685,32 @@ rspamd_config_read(struct rspamd_config *cfg,
}
/* Init lua logging */
- lua_State *L = cfg->lua_state;
- gint err_idx;
- struct rspamd_config **pcfg;
-
- lua_pushcfunction(L, &rspamd_lua_traceback);
- err_idx = lua_gettop(L);
+ lua_pushcfunction(RSPAMD_LUA_CFG_STATE(cfg), &rspamd_lua_traceback);
+ auto err_idx = lua_gettop(RSPAMD_LUA_CFG_STATE(cfg));
/* Obtain function */
- if (!rspamd_lua_require_function(L, "lua_util",
+ if (!rspamd_lua_require_function(RSPAMD_LUA_CFG_STATE(cfg), "lua_util",
"init_debug_logging")) {
msg_err_config("cannot require lua_util.init_debug_logging");
- lua_settop(L, err_idx - 1);
+ lua_settop(RSPAMD_LUA_CFG_STATE(cfg), err_idx - 1);
return FALSE;
}
- pcfg = lua_newuserdata(L, sizeof(*pcfg));
- *pcfg = cfg;
- rspamd_lua_setclass(L, "rspamd{config}", -1);
+ void *pcfg = lua_newuserdata(RSPAMD_LUA_CFG_STATE(cfg), sizeof(void *));
+ memcpy(pcfg, &cfg, sizeof(void *));
+ rspamd_lua_setclass(RSPAMD_LUA_CFG_STATE(cfg), "rspamd{config}", -1);
- if (lua_pcall(L, 1, 0, err_idx) != 0) {
+ if (lua_pcall(RSPAMD_LUA_CFG_STATE(cfg), 1, 0, err_idx) != 0) {
msg_err_config("cannot call lua init_debug_logging script: %s",
- lua_tostring(L, -1));
- lua_settop(L, err_idx - 1);
+ lua_tostring(RSPAMD_LUA_CFG_STATE(cfg), -1));
+ lua_settop(RSPAMD_LUA_CFG_STATE(cfg), err_idx - 1);
return FALSE;
}
- lua_settop(L, err_idx - 1);
+ lua_settop(RSPAMD_LUA_CFG_STATE(cfg), err_idx - 1);
}
-
- HASH_DEL(top, logger_section);
}
}
@@ -3751,7 +3718,7 @@ rspamd_config_read(struct rspamd_config *cfg,
rspamd_rcl_maybe_apply_lua_transform(cfg);
rspamd_config_calculate_cksum(cfg);
- if (!rspamd_rcl_parse(top, cfg, cfg, cfg->cfg_pool, cfg->rcl_obj, &err)) {
+ if (!rspamd_rcl_parse(top, cfg, cfg, cfg->cfg_pool, cfg->cfg_ucl_obj, &err)) {
msg_err_config("rcl parse error: %e", err);
if (err) {
@@ -3774,16 +3741,8 @@ rspamd_rcl_doc_obj_from_handler(ucl_object_t *doc_obj,
rspamd_rcl_default_handler_t handler,
gint flags)
{
- gboolean has_example = FALSE, has_type = FALSE;
- const gchar *type = nullptr;
-
- if (ucl_object_lookup(doc_obj, "example") != nullptr) {
- has_example = TRUE;
- }
-
- if (ucl_object_lookup(doc_obj, "type") != nullptr) {
- has_type = TRUE;
- }
+ auto has_example = ucl_object_lookup(doc_obj, "example") != nullptr;
+ auto has_type = ucl_object_lookup(doc_obj, "type") != nullptr;
if (handler == rspamd_rcl_parse_struct_string) {
if (!has_type) {
@@ -3792,7 +3751,7 @@ rspamd_rcl_doc_obj_from_handler(ucl_object_t *doc_obj,
}
}
else if (handler == rspamd_rcl_parse_struct_integer) {
- type = "int";
+ auto *type = "int";
if (flags & RSPAMD_CL_FLAG_INT_16) {
type = "int16";
@@ -3822,7 +3781,7 @@ rspamd_rcl_doc_obj_from_handler(ucl_object_t *doc_obj,
}
}
else if (handler == rspamd_rcl_parse_struct_time) {
- type = "time";
+ auto *type = "time";
if (!has_type) {
ucl_object_insert_key(doc_obj, ucl_object_fromstring(type),
@@ -3838,7 +3797,7 @@ rspamd_rcl_doc_obj_from_handler(ucl_object_t *doc_obj,
ucl_object_insert_key(doc_obj,
ucl_object_fromstring_common("param = \"str1, str2, str3\" OR "
"param = [\"str1\", \"str2\", \"str3\"]",
- 0, 0),
+ 0, static_cast<ucl_string_flags>(0)),
"example",
0,
false);
@@ -3913,7 +3872,7 @@ rspamd_rcl_add_doc_obj(ucl_object_t *doc_target,
/* Insert doc string itself */
if (doc_string) {
ucl_object_insert_key(doc_obj,
- ucl_object_fromstring_common(doc_string, 0, 0),
+ ucl_object_fromstring_common(doc_string, 0, static_cast<ucl_string_flags>(0)),
"data", 0, false);
}
else {
@@ -3935,7 +3894,7 @@ rspamd_rcl_add_doc_obj(ucl_object_t *doc_target,
if (default_value) {
ucl_object_insert_key(doc_obj,
- ucl_object_fromstring_common(default_value, 0, 0),
+ ucl_object_fromstring_common(default_value, 0, static_cast<ucl_string_flags>(0)),
"default", 0, false);
}
@@ -4075,28 +4034,23 @@ rspamd_rcl_add_doc_by_example(struct rspamd_config *cfg,
const gchar *doc_name,
const gchar *example_data, gsize example_len)
{
- struct ucl_parser *parser;
- ucl_object_t *top, *top_doc;
- const ucl_object_t *comments;
-
- parser = ucl_parser_new(UCL_PARSER_NO_FILEVARS | UCL_PARSER_SAVE_COMMENTS);
+ auto parser = std::shared_ptr<ucl_parser>(ucl_parser_new(UCL_PARSER_NO_FILEVARS | UCL_PARSER_SAVE_COMMENTS), ucl_parser_free);
- if (!ucl_parser_add_chunk(parser, example_data, example_len)) {
+ if (!ucl_parser_add_chunk(parser.get(), reinterpret_cast<const unsigned char *>(example_data), example_len)) {
msg_err_config("cannot parse example: %s",
- ucl_parser_get_error(parser));
- ucl_parser_free(parser);
+ ucl_parser_get_error(parser.get()));
return nullptr;
}
- top = ucl_parser_get_object(parser);
- comments = ucl_parser_get_comments(parser);
+ auto *top = ucl_parser_get_object(parser.get());
+ const auto *comments = ucl_parser_get_comments(parser.get());
/* Add top object */
- top_doc = rspamd_rcl_add_doc_by_path(cfg, root_path, doc_string,
- doc_name, ucl_object_type(top), nullptr, 0, nullptr, FALSE);
+ auto *top_doc = rspamd_rcl_add_doc_by_path(cfg, root_path, doc_string,
+ doc_name, ucl_object_type(top), nullptr, 0, nullptr, FALSE);
ucl_object_insert_key(top_doc,
- ucl_object_fromstring_common(example_data, example_len, 0),
+ ucl_object_fromstring_common(example_data, example_len, static_cast<ucl_string_flags>(0)),
"example", 0, false);
rspamd_rcl_add_doc_from_comments(cfg, top_doc, top, comments, TRUE);
diff --git a/src/libserver/cfg_utils.cxx b/src/libserver/cfg_utils.cxx
index 80a4c85fe..2c820bfa4 100644
--- a/src/libserver/cfg_utils.cxx
+++ b/src/libserver/cfg_utils.cxx
@@ -390,7 +390,7 @@ void rspamd_config_free(struct rspamd_config *cfg)
g_list_free(cfg->classifiers);
g_list_free(cfg->workers);
rspamd_symcache_destroy(cfg->cache);
- ucl_object_unref(cfg->rcl_obj);
+ ucl_object_unref(cfg->cfg_ucl_obj);
ucl_object_unref(cfg->config_comments);
ucl_object_unref(cfg->doc_strings);
ucl_object_unref(cfg->neighbours);
@@ -444,7 +444,7 @@ rspamd_config_get_module_opt(struct rspamd_config *cfg,
{
const ucl_object_t *res = nullptr, *sec;
- sec = ucl_obj_get_key(cfg->rcl_obj, module_name);
+ sec = ucl_obj_get_key(cfg->cfg_ucl_obj, module_name);
if (sec != nullptr) {
res = ucl_obj_get_key(sec, opt_name);
}
@@ -1360,7 +1360,7 @@ rspamd_ucl_fin_cb(struct map_cb_data *data, void **target)
ucl_object_iter_t it = nullptr;
for (auto *cur = ucl_object_iterate(obj, &it, true); cur != nullptr; cur = ucl_object_iterate(obj, &it, true)) {
- ucl_object_replace_key(cbdata->cfg->rcl_obj, (ucl_object_t *) cur,
+ ucl_object_replace_key(cbdata->cfg->cfg_ucl_obj, (ucl_object_t *) cur,
cur->key, cur->keylen, false);
}
@@ -1883,7 +1883,7 @@ rspamd_config_is_module_enabled(struct rspamd_config *cfg,
}
}
- conf = ucl_object_lookup(cfg->rcl_obj, module_name);
+ conf = ucl_object_lookup(cfg->cfg_ucl_obj, module_name);
if (conf == nullptr) {
rspamd_plugins_table_push_elt(L, "disabled_unconfigured", module_name);
diff --git a/src/libserver/dns.c b/src/libserver/dns.c
index 84582202a..abe47dfdc 100644
--- a/src/libserver/dns.c
+++ b/src/libserver/dns.c
@@ -1,11 +1,11 @@
-/*-
- * Copyright 2016 Vsevolod Stakhov
+/*
+ * Copyright 2023 Vsevolod Stakhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -948,11 +948,11 @@ rspamd_dns_resolver_init(rspamd_logger_t *logger,
dns_resolver->ups);
cfg->dns_resolver = dns_resolver;
- if (cfg->rcl_obj) {
+ if (cfg->cfg_ucl_obj) {
/* Configure additional options */
const ucl_object_t *opts_section, *dns_section, *tmp;
- opts_section = ucl_object_lookup(cfg->rcl_obj, "options");
+ opts_section = ucl_object_lookup(cfg->cfg_ucl_obj, "options");
if (opts_section) {
/* TODO: implement a more simple merge logic */
diff --git a/src/libserver/fuzzy_backend/fuzzy_backend_redis.c b/src/libserver/fuzzy_backend/fuzzy_backend_redis.c
index 2f9d1ed10..9b5b3bc02 100644
--- a/src/libserver/fuzzy_backend/fuzzy_backend_redis.c
+++ b/src/libserver/fuzzy_backend/fuzzy_backend_redis.c
@@ -1,11 +1,11 @@
-/*-
- * Copyright 2016 Vsevolod Stakhov
+/*
+ * Copyright 2023 Vsevolod Stakhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -204,7 +204,7 @@ rspamd_fuzzy_backend_init_redis(struct rspamd_fuzzy_backend *bk,
/* Now try global redis settings */
if (!ret) {
- elt = ucl_object_lookup(cfg->rcl_obj, "redis");
+ elt = ucl_object_lookup(cfg->cfg_ucl_obj, "redis");
*** OUTPUT TRUNCATED, 356 LINES SKIPPED ***
More information about the Commits
mailing list