From: Vsevolod Stakhov Date: Wed, 29 Oct 2014 13:58:33 +0000 (+0000) Subject: Add parsing of multiple upstreams string. X-Git-Tag: 0.7.3~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=db0e114862cdac564756485f9d5c9102e73d81ab;p=thirdparty%2Frspamd.git Add parsing of multiple upstreams string. --- diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c index 43f2bcfcc2..5b86628b27 100644 --- a/src/libutil/upstream.c +++ b/src/libutil/upstream.c @@ -329,6 +329,33 @@ rspamd_upstreams_add_upstream (struct upstream_list *ups, return TRUE; } +gboolean +rspamd_upstreams_parse_line (struct upstream_list *ups, + const gchar *str, guint16 def_port, void *data) +{ + const gchar *end = str + strlen (str), *p = str; + const gchar *separators = ";, \n\r\t"; + gchar *tmp; + guint len; + gboolean ret = FALSE; + + while (p < end) { + len = strcspn (p, separators); + if (len > 0) { + tmp = g_malloc (len + 1); + rspamd_strlcpy (tmp, p, len + 1); + if (rspamd_upstreams_add_upstream (ups, tmp, def_port, data)) { + ret = TRUE; + } + } + p += len + 1; + /* Skip separators */ + p += strspn (p, separators) + 1; + } + + return ret; +} + void rspamd_upstreams_destroy (struct upstream_list *ups) { diff --git a/src/libutil/upstream.h b/src/libutil/upstream.h index cc4462878a..a5e3715f9f 100644 --- a/src/libutil/upstream.h +++ b/src/libutil/upstream.h @@ -51,10 +51,11 @@ struct upstream_list* rspamd_upstreams_create (void); * @param ups */ void rspamd_upstreams_destroy (struct upstream_list *ups); + /** * Add upstream from the string * @param ups upstream list - * @param str string in format "name[:port[:priority]] + * @param str string in format "name[:port[:priority]]" * @param def_port default port number * @param data optional userdata * @return TRUE if upstream has been added @@ -62,6 +63,17 @@ void rspamd_upstreams_destroy (struct upstream_list *ups); gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str, guint16 def_port, void *data); +/** + * Add multiple upstreams from comma, semicolon or space separated line + * @param ups upstream list + * @param str string in format "(([+])*)+" + * @param def_port default port number + * @param data optional userdata + * @return TRUE if **any** of upstreams has been added + */ +gboolean rspamd_upstreams_parse_line (struct upstream_list *ups, + const gchar *str, guint16 def_port, void *data); + /** * Returns the current IP address of the upstream * @param up