Skip to content

Commit

Permalink
lib-smtp: smtp-server-recipient - Manage "finished" status of the rec…
Browse files Browse the repository at this point in the history
…ipient.
  • Loading branch information
stephanbosch committed Mar 2, 2019
1 parent d01002d commit a54bafe
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/lib-smtp/smtp-server-cmd-rcpt.c
Expand Up @@ -61,6 +61,8 @@ cmd_rcpt_completed(struct smtp_server_cmd_ctx *cmd,
/* failure; substitute our own error if predictable */
if (smtp_server_command_reply_is_forwarded(command))
(void)cmd_rcpt_check_state(cmd);

smtp_server_recipient_denied(rcpt);
return;
}

Expand Down
5 changes: 5 additions & 0 deletions src/lib-smtp/smtp-server-private.h
Expand Up @@ -373,9 +373,14 @@ bool smtp_server_recipient_unref(struct smtp_server_recipient **_rcpt);
void smtp_server_recipient_destroy(struct smtp_server_recipient **_rcpt);

bool smtp_server_recipient_approved(struct smtp_server_recipient **_rcpt);
void smtp_server_recipient_denied(struct smtp_server_recipient *rcpt);

void smtp_server_recipient_last_data(struct smtp_server_recipient *rcpt,
struct smtp_server_cmd_ctx *cmd);

void smtp_server_recipient_reset(struct smtp_server_recipient *rcpt);
void smtp_server_recipient_finished(struct smtp_server_recipient *rcpt);

/*
* Transaction
*/
Expand Down
18 changes: 18 additions & 0 deletions src/lib-smtp/smtp-server-recipient.c
Expand Up @@ -104,13 +104,31 @@ bool smtp_server_recipient_approved(struct smtp_server_recipient **_rcpt)
_rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED);
}

void smtp_server_recipient_denied(struct smtp_server_recipient *rcpt)
{
i_assert(!rcpt->finished);
rcpt->finished = TRUE;
}

void smtp_server_recipient_last_data(struct smtp_server_recipient *rcpt,
struct smtp_server_cmd_ctx *cmd)
{
i_assert(rcpt->cmd == NULL);
rcpt->cmd = cmd;
}

void smtp_server_recipient_reset(struct smtp_server_recipient *rcpt)
{
i_assert(!rcpt->finished);
rcpt->finished = TRUE;
}

void smtp_server_recipient_finished(struct smtp_server_recipient *rcpt)
{
i_assert(!rcpt->finished);
rcpt->finished = TRUE;
}

#undef smtp_server_recipient_add_hook
void smtp_server_recipient_add_hook(struct smtp_server_recipient *rcpt,
enum smtp_server_recipient_hook_type type,
Expand Down
22 changes: 22 additions & 0 deletions src/lib-smtp/smtp-server-transaction.c
Expand Up @@ -149,14 +149,36 @@ void smtp_server_transaction_last_data(struct smtp_server_transaction *trans,

void smtp_server_transaction_reset(struct smtp_server_transaction *trans)
{
struct smtp_server_recipient *const *rcpts = NULL;
unsigned int rcpts_count, i;

i_assert(!trans->finished);
trans->finished = TRUE;

rcpts_count = 0;
if (array_is_created(&trans->rcpt_to))
rcpts = array_get(&trans->rcpt_to, &rcpts_count);

for (i = 0; i < rcpts_count; i++)
smtp_server_recipient_reset(rcpts[i]);
}

void smtp_server_transaction_finished(struct smtp_server_transaction *trans)
{
struct smtp_server_connection *conn = trans->conn;
struct smtp_server_recipient *const *rcpts = NULL;
unsigned int rcpts_count, i;

i_assert(conn->state.pending_rcpt_cmds == 0);
i_assert(!trans->finished);
trans->finished = TRUE;

rcpts_count = 0;
if (array_is_created(&trans->rcpt_to))
rcpts = array_get(&trans->rcpt_to, &rcpts_count);

for (i = 0; i < rcpts_count; i++)
smtp_server_recipient_finished(rcpts[i]);
}

void smtp_server_transaction_fail_data(struct smtp_server_transaction *trans,
Expand Down
2 changes: 2 additions & 0 deletions src/lib-smtp/smtp-server.h
Expand Up @@ -78,6 +78,8 @@ struct smtp_server_recipient {
unsigned int index;

void *context;

bool finished:1;
};
ARRAY_DEFINE_TYPE(smtp_server_recipient, struct smtp_server_recipient *);

Expand Down

0 comments on commit a54bafe

Please sign in to comment.