diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-07-02 15:51:16 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-07-02 15:51:16 +0400 |
commit | 59ecc76a83abd9d57e2c808f34d4d27568eeed33 (patch) | |
tree | 5a670c41f2ddc3766c6c2256a0128988ce54695e /src/plugins | |
parent | 3123a6a1d6f18c31801b30e523aec9553be31177 (diff) | |
download | rspamd-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.c | 2 | ||||
-rw-r--r-- | src/plugins/surbl.c | 27 |
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); |