]> source.dussan.org Git - rspamd.git/commitdiff
Add a separate options handler.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 10 Sep 2013 16:10:28 +0000 (17:10 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 10 Sep 2013 16:10:28 +0000 (17:10 +0100)
src/cfg_rcl.c

index 077c63d4997550de6b4476352c54b8e686520223..f5d5bab2e1a3a47bfe985832e5bc60d03039bf11 100644 (file)
@@ -31,17 +31,17 @@ static gboolean
 rspamd_rcl_logging_handler (struct config_file *cfg, rspamd_cl_object_t *obj,
                gpointer ud, struct rspamd_rcl_section *section, GError **err)
 {
-       rspamd_cl_object_t *val;
+       rspamd_cl_object_t *val, *lobj;
        gchar *filepath;
        const gchar *facility, *log_type, *log_level;
 
-       obj = obj->value.ov;
+       lobj = obj->value.ov;
 
-       HASH_FIND_STR (obj, "type", val);
+       HASH_FIND_STR (lobj, "type", val);
        if (val != NULL && rspamd_cl_obj_tostring_safe (val, &log_type)) {
                if (g_ascii_strcasecmp (log_type, "file") == 0) {
                        /* Need to get filename */
-                       HASH_FIND_STR (obj, "filename", val);
+                       HASH_FIND_STR (lobj, "filename", val);
                        if (val == NULL || val->type != RSPAMD_CL_STRING) {
                                g_set_error (err, CFG_RCL_ERROR, ENOENT, "filename attribute must be specified for file logging type");
                                return FALSE;
@@ -58,7 +58,7 @@ rspamd_rcl_logging_handler (struct config_file *cfg, rspamd_cl_object_t *obj,
                        /* Need to get facility */
                        cfg->log_facility = LOG_DAEMON;
                        cfg->log_type = RSPAMD_LOG_SYSLOG;
-                       HASH_FIND_STR (obj, "facility", val);
+                       HASH_FIND_STR (lobj, "facility", val);
                        if (val != NULL && rspamd_cl_obj_tostring_safe (val, &facility)) {
                                if (g_ascii_strcasecmp (facility, "LOG_AUTH") == 0 ||
                                                g_ascii_strcasecmp (facility, "auth") == 0 ) {
@@ -132,7 +132,7 @@ rspamd_rcl_logging_handler (struct config_file *cfg, rspamd_cl_object_t *obj,
        }
 
        /* Handle log level */
-       HASH_FIND_STR (obj, "level", val);
+       HASH_FIND_STR (lobj, "level", val);
        if (val != NULL && rspamd_cl_obj_tostring_safe (val, &log_level)) {
                if (g_ascii_strcasecmp (log_level, "error") == 0) {
                        cfg->log_level = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL;
@@ -155,6 +155,37 @@ rspamd_rcl_logging_handler (struct config_file *cfg, rspamd_cl_object_t *obj,
        return rspamd_rcl_section_parse_defaults (section, cfg, obj, cfg, err);
 }
 
+static gboolean
+rspamd_rcl_options_handler (struct config_file *cfg, rspamd_cl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err)
+{
+       rspamd_cl_object_t *val, *lobj;
+       const gchar *user_settings, *domain_settings;
+
+       lobj = obj->value.ov;
+
+       /* Handle user and domain settings */
+       HASH_FIND_STR (lobj, "user_settings", val);
+       if (val != NULL && rspamd_cl_obj_tostring_safe (val, &user_settings)) {
+               if (!read_settings (user_settings, "Users' settings", cfg, cfg->user_settings)) {
+                       g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot read settings: %s", user_settings);
+                       return FALSE;
+               }
+               cfg->user_settings_str = memory_pool_strdup (cfg->cfg_pool, user_settings);
+       }
+
+       HASH_FIND_STR (lobj, "domain_settings", val);
+       if (val != NULL && rspamd_cl_obj_tostring_safe (val, &domain_settings)) {
+               if (!read_settings (domain_settings, "Domains settings", cfg, cfg->domain_settings)) {
+                       g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot read settings: %s", domain_settings);
+                       return FALSE;
+               }
+               cfg->domain_settings_str = memory_pool_strdup (cfg->cfg_pool, domain_settings);
+       }
+
+       return rspamd_rcl_section_parse_defaults (section, cfg, obj, cfg, err);
+}
+
 /**
  * Fake handler to parse default options only, uses struct cfg_file as pointer
  * for default handlers
@@ -245,12 +276,14 @@ rspamd_rcl_config_init (void)
        /**
         * Options section
         */
-       sub = rspamd_rcl_add_section (new, "options", rspamd_rcl_empty_handler, RSPAMD_CL_OBJECT,
+       sub = rspamd_rcl_add_section (new, "options", rspamd_rcl_options_handler, RSPAMD_CL_OBJECT,
                        FALSE, TRUE);
        rspamd_rcl_add_default_handler (sub, "statfile_pool_size", rspamd_rcl_parse_struct_integer,
                        G_STRUCT_OFFSET (struct config_file, max_statfile_size), RSPAMD_CL_FLAG_INT_SIZE);
        rspamd_rcl_add_default_handler (sub, "cache_file", rspamd_rcl_parse_struct_string,
                        G_STRUCT_OFFSET (struct config_file, cache_filename), 0);
+       rspamd_rcl_add_default_handler (sub, "dns_nameserver", rspamd_rcl_parse_struct_string_list,
+                       G_STRUCT_OFFSET (struct config_file, nameservers), 0);
        rspamd_rcl_add_default_handler (sub, "dns_timeout", rspamd_rcl_parse_struct_time,
                        G_STRUCT_OFFSET (struct config_file, dns_timeout), RSPAMD_CL_FLAG_TIME_INTEGER);
        rspamd_rcl_add_default_handler (sub, "dns_retransmits", rspamd_rcl_parse_struct_integer,