]> source.dussan.org Git - rspamd.git/commitdiff
* Add ability to handle multiply recipients
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Sat, 25 Oct 2008 01:06:16 +0000 (05:06 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Sat, 25 Oct 2008 01:06:16 +0000 (05:06 +0400)
* Reflect changes to perl library

main.h
perl/rspamd.xs
protocol.c
worker.c

diff --git a/main.h b/main.h
index 2da935546f21298a4541de42046337b0386fbf74..3c519463f964d279dcc06c53411d74b6a4bcaeb9 100644 (file)
--- a/main.h
+++ b/main.h
@@ -135,7 +135,7 @@ struct worker_task {
        int sock;
        char *helo;
        char *from;
-       char *rcpt;
+       GList *rcpt;
        unsigned int nrcpt;
        struct in_addr from_addr;
        f_str_buf_t *msg;
index 60c670f6c47595974ed2bcaa0e8c09b85111a872..b22dc849ff04b272de474539361025e3a89e6066 100644 (file)
@@ -101,6 +101,33 @@ get_part (r, num)
        OUTPUT:
        RETVAL
 
+void
+ip (r)
+       CODE:
+       dXSTARG;
+       struct worker_task *r;
+       char *ip_str;
+
+       perl_set_session (r);
+       sv_upgrade(TARG, SVt_PV);
+       ip_str = inet_ntoa (r->from_addr);
+       sv_setpv(TARG, ip_str);
+       ST(0) = TARG;
+
+void
+from (r)
+       CODE:
+       dXSTARG;
+       struct worker_task *r;
+
+       perl_set_session (r);
+       if (r->from == NULL) {
+               XSRETURN_UNDEF;
+       }
+       sv_upgrade(TARG, SVt_PV);
+       sv_setpv(TARG, r->from);
+       ST(0) = TARG;
+
 void
 save_point (r)
     CODE:
index 94cb2f824d84ef1a11f1e1697f33a4c0404c71c7..b259f6cd96e630841e153effc0374501c0162ca5 100644 (file)
@@ -153,7 +153,7 @@ parse_command (struct worker_task *task, char *line)
 static int
 parse_header (struct worker_task *task, char *line)
 {
-       char *headern, *err;
+       char *headern, *err, *tmp;
 
        /* Check end of headers */
        if (*line == '\0') {
@@ -226,7 +226,8 @@ parse_header (struct worker_task *task, char *line)
                case 'R':
                        /* rcpt */
                        if (strncasecmp (headern, RCPT_HEADER, sizeof (RCPT_HEADER) - 1) == 0) {
-                               task->rcpt = memory_pool_strdup (task->task_pool, line);
+                               tmp = memory_pool_strdup (task->task_pool, line);
+                               task->rcpt = g_list_prepend (task->rcpt, tmp);
                        }
                        else {
                                msg_info ("parse_header: wrong header: %s", headern);
index e72e3fd0e8d0fdc2c081ad6d550c2074df8656d1..efa95c10542a8d472878c33c58319b9ec3540d8a 100644 (file)
--- a/worker.c
+++ b/worker.c
@@ -64,6 +64,16 @@ sigusr_handler (int fd, short what, void *arg)
        return;
 }
 
+static void
+rcpt_destruct (void *pointer)
+{
+       struct worker_task *task = (struct worker_task *)pointer;
+
+       if (task->rcpt) {
+               g_list_free (task->rcpt);
+       }
+}
+
 static void
 free_task (struct worker_task *task)
 {
@@ -307,6 +317,8 @@ accept_socket (int fd, short what, void *arg)
 #else
        new_task->task_pool = memory_pool_new (TASK_POOL_SIZE);
 #endif
+       /* Add destructor for recipients list (it would be better to use anonymous function here */
+       memory_pool_add_destructor (new_task->task_pool, (pool_destruct_func)rcpt_destruct, new_task);
 
        /* Read event */
        new_task->bev = bufferevent_new (nfd, read_socket, write_socket, err_socket, (void *)new_task);