aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-01-02 17:37:28 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-01-02 17:37:28 +0000
commit76dad93fd2f437167af999787168e1c3aae398ef (patch)
treeb5b45acdfca85eaeb86350ddf705614f5bc6fcc3
parentf66d2ffef3a6ef62c5b39b9dd86ab15aa44d3c3f (diff)
downloadrspamd-76dad93fd2f437167af999787168e1c3aae398ef.tar.gz
rspamd-76dad93fd2f437167af999787168e1c3aae398ef.zip
Add method to insert documentation to the specific path
-rw-r--r--src/libserver/cfg_rcl.c47
-rw-r--r--src/libserver/cfg_rcl.h12
2 files changed, 59 insertions, 0 deletions
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c
index 44e84acea..a493e9c32 100644
--- a/src/libserver/cfg_rcl.c
+++ b/src/libserver/cfg_rcl.c
@@ -3063,3 +3063,50 @@ rspamd_rcl_add_doc_obj (ucl_object_t *doc_target,
return doc_obj;
}
+
+ucl_object_t *
+rspamd_rcl_add_doc_by_path (struct rspamd_config *cfg,
+ const gchar *doc_path,
+ const char *doc_string,
+ const char *doc_name,
+ ucl_type_t type,
+ rspamd_rcl_default_handler_t handler,
+ gint flags)
+{
+ const ucl_object_t *found, *cur;
+ ucl_object_t *obj;
+ gchar **path_components, **comp;
+
+ found = ucl_lookup_path (cfg->doc_strings, doc_path);
+
+ if (found != NULL) {
+ return rspamd_rcl_add_doc_obj ((ucl_object_t *)found,
+ doc_string, doc_name, type, handler, flags);
+ }
+
+ /* Otherwise we need to insert all components of the path */
+ path_components = g_strsplit_set (doc_path, ".", -1);
+ cur = cfg->doc_strings;
+
+ for (comp = path_components; *comp != NULL; comp ++) {
+ if (ucl_object_type (cur) != UCL_OBJECT) {
+ msg_err_config ("Bad path while lookup for '%s' at %s",
+ doc_path, *comp);
+ return NULL;
+ }
+
+ found = ucl_object_find_key (cur, *comp);
+
+ if (found == NULL) {
+ obj = ucl_object_typed_new (UCL_OBJECT);
+ ucl_object_insert_key ((ucl_object_t *)cur, obj, *comp, 0, true);
+ cur = obj;
+ }
+ else {
+ cur = found;
+ }
+ }
+
+ return rspamd_rcl_add_doc_obj ((ucl_object_t *) cur,
+ doc_string, doc_name, type, handler, flags);
+}
diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h
index 38f545825..b114e765c 100644
--- a/src/libserver/cfg_rcl.h
+++ b/src/libserver/cfg_rcl.h
@@ -358,4 +358,16 @@ ucl_object_t* rspamd_rcl_add_doc_obj (ucl_object_t *doc_target,
ucl_type_t type,
rspamd_rcl_default_handler_t handler,
gint flags);
+
+/**
+ * Adds new documentation option specified by path `doc_path` that should be
+ * splitted by dots
+ */
+ucl_object_t *rspamd_rcl_add_doc_by_path (struct rspamd_config *cfg,
+ const gchar *doc_path,
+ const char *doc_string,
+ const char *doc_name,
+ ucl_type_t type,
+ rspamd_rcl_default_handler_t handler,
+ gint flags);
#endif /* CFG_RCL_H_ */