int sock;
char *helo;
char *from;
- char *rcpt;
+ GList *rcpt;
unsigned int nrcpt;
struct in_addr from_addr;
f_str_buf_t *msg;
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:
static int
parse_header (struct worker_task *task, char *line)
{
- char *headern, *err;
+ char *headern, *err, *tmp;
/* Check end of headers */
if (*line == '\0') {
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);
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)
{
#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);