This is non-standard.
/* this command is next to send a reply */
i_assert(data_cmd != NULL);
+ i_assert(trans != NULL);
i_assert(conn->state.pending_mail_cmds == 0 &&
conn->state.pending_rcpt_cmds == 0);
i_assert(trans != NULL);
/* LMTP 'DATA' and 'BDAT LAST' commands need to send more than
one reply per recipient */
- if (conn->set.protocol == SMTP_PROTOCOL_LMTP) {
+ if (HAS_ALL_BITS(trans->flags,
+ SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT)) {
smtp_server_command_set_reply_count(command,
array_count(&trans->rcpt_to));
}
/* success */
conn->state.trans = smtp_server_transaction_create(conn,
- data->path, &data->params, &data->timestamp);
+ data->flags, data->path, &data->params, &data->timestamp);
if (conn->callbacks != NULL &&
conn->callbacks->conn_trans_start != NULL) {
mail_data = p_new(cmd->pool, struct smtp_server_cmd_mail, 1);
+ if (conn->set.protocol == SMTP_PROTOCOL_LMTP)
+ mail_data->flags |= SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT;
+
/* [SP Mail-parameters] */
if (array_is_created(&conn->mail_param_extensions))
param_extensions = array_idx(&conn->mail_param_extensions, 0);
struct smtp_server_transaction *
smtp_server_transaction_create(struct smtp_server_connection *conn,
- const struct smtp_address *mail_from,
- const struct smtp_params_mail *params,
- const struct timeval *timestamp);
+ enum smtp_server_transaction_flags flags,
+ const struct smtp_address *mail_from,
+ const struct smtp_params_mail *params,
+ const struct timeval *timestamp);
void smtp_server_transaction_free(struct smtp_server_transaction **_trans);
void smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans,
struct smtp_server_transaction *
smtp_server_transaction_create(struct smtp_server_connection *conn,
+ enum smtp_server_transaction_flags flags,
const struct smtp_address *mail_from,
const struct smtp_params_mail *params,
const struct timeval *timestamp)
str_truncate(id, str_len(id)-2); /* drop trailing "==" */
trans->id = p_strdup(pool, str_c(id));
+ trans->flags = flags;
trans->mail_from = smtp_address_clone(trans->pool, mail_from);
smtp_params_mail_copy(pool, &trans->params, params);
trans->timestamp = *timestamp;
* Transaction
*/
+enum smtp_server_transaction_flags {
+ SMTP_SERVER_TRANSACTION_FLAG_REPLY_PER_RCPT = BIT(0),
+};
+
struct smtp_server_transaction {
pool_t pool;
struct smtp_server_connection *conn;
const char *id;
struct timeval timestamp;
+ enum smtp_server_transaction_flags flags;
+
struct smtp_address *mail_from;
struct smtp_params_mail params;
ARRAY_TYPE(smtp_server_recipient) rcpt_to;
struct smtp_params_mail params;
struct timeval timestamp;
+
+ enum smtp_server_transaction_flags flags;
};
struct smtp_server_cmd_auth {
if (!result) {
const char *reason = t_strdup_printf("%s%s", msg, detail);
-
+ smtp_client_transaction_destroy(&backend->trans);
submission_backend_fail(&backend->backend, cmd,
enh_code, reason);
return FALSE;