aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-03-30 15:26:35 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-03-30 15:26:35 +0100
commit407cafe8c24aaa1190b4d11c3175ffea9c4a8396 (patch)
tree7567325e06180f4fe482443e043d693720578fdb
parent179af280e97a94471e2946cb275c24994379e471 (diff)
downloadrspamd-407cafe8c24aaa1190b4d11c3175ffea9c4a8396.tar.gz
rspamd-407cafe8c24aaa1190b4d11c3175ffea9c4a8396.zip
Add routines to parse mime addresses from ucl.
-rw-r--r--src/libserver/cfg_rcl.c70
-rw-r--r--src/libserver/cfg_rcl.h15
2 files changed, 84 insertions, 1 deletions
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c
index 66247cf61..98be1b079 100644
--- a/src/libserver/cfg_rcl.c
+++ b/src/libserver/cfg_rcl.c
@@ -1984,7 +1984,7 @@ rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool,
target = (rspamd_inet_addr_t **)(((gchar *)pd->user_struct) + pd->offset);
- if (obj->type == UCL_STRING) {
+ if (ucl_object_type (obj) == UCL_STRING) {
val = ucl_object_tostring (obj);
if (!rspamd_parse_inet_address (target, val)) {
@@ -2006,6 +2006,74 @@ rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool,
return TRUE;
}
+gboolean
+rspamd_rcl_parse_struct_mime_addr (rspamd_mempool_t *pool,
+ const ucl_object_t *obj,
+ gpointer ud,
+ struct rspamd_rcl_section *section,
+ GError **err)
+{
+ struct rspamd_rcl_struct_parser *pd = ud;
+ InternetAddressList **target, *tmp_addr;
+ const gchar *val;
+ ucl_object_iter_t it;
+ const ucl_object_t *cur;
+
+ target = (InternetAddressList **)(((gchar *)pd->user_struct) + pd->offset);
+ if (*target == NULL) {
+ *target = internet_address_list_new ();
+ #ifdef GMIME24
+ rspamd_mempool_add_destructor (pool,
+ (rspamd_mempool_destruct_t) g_object_unref,
+ *target);
+ #else
+ rspamd_mempool_add_destructor (pool,
+ (rspamd_mempool_destruct_t) internet_address_list_destroy,
+ *target);
+ #endif
+ }
+
+ it = ucl_object_iterate_new (obj);
+
+ while ((cur = ucl_object_iterate_safe (it, true)) != NULL) {
+
+ if (ucl_object_type (cur) == UCL_STRING) {
+ val = ucl_object_tostring (obj);
+ tmp_addr = internet_address_list_parse_string (val);
+
+ if (tmp_addr) {
+ internet_address_list_append (*target, tmp_addr);
+#ifdef GMIME24
+ g_object_unref (tmp_addr);
+#else
+ internet_address_list_destroy (tmp_addr);
+#endif
+ }
+ else {
+ g_set_error (err,
+ CFG_RCL_ERROR,
+ EINVAL,
+ "cannot parse inet address: %s", val);
+ ucl_object_iterate_free (it);
+
+ return FALSE;
+ }
+ }
+ else {
+ g_set_error (err,
+ CFG_RCL_ERROR,
+ EINVAL,
+ "cannot get inet address from ucl object");
+ ucl_object_iterate_free (it);
+
+ return FALSE;
+ }
+ }
+
+ ucl_object_iterate_free (it);
+ return TRUE;
+}
+
void
rspamd_rcl_register_worker_option (struct rspamd_config *cfg,
gint type,
diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h
index df9aa35b6..fe06d95a0 100644
--- a/src/libserver/cfg_rcl.h
+++ b/src/libserver/cfg_rcl.h
@@ -246,6 +246,21 @@ gboolean rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool,
GError **err);
/**
+ * Parse a gmime inet address field of a structure
+ * @param cfg config pointer
+ * @param obj object to parse
+ * @param ud struct_parser structure (flags mean the exact structure used)
+ * @param section the current section
+ * @param err error pointer
+ * @return TRUE if a value has been successfully parsed
+ */
+gboolean rspamd_rcl_parse_struct_mime_addr (rspamd_mempool_t *pool,
+ const ucl_object_t *obj,
+ gpointer ud,
+ struct rspamd_rcl_section *section,
+ GError **err);
+
+/**
* Utility functions
*/