aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2009-07-02 15:51:16 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2009-07-02 15:51:16 +0400
commit59ecc76a83abd9d57e2c808f34d4d27568eeed33 (patch)
tree5a670c41f2ddc3766c6c2256a0128988ce54695e /src/plugins
parent3123a6a1d6f18c31801b30e523aec9553be31177 (diff)
downloadrspamd-59ecc76a83abd9d57e2c808f34d4d27568eeed33.tar.gz
rspamd-59ecc76a83abd9d57e2c808f34d4d27568eeed33.zip
* Add urls output to urls command
* Improve performance of dispatcher by avoiding double allocating and copying of dynamic buffers
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/emails.c2
-rw-r--r--src/plugins/surbl.c27
2 files changed, 21 insertions, 8 deletions
diff --git a/src/plugins/emails.c b/src/plugins/emails.c
index 67a641ab5..0b7e35d84 100644
--- a/src/plugins/emails.c
+++ b/src/plugins/emails.c
@@ -192,7 +192,7 @@ emails_command_handler (struct worker_task *task)
outbuf[r++] = '\r'; outbuf[r++] = '\n';
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, FALSE);
msg_info ("process_message: msg ok, id: <%s>, %d emails extracted", task->message_id, num);
return 0;
diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c
index 093b67d88..a7ff5bb7a 100644
--- a/src/plugins/surbl.c
+++ b/src/plugins/surbl.c
@@ -780,8 +780,8 @@ static int
urls_command_handler (struct worker_task *task)
{
GList *cur;
- char outbuf[16384], *urlstr;
- int r, num = 0;
+ char *outbuf, *urlstr;
+ int r, num = 0, buflen;
struct uri *url;
GError *err = NULL;
GTree *url_tree;
@@ -790,9 +790,22 @@ urls_command_handler (struct worker_task *task)
url_tree = g_tree_new ((GCompareFunc)g_ascii_strcasecmp);
- r = snprintf (outbuf, sizeof (outbuf), "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
+ /* First calculate buffer length */
+ cur = g_list_first (task->urls);
+ buflen = 0;
+ while (cur) {
+ url = cur->data;
+ buflen += strlen (struri (url)) + url->hostlen + sizeof (" <\"\">, ") - 1;
+ cur = g_list_next (cur);
+ }
+
+ buflen += sizeof (RSPAMD_REPLY_BANNER " 0 OK" CRLF CRLF);
+
+ outbuf = memory_pool_alloc (task->task_pool, buflen * sizeof (char));
+
+ r = snprintf (outbuf, buflen, "%s 0 %s" CRLF, (task->proto == SPAMC_PROTO) ? SPAMD_REPLY_BANNER : RSPAMD_REPLY_BANNER, "OK");
- r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "URLs: ");
+ r += snprintf (outbuf + r, buflen - r - 2, "URLs: ");
cur = g_list_first (task->urls);
@@ -805,10 +818,10 @@ urls_command_handler (struct worker_task *task)
f.len = url->hostlen;
if ((urlstr = format_surbl_request (task->task_pool, &f, NULL, &host_end, FALSE, &err)) != NULL) {
if (g_list_next (cur) != NULL) {
- r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "%s, ", (char *)urlstr);
+ r += snprintf (outbuf + r, buflen - r - 2, "%s <\"%s\">, ", (char *)urlstr, struri (url));
}
else {
- r += snprintf (outbuf + r, sizeof (outbuf) - r - 2, "%s", (char *)urlstr);
+ r += snprintf (outbuf + r, buflen - r - 2, "%s <\"%s\">", (char *)urlstr, struri (url));
}
}
}
@@ -817,7 +830,7 @@ urls_command_handler (struct worker_task *task)
outbuf[r++] = '\r'; outbuf[r++] = '\n';
- rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE);
+ rspamd_dispatcher_write (task->dispatcher, outbuf, r, FALSE, TRUE);
msg_info ("process_message: msg ok, id: <%s>, %d urls extracted", task->message_id, num);
g_tree_destroy (url_tree);