summaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2014-08-24 17:35:02 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2014-08-24 17:35:02 +0100
commita1be94b4c4b59de216e0b8b721a951b2325f7215 (patch)
tree6bb00558dd03918b500468e7385d716e83499265 /src/libserver
parent71f5454dc80cb2cc90363e219d85533b0e7a7895 (diff)
downloadrspamd-a1be94b4c4b59de216e0b8b721a951b2325f7215.tar.gz
rspamd-a1be94b4c4b59de216e0b8b721a951b2325f7215.zip
Rework lists and hashes.
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/buffer.c1
-rw-r--r--src/libserver/cfg_file.h21
-rw-r--r--src/libserver/cfg_rcl.c104
-rw-r--r--src/libserver/cfg_rcl.h22
-rw-r--r--src/libserver/cfg_utils.c73
-rw-r--r--src/libserver/dkim.c1
-rw-r--r--src/libserver/protocol.c1
-rw-r--r--src/libserver/spf.c1
8 files changed, 119 insertions, 105 deletions
diff --git a/src/libserver/buffer.c b/src/libserver/buffer.c
index 403b3dafd..5fbf91578 100644
--- a/src/libserver/buffer.c
+++ b/src/libserver/buffer.c
@@ -28,6 +28,7 @@
#ifdef HAVE_SYS_SENDFILE_H
#include <sys/sendfile.h>
#endif
+#include "utlist.h"
#define G_DISPATCHER_ERROR dispatcher_error_quark ()
#define debug_ip(...) rspamd_conditional_debug (rspamd_main->logger, \
diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h
index 1181c126c..0938b22df 100644
--- a/src/libserver/cfg_file.h
+++ b/src/libserver/cfg_file.h
@@ -11,7 +11,6 @@
#include "upstream.h"
#include "symbols_cache.h"
#include "cfg_rcl.h"
-#include "utlist.h"
#include "ucl.h"
#define DEFAULT_BIND_PORT 11333
@@ -211,21 +210,6 @@ struct rspamd_worker_bind_conf {
struct rspamd_worker_bind_conf *next;
};
-struct rspamd_worker_param_parser {
- rspamd_rcl_handler_t handler; /**< handler function */
- struct rspamd_rcl_struct_parser parser; /**< parser attributes */
- const gchar *name; /**< parameter's name */
- UT_hash_handle hh; /**< hash by name */
-};
-
-struct rspamd_worker_cfg_parser {
- struct rspamd_worker_param_parser *parsers; /**< parsers hash */
- gint type; /**< workers quark */
- gboolean (*def_obj_parser)(const ucl_object_t *obj, gpointer ud); /**< default object parser */
- gpointer def_ud;
- UT_hash_handle hh; /**< hash by type */
-};
-
/**
* Config params for rspamd worker
*/
@@ -498,6 +482,11 @@ struct rspamd_classifier_config * rspamd_config_find_classifier (
gboolean rspamd_config_parse_ip_list (const gchar *ip_list,
radix_tree_t **tree);
+void rspamd_ucl_add_conf_macros (struct ucl_parser *parser,
+ struct rspamd_config *cfg);
+
+void rspamd_ucl_add_conf_variables (struct ucl_parser *parser);
+
#endif /* ifdef CFG_FILE_H */
/*
* vi:ts=4
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c
index 22ce3be50..2926b21c2 100644
--- a/src/libserver/cfg_rcl.c
+++ b/src/libserver/cfg_rcl.c
@@ -23,12 +23,50 @@
#include "cfg_rcl.h"
#include "main.h"
+#include "uthash_strcase.h"
+#include "utlist.h"
#include "cfg_file.h"
#include "lua/lua_common.h"
#include "expressions.h"
#include "classifiers/classifiers.h"
#include "tokenizers/tokenizers.h"
+
+struct rspamd_rcl_default_handler_data {
+ struct rspamd_rcl_struct_parser pd;
+ const gchar *key;
+ rspamd_rcl_handler_t handler;
+ UT_hash_handle hh;
+};
+
+struct rspamd_rcl_section {
+ const gchar *name; /**< name of section */
+ rspamd_rcl_handler_t handler; /**< handler of section attributes */
+ enum ucl_type type; /**< type of attribute */
+ gboolean required; /**< whether this param is required */
+ gboolean strict_type; /**< whether we need strict type */
+ UT_hash_handle hh; /** hash handle */
+ struct rspamd_rcl_section *subsections; /**< hash table of subsections */
+ struct rspamd_rcl_default_handler_data *default_parser; /**< generic parsing fields */
+ rspamd_rcl_section_fin_t fin; /** called at the end of section parsing */
+ gpointer fin_ud;
+};
+
+struct rspamd_worker_param_parser {
+ rspamd_rcl_handler_t handler; /**< handler function */
+ struct rspamd_rcl_struct_parser parser; /**< parser attributes */
+ const gchar *name; /**< parameter's name */
+ UT_hash_handle hh; /**< hash by name */
+};
+
+struct rspamd_worker_cfg_parser {
+ struct rspamd_worker_param_parser *parsers; /**< parsers hash */
+ gint type; /**< workers quark */
+ gboolean (*def_obj_parser)(const ucl_object_t *obj, gpointer ud); /**< default object parser */
+ gpointer def_ud;
+ UT_hash_handle hh; /**< hash by type */
+};
+
/*
* Common section handlers
*/
@@ -1891,3 +1929,69 @@ rspamd_rcl_register_worker_parser (struct rspamd_config *cfg, gint type,
nparser->def_obj_parser = func;
nparser->def_ud = ud;
}
+
+gboolean
+rspamd_config_read (struct rspamd_config *cfg, const gchar *filename,
+ const gchar *convert_to, rspamd_rcl_section_fin_t logger_fin,
+ gpointer logger_ud)
+{
+ struct stat st;
+ gint fd;
+ gchar *data;
+ GError *err = NULL;
+ struct rspamd_rcl_section *top, *logger;
+ gboolean res;
+ struct ucl_parser *parser;
+
+ if (stat (filename, &st) == -1) {
+ msg_err ("cannot stat %s: %s", filename, strerror (errno));
+ return FALSE;
+ }
+ if ((fd = open (filename, O_RDONLY)) == -1) {
+ msg_err ("cannot open %s: %s", filename, strerror (errno));
+ return FALSE;
+
+ }
+ /* Now mmap this file to simplify reading process */
+ if ((data =
+ mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
+ msg_err ("cannot mmap %s: %s", filename, strerror (errno));
+ close (fd);
+ return FALSE;
+ }
+ close (fd);
+
+ parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE);
+ rspamd_ucl_add_conf_variables (parser);
+ rspamd_ucl_add_conf_macros (parser, cfg);
+ if (!ucl_parser_add_chunk (parser, data, st.st_size)) {
+ msg_err ("ucl parser error: %s", ucl_parser_get_error (parser));
+ ucl_parser_free (parser);
+ munmap (data, st.st_size);
+ return FALSE;
+ }
+ munmap (data, st.st_size);
+ cfg->rcl_obj = ucl_parser_get_object (parser);
+ ucl_parser_free (parser);
+ res = TRUE;
+
+ if (!res) {
+ return FALSE;
+ }
+
+ top = rspamd_rcl_config_init ();
+ err = NULL;
+
+ HASH_FIND_STR (top, "logging", logger);
+ if (logger != NULL) {
+ logger->fin = logger_fin;
+ logger->fin_ud = logger_ud;
+ }
+
+ if (!rspamd_read_rcl_config (top, cfg, cfg->rcl_obj, &err)) {
+ msg_err ("rcl parse error: %s", err->message);
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h
index 6ba197be8..333a3e1ee 100644
--- a/src/libserver/cfg_rcl.h
+++ b/src/libserver/cfg_rcl.h
@@ -25,8 +25,7 @@
#define CFG_RCL_H_
#include "config.h"
-#include "ucl/include/ucl.h"
-#include "uthash.h"
+#include "ucl.h"
#define CFG_RCL_ERROR cfg_rcl_error_quark ()
static inline GQuark
@@ -37,6 +36,7 @@ cfg_rcl_error_quark (void)
struct rspamd_rcl_section;
struct rspamd_config;
+struct rspamd_rcl_default_handler_data;
struct rspamd_rcl_struct_parser {
gpointer user_struct;
@@ -75,25 +75,7 @@ typedef gboolean (*rspamd_rcl_handler_t) (struct rspamd_config *cfg,
typedef void (*rspamd_rcl_section_fin_t)(struct rspamd_config *cfg,
gpointer ud);
-struct rspamd_rcl_default_handler_data {
- struct rspamd_rcl_struct_parser pd;
- const gchar *key;
- rspamd_rcl_handler_t handler;
- UT_hash_handle hh;
-};
-struct rspamd_rcl_section {
- const gchar *name; /**< name of section */
- rspamd_rcl_handler_t handler; /**< handler of section attributes */
- enum ucl_type type; /**< type of attribute */
- gboolean required; /**< whether this param is required */
- gboolean strict_type; /**< whether we need strict type */
- UT_hash_handle hh; /** hash handle */
- struct rspamd_rcl_section *subsections; /**< hash table of subsections */
- struct rspamd_rcl_default_handler_data *default_parser; /**< generic parsing fields */
- rspamd_rcl_section_fin_t fin; /** called at the end of section parsing */
- gpointer fin_ud;
-};
/**
* Init common sections known to rspamd
diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c
index 2eae0b0c3..d5fbe70ac 100644
--- a/src/libserver/cfg_utils.c
+++ b/src/libserver/cfg_utils.c
@@ -27,13 +27,14 @@
#include "cfg_file.h"
#include "main.h"
+#include "uthash_strcase.h"
#include "filter.h"
#include "classifiers/classifiers.h"
#include "lua/lua_common.h"
#include "kvstorage_config.h"
#include "map.h"
#include "dynamic_cfg.h"
-#include "xxhash.h"
+#include "utlist.h"
#define DEFAULT_SCORE 10.0
@@ -799,7 +800,7 @@ rspamd_include_map_handler (const guchar *data, gsize len, void * ud)
#define RSPAMD_PREFIX_MACRO "PREFIX"
#define RSPAMD_VERSION_MACRO "VERSION"
-static void
+void
rspamd_ucl_add_conf_variables (struct ucl_parser *parser)
{
ucl_parser_register_variable (parser,
@@ -821,7 +822,7 @@ rspamd_ucl_add_conf_variables (struct ucl_parser *parser)
ucl_parser_register_variable (parser, RSPAMD_VERSION_MACRO, RVERSION);
}
-static void
+void
rspamd_ucl_add_conf_macros (struct ucl_parser *parser,
struct rspamd_config *cfg)
{
@@ -831,72 +832,6 @@ rspamd_ucl_add_conf_macros (struct ucl_parser *parser,
cfg);
}
-gboolean
-rspamd_config_read (struct rspamd_config *cfg, const gchar *filename,
- const gchar *convert_to, rspamd_rcl_section_fin_t logger_fin,
- gpointer logger_ud)
-{
- struct stat st;
- gint fd;
- gchar *data;
- GError *err = NULL;
- struct rspamd_rcl_section *top, *logger;
- gboolean res;
- struct ucl_parser *parser;
-
- if (stat (filename, &st) == -1) {
- msg_err ("cannot stat %s: %s", filename, strerror (errno));
- return FALSE;
- }
- if ((fd = open (filename, O_RDONLY)) == -1) {
- msg_err ("cannot open %s: %s", filename, strerror (errno));
- return FALSE;
-
- }
- /* Now mmap this file to simplify reading process */
- if ((data =
- mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
- msg_err ("cannot mmap %s: %s", filename, strerror (errno));
- close (fd);
- return FALSE;
- }
- close (fd);
-
- parser = ucl_parser_new (0);
- rspamd_ucl_add_conf_variables (parser);
- rspamd_ucl_add_conf_macros (parser, cfg);
- if (!ucl_parser_add_chunk (parser, data, st.st_size)) {
- msg_err ("ucl parser error: %s", ucl_parser_get_error (parser));
- ucl_parser_free (parser);
- munmap (data, st.st_size);
- return FALSE;
- }
- munmap (data, st.st_size);
- cfg->rcl_obj = ucl_parser_get_object (parser);
- ucl_parser_free (parser);
- res = TRUE;
-
- if (!res) {
- return FALSE;
- }
-
- top = rspamd_rcl_config_init ();
- err = NULL;
-
- HASH_FIND_STR (top, "logging", logger);
- if (logger != NULL) {
- logger->fin = logger_fin;
- logger->fin_ud = logger_ud;
- }
-
- if (!rspamd_read_rcl_config (top, cfg, cfg->rcl_obj, &err)) {
- msg_err ("rcl parse error: %s", err->message);
- return FALSE;
- }
-
- return TRUE;
-}
-
static void
symbols_classifiers_callback (gpointer key, gpointer value, gpointer ud)
{
diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c
index c074153ab..6bf9f90f6 100644
--- a/src/libserver/dkim.c
+++ b/src/libserver/dkim.c
@@ -26,6 +26,7 @@
#include "message.h"
#include "dkim.h"
#include "dns.h"
+#include "utlist.h"
/* Parser of dkim params */
typedef gboolean (*dkim_parse_param_f) (rspamd_dkim_context_t * ctx,
diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c
index 2e9e9c9e7..489a58bb4 100644
--- a/src/libserver/protocol.c
+++ b/src/libserver/protocol.c
@@ -27,6 +27,7 @@
#include "util.h"
#include "cfg_file.h"
#include "message.h"
+#include "utlist.h"
/* Max line size */
#define OUTBUFSIZ BUFSIZ
diff --git a/src/libserver/spf.c b/src/libserver/spf.c
index 0ef952a31..98a95bdf3 100644
--- a/src/libserver/spf.c
+++ b/src/libserver/spf.c
@@ -28,6 +28,7 @@
#include "main.h"
#include "message.h"
#include "filter.h"
+#include "utlist.h"
#define SPF_VER1_STR "v=spf1"
#define SPF_VER2_STR "spf2."