From 9a7ba3e09a318d9f1ef66b41377b4f66029915db Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 25 Oct 2008 05:06:16 +0400 Subject: [PATCH] * Add ability to handle multiply recipients * Reflect changes to perl library --- main.h | 2 +- perl/rspamd.xs | 27 +++++++++++++++++++++++++++ protocol.c | 5 +++-- worker.c | 12 ++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/main.h b/main.h index 2da935546..3c519463f 100644 --- 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; diff --git a/perl/rspamd.xs b/perl/rspamd.xs index 60c670f6c..b22dc849f 100644 --- a/perl/rspamd.xs +++ b/perl/rspamd.xs @@ -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: diff --git a/protocol.c b/protocol.c index 94cb2f824..b259f6cd9 100644 --- a/protocol.c +++ b/protocol.c @@ -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); diff --git a/worker.c b/worker.c index e72e3fd0e..efa95c105 100644 --- 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); -- 2.39.5