]> source.dussan.org Git - rspamd.git/commitdiff
Add the parser of string fileds in structs.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 29 Aug 2013 14:00:50 +0000 (15:00 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 29 Aug 2013 14:00:50 +0000 (15:00 +0100)
src/cfg_rcl.c
src/cfg_rcl.h

index 864a0c93541e4ad2c59d2a48f2f11748a6072c5b..638b554455ffe7537c492e1fc40d264d5e43b47f 100644 (file)
@@ -255,3 +255,37 @@ rspamd_read_rcl_config (struct rspamd_rcl_section *top,
 
        return TRUE;
 }
+
+gboolean
+rspamd_rcl_parse_struct_string (struct config_file *cfg, rspamd_cl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err)
+{
+       struct rspamd_rcl_struct_parser *pd = ud;
+       gchar **target;
+       const gsize num_str_len = 32;
+
+       target = (gchar **)(((gchar *)pd->user_struct) + pd->offset);
+       switch (obj->type) {
+       case RSPAMD_CL_STRING:
+               /* Direct assigning is safe, as object is likely linked to the cfg mem_pool */
+               *target = obj->value.sv;
+               break;
+       case RSPAMD_CL_INT:
+               *target = memory_pool_alloc (cfg->cfg_pool, num_str_len);
+               rspamd_snprintf (*target, num_str_len, "%L", obj->value.iv);
+               break;
+       case RSPAMD_CL_FLOAT:
+               *target = memory_pool_alloc (cfg->cfg_pool, num_str_len);
+               rspamd_snprintf (*target, num_str_len, "%f", obj->value.dv);
+               break;
+       case RSPAMD_CL_BOOLEAN:
+               *target = memory_pool_alloc (cfg->cfg_pool, num_str_len);
+               rspamd_snprintf (*target, num_str_len, "%b", (gboolean)obj->value.iv);
+               break;
+       default:
+               g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert object or array to string");
+               return FALSE;
+       }
+
+       return TRUE;
+}
index d02d196b1991a4b29584de8f200f7b96381b2092..8b2a3fdc1983af58c2ea22d944f1edc9f25b163f 100644 (file)
@@ -83,4 +83,26 @@ struct rspamd_rcl_section *rspamd_rcl_config_get_section (struct rspamd_rcl_sect
 gboolean rspamd_read_rcl_config (struct rspamd_rcl_section *top,
                struct config_file *cfg, rspamd_cl_object_t *obj, GError **err);
 
+/**
+ * Here is a section of common handlers that accepts rcl_struct_parser
+ * which itself contains a struct pointer and the offset of a member in a
+ * specific structure
+ */
+struct rspamd_rcl_struct_parser {
+       gpointer user_struct;
+       goffset offset;
+};
+
+/**
+ * Parse a string field of a structure
+ * @param cfg config pointer
+ * @param obj object to parse
+ * @param ud struct_parser structure
+ * @param section the current section
+ * @param err error pointer
+ * @return TRUE if a string value has been successfully parsed
+ */
+gboolean rspamd_rcl_parse_struct_string (struct config_file *cfg, rspamd_cl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err);
+
 #endif /* CFG_RCL_H_ */