G_STRUCT_OFFSET (struct config_file, dns_retransmits),
NULL
},
+ {
+ "dns_nameserver",
+ options_handle_nameserver,
+ 0,
+ NULL
+ },
{
"raw_mode",
xml_handle_boolean,
return TRUE;
}
+gboolean
+options_handle_nameserver (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GHashTable *attrs, gchar *data, gpointer user_data, gpointer dest_struct, gint offset)
+{
+ cfg->nameservers = g_list_prepend (cfg->nameservers, memory_pool_strdup (cfg->cfg_pool, data));
+ return TRUE;
+}
+
/* Worker section */
gboolean
worker_handle_param (struct config_file *cfg, struct rspamd_xml_userdata *ctx, const gchar *tag, GHashTable *attrs, gchar *data, gpointer user_data, gpointer dest_struct, gint offset)
gboolean xml_handle_boolean (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GHashTable *attrs, gchar *data, gpointer user_data, gpointer dest_struct, gint offset);
/* Specific params */
+/* Options specific */
+gboolean options_handle_nameserver (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GHashTable *attrs, gchar *data, gpointer user_data, gpointer dest_struct, gint offset);
/* Handle workers param */
gboolean worker_handle_param (struct config_file *cfg, struct rspamd_xml_userdata *ctx, const gchar *tag, GHashTable *attrs, gchar *data, gpointer user_data, gpointer dest_struct, gint offset);
gboolean worker_handle_type (struct config_file *cfg, struct rspamd_xml_userdata *ctx, GHashTable *attrs, gchar *data, gpointer user_data, gpointer dest_struct, gint offset);
return;
}
/* Select other server */
- req->server = (struct rspamd_dns_server *)get_upstream_round_robin (req->resolver->servers,
+ if (req->resolver->is_master_slave) {
+ req->server = (struct rspamd_dns_server *)get_upstream_master_slave (req->resolver->servers,
+ req->resolver->servers_num, sizeof (struct rspamd_dns_server),
+ req->time, DEFAULT_UPSTREAM_ERROR_TIME, DEFAULT_UPSTREAM_DEAD_TIME, DEFAULT_UPSTREAM_MAXERRORS);
+ }
+ else {
+ req->server = (struct rspamd_dns_server *)get_upstream_round_robin (req->resolver->servers,
req->resolver->servers_num, sizeof (struct rspamd_dns_server),
req->time, DEFAULT_UPSTREAM_ERROR_TIME, DEFAULT_UPSTREAM_DEAD_TIME, DEFAULT_UPSTREAM_MAXERRORS);
+ }
if (req->server == NULL) {
rep = memory_pool_alloc0 (req->pool, sizeof (struct rspamd_dns_reply));
rep->request = req;
req->retransmits = 0;
req->time = time (NULL);
- req->server = (struct rspamd_dns_server *)get_upstream_round_robin (resolver->servers,
- resolver->servers_num, sizeof (struct rspamd_dns_server),
- req->time, DEFAULT_UPSTREAM_ERROR_TIME, DEFAULT_UPSTREAM_DEAD_TIME, DEFAULT_UPSTREAM_MAXERRORS);
+ if (resolver->is_master_slave) {
+ req->server = (struct rspamd_dns_server *)get_upstream_master_slave (resolver->servers,
+ resolver->servers_num, sizeof (struct rspamd_dns_server),
+ req->time, DEFAULT_UPSTREAM_ERROR_TIME, DEFAULT_UPSTREAM_DEAD_TIME, DEFAULT_UPSTREAM_MAXERRORS);
+ }
+ else {
+ req->server = (struct rspamd_dns_server *)get_upstream_round_robin (resolver->servers,
+ resolver->servers_num, sizeof (struct rspamd_dns_server),
+ req->time, DEFAULT_UPSTREAM_ERROR_TIME, DEFAULT_UPSTREAM_DEAD_TIME, DEFAULT_UPSTREAM_MAXERRORS);
+ }
if (req->server == NULL) {
msg_err ("cannot find suitable server for request");
return FALSE;
struct rspamd_dns_resolver *
dns_resolver_init (struct config_file *cfg)
{
- GList *cur;
- struct rspamd_dns_resolver *new;
- gchar *begin, *p;
+ GList *cur;
+ struct rspamd_dns_resolver *new;
+ gchar *begin, *p, *err;
gint priority, i;
- struct rspamd_dns_server *serv;
+ struct rspamd_dns_server *serv;
new = memory_pool_alloc0 (cfg->cfg_pool, sizeof (struct rspamd_dns_resolver));
new->requests = g_hash_table_new (g_direct_hash, g_direct_equal);
if (p != NULL) {
*p = '\0';
p ++;
- priority = strtoul (p, NULL, 10);
+ if (!new->is_master_slave) {
+ priority = strtoul (p, &err, 10);
+ if (err != NULL && (*err == 'm' || *err == 'M' || *err == 's' || *err == 'S')) {
+ new->is_master_slave = TRUE;
+ }
+ else {
+ msg_info ("bad character '%c', must be 'm' or 's' or a numeric priority", *err);
+ }
+ }
+ if (new->is_master_slave) {
+ if (*p == 'm' || *p == 'M') {
+ priority = 100;
+ }
+ else if (*p == 's' || *p == 'S') {
+ priority = 1;
+ }
+ else {
+ msg_info ("master/slave mode is turned on, and %c character is invalid", *p);
+ priority = 0;
+ }
+ }
}
else {
priority = 0;