aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2010-07-05 16:57:55 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2010-07-05 16:57:55 +0400
commitbae637bec8e9c23668cbacbb9f5a1bd829cae487 (patch)
treedabce6274bee145caca081a5dba6523783b5b749 /src
parent10a3c7a278b569bc978614f3b6e78d29f10a87e0 (diff)
downloadrspamd-bae637bec8e9c23668cbacbb9f5a1bd829cae487.tar.gz
rspamd-bae637bec8e9c23668cbacbb9f5a1bd829cae487.zip
* Fix stupid error with surbl module reconfig (another one, blame me)
* Do not show duplicate urls in url header
Diffstat (limited to 'src')
-rw-r--r--src/main.c2
-rw-r--r--src/map.c19
-rw-r--r--src/map.h1
-rw-r--r--src/plugins/surbl.c2
-rw-r--r--src/protocol.c78
5 files changed, 71 insertions, 31 deletions
diff --git a/src/main.c b/src/main.c
index e75b46899..da8b87e64 100644
--- a/src/main.c
+++ b/src/main.c
@@ -28,6 +28,7 @@
#include "util.h"
#include "lmtp.h"
#include "smtp.h"
+#include "map.h"
#include "fuzzy_storage.h"
#include "cfg_xml.h"
@@ -951,6 +952,7 @@ main (int argc, char **argv, char **env)
msg_info ("rspamd " RVERSION " is restarting");
g_hash_table_foreach (rspamd->workers, kill_old_workers, NULL);
+ remove_all_maps ();
reread_config (rspamd);
spawn_workers (rspamd);
diff --git a/src/map.c b/src/map.c
index b864c6a42..12b833ae0 100644
--- a/src/map.c
+++ b/src/map.c
@@ -831,3 +831,22 @@ start_map_watch (void)
cur = g_list_next (cur);
}
}
+
+void
+remove_all_maps (void)
+{
+ GList *cur = maps;
+ struct rspamd_map *map;
+
+ /* First of all do synced read of data */
+ while (cur) {
+ map = cur->data;
+ event_del (&map->ev);
+ cur = g_list_next (cur);
+ }
+ g_list_free (maps);
+ maps = NULL;
+ memory_pool_delete (map_pool);
+ map_pool = NULL;
+}
+
diff --git a/src/map.h b/src/map.h
index c9093d68c..fe3a2b36b 100644
--- a/src/map.h
+++ b/src/map.h
@@ -50,6 +50,7 @@ struct rspamd_map {
gboolean add_map (const char *map_line, map_cb_t read_callback, map_fin_cb_t fin_callback, void **user_data);
void start_map_watch (void);
+void remove_all_maps (void);
typedef void (*insert_func) (gpointer st, gconstpointer key, gpointer value);
diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c
index ee8622f12..8c9d2ccb0 100644
--- a/src/plugins/surbl.c
+++ b/src/plugins/surbl.c
@@ -100,7 +100,7 @@ static u_char *
read_exceptions_list (memory_pool_t * pool, u_char * chunk, size_t len, struct map_cb_data *data)
{
if (data->cur_data == NULL) {
- data->cur_data = memory_pool_alloc (pool, sizeof (GHashTable *) * MAX_LEVELS);
+ data->cur_data = memory_pool_alloc0 (pool, sizeof (GHashTable *) * MAX_LEVELS);
}
return abstract_parse_list (pool, chunk, len, data, (insert_func) exception_insert);
}
diff --git a/src/protocol.c b/src/protocol.c
index 276b63a9e..98d68bf12 100644
--- a/src/protocol.c
+++ b/src/protocol.c
@@ -439,6 +439,19 @@ write_hashes_to_log (struct worker_task *task, char *logbuf, int offset, int siz
}
}
+static gint
+compare_url_func (gconstpointer a, gconstpointer b)
+{
+ const struct uri *u1 = a, *u2 = b;
+
+ if (u1->hostlen != u2->hostlen) {
+ return u1->hostlen - u2->hostlen;
+ }
+ else {
+ return memcmp (u1->host, u2->host, u1->hostlen);
+ }
+}
+
static gboolean
show_url_header (struct worker_task *task)
{
@@ -447,8 +460,10 @@ show_url_header (struct worker_task *task)
struct uri *url;
GList *cur;
f_str_t host;
+ GTree *url_tree;
r = rspamd_snprintf (outbuf, sizeof (outbuf), "Urls: ");
+ url_tree = g_tree_new (compare_url_func);
cur = task->urls;
while (cur) {
url = cur->data;
@@ -456,37 +471,40 @@ show_url_header (struct worker_task *task)
/* Write this url to log as well */
msg_info ("url found: <%s>, score: [%.2f / %.2f]", struri (url), default_score, default_required_score);
}
- host.begin = url->host;
- host.len = url->hostlen;
- /* Skip long hosts to avoid protocol coollisions */
- if (host.len > OUTBUFSIZ) {
- cur = g_list_next (cur);
- continue;
- }
- /* Do header folding */
- if (host.len + r >= OUTBUFSIZ - 3) {
- outbuf[r++] = '\r';
- outbuf[r++] = '\n';
- outbuf[r] = ' ';
- if (! rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE)) {
- return FALSE;
+ if (g_tree_lookup (url_tree, url) == NULL) {
+ g_tree_insert (url_tree, url, url);
+ host.begin = url->host;
+ host.len = url->hostlen;
+ /* Skip long hosts to avoid protocol coollisions */
+ if (host.len > OUTBUFSIZ) {
+ cur = g_list_next (cur);
+ continue;
+ }
+ /* Do header folding */
+ if (host.len + r >= OUTBUFSIZ - 3) {
+ outbuf[r++] = '\r';
+ outbuf[r++] = '\n';
+ outbuf[r] = ' ';
+ if (! rspamd_dispatcher_write (task->dispatcher, outbuf, r, TRUE, FALSE)) {
+ return FALSE;
+ }
+ r = 0;
+ }
+ /* Write url host to buf */
+ if (g_list_next (cur) != NULL) {
+ c = *(host.begin + host.len);
+ *(host.begin + host.len) = '\0';
+ debug_task ("write url: %s", host.begin);
+ r += rspamd_snprintf (outbuf + r, sizeof (outbuf) - r, "%s, ", host.begin);
+ *(host.begin + host.len) = c;
+ }
+ else {
+ c = *(host.begin + host.len);
+ *(host.begin + host.len) = '\0';
+ debug_task ("write url: %s", host.begin);
+ r += rspamd_snprintf (outbuf + r, sizeof (outbuf) - r, "%s" CRLF, host.begin);
+ *(host.begin + host.len) = c;
}
- r = 0;
- }
- /* Write url host to buf */
- if (g_list_next (cur) != NULL) {
- c = *(host.begin + host.len);
- *(host.begin + host.len) = '\0';
- debug_task ("write url: %s", host.begin);
- r += rspamd_snprintf (outbuf + r, sizeof (outbuf) - r, "%s, ", host.begin);
- *(host.begin + host.len) = c;
- }
- else {
- c = *(host.begin + host.len);
- *(host.begin + host.len) = '\0';
- debug_task ("write url: %s", host.begin);
- r += rspamd_snprintf (outbuf + r, sizeof (outbuf) - r, "%s" CRLF, host.begin);
- *(host.begin + host.len) = c;
}
cur = g_list_next (cur);
}