{
FILE *in;
char buf[BUFSIZ];
+ char *p;
in = fopen (path, "r");
break;
}
+ /* Strip trailing spaces */
+ p = buf + strlen (buf) - 1;
+ while (p > buf &&
+ (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')) {
+ *p-- = '\0';
+ }
+
if (!rdns_resolver_conf_process_line (resolver, buf, cb, ud)) {
rdns_warn ("rdns_resolver_parse_resolv_conf: cannot parse line: %s", buf);
fclose (in);
{
struct rspamd_dns_resolver *dns_resolver = ud;
- return rspamd_upstreams_add_upstream (dns_resolver->ups,
- name, port, NULL);
+ return rspamd_upstreams_add_upstream (dns_resolver->ups, name, port,
+ RSPAMD_UPSTREAM_PARSE_NAMESERVER,
+ NULL);
}
struct rspamd_dns_resolver *
}
gboolean
-rspamd_upstreams_add_upstream (struct upstream_list *ups,
- const gchar *str, guint16 def_port, void *data)
+rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str,
+ guint16 def_port, enum rspamd_upstream_parse_type parse_type,
+ void *data)
{
struct upstream *up;
GPtrArray *addrs = NULL;
guint i;
rspamd_inet_addr_t *addr;
+ gboolean ret = FALSE;
up = g_slice_alloc0 (sizeof (*up));
- if (!rspamd_parse_host_port_priority (str, &addrs,
- &up->weight,
- &up->name, def_port, ups->ctx->pool)) {
+ switch (parse_type) {
+ case RSPAMD_UPSTREAM_PARSE_DEFAULT:
+ ret = rspamd_parse_host_port_priority (str, &addrs,
+ &up->weight,
+ &up->name, def_port, ups->ctx->pool);
+ break;
+ case RSPAMD_UPSTREAM_PARSE_NAMESERVER:
+ addrs = g_ptr_array_sized_new (1);
+
+ ret = rspamd_parse_inet_address (&addr, str, strlen (str));
+
+ if (ret) {
+ if (rspamd_inet_address_get_port (addr) == 0) {
+ rspamd_inet_address_set_port (addr, def_port);
+ }
+
+ g_ptr_array_add (addrs, addr);
+ rspamd_mempool_add_destructor (ups->ctx->pool,
+ (rspamd_mempool_destruct_t)rspamd_inet_address_free,
+ addr);
+ rspamd_mempool_add_destructor (ups->ctx->pool,
+ (rspamd_mempool_destruct_t)rspamd_ptr_array_free_hard,
+ addrs);
+ }
+ else {
+ g_ptr_array_free (addrs, TRUE);
+ }
+
+ break;
+ }
+ if (!ret) {
g_slice_free1 (sizeof (*up), up);
return FALSE;
}
tmp = g_malloc (len + 1);
rspamd_strlcpy (tmp, p, len + 1);
- if (rspamd_upstreams_add_upstream (ups, tmp, def_port, data)) {
+ if (rspamd_upstreams_add_upstream (ups, tmp, def_port,
+ RSPAMD_UPSTREAM_PARSE_DEFAULT,
+ data)) {
ret = TRUE;
}
*/
gsize rspamd_upstreams_alive (struct upstream_list *ups);
+enum rspamd_upstream_parse_type {
+ RSPAMD_UPSTREAM_PARSE_DEFAULT = 0,
+ RSPAMD_UPSTREAM_PARSE_NAMESERVER,
+};
+
/**
* Add upstream from the string
* @param ups upstream list
* @param data optional userdata
* @return TRUE if upstream has been added
*/
-gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups,
- const gchar *str, guint16 def_port, void *data);
+gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str,
+ guint16 def_port, enum rspamd_upstream_parse_type parse_type,
+ void *data);
/**
* Add multiple upstreams from comma, semicolon or space separated line
{
redir_val = ucl_obj_tostring (cur);
if (rspamd_upstreams_add_upstream (surbl_module_ctx->redirectors,
- redir_val, 80, NULL)) {
+ redir_val, 80, RSPAMD_UPSTREAM_PARSE_DEFAULT,
+ NULL)) {
surbl_module_ctx->use_redirector = TRUE;
}
}
* Test v4/v6 priorities
*/
nls = rspamd_upstreams_create (cfg->ups_ctx);
- g_assert (rspamd_upstreams_add_upstream (nls, "127.0.0.1", 0, NULL));
+ g_assert (rspamd_upstreams_add_upstream (nls, "127.0.0.1", 0,
+ RSPAMD_UPSTREAM_PARSE_DEFAULT,
+ NULL));
up = rspamd_upstream_get (nls, RSPAMD_UPSTREAM_RANDOM, NULL, 0);
rspamd_parse_inet_address (&paddr, "127.0.0.2", 0);
g_assert (rspamd_upstream_add_addr (up, paddr));