i_assert(client->state.backend != NULL);
submission_backend_trans_start(client->state.backend, trans);
- array_foreach(&client->rcpt_backends, bkp) {
+ array_foreach(&client->pending_backends, bkp) {
struct submission_backend *backend = *bkp;
+
submission_backend_trans_start(backend, trans);
}
+ array_clear(&client->pending_backends);
}
void submission_backends_trans_free(struct client *client,
struct submission_backend *backend = *bkp;
submission_backend_trans_free(backend, trans);
}
+ array_clear(&client->pending_backends);
array_clear(&client->rcpt_backends);
client->state.backend = NULL;
}
return backend->v.cmd_mail(backend, cmd, data);
}
+static void
+submission_backend_add_pending(struct submission_backend *backend)
+{
+ struct client *client = backend->client;
+
+ struct submission_backend *const *bkp;
+
+ array_foreach(&client->pending_backends, bkp) {
+ if (backend == *bkp)
+ return;
+ }
+
+ array_append(&client->pending_backends, &backend, 1);
+}
+
int submission_backend_cmd_rcpt(struct submission_backend *backend,
struct smtp_server_cmd_ctx *cmd,
struct submission_recipient *srcpt)
trans = smtp_server_connection_get_transaction(cmd->conn);
if (trans != NULL)
submission_backend_trans_start(srcpt->backend, trans);
+ else
+ submission_backend_add_pending(srcpt->backend);
return backend->v.cmd_rcpt(backend, cmd, srcpt);
}
client->set = set;
client->session_id = p_strdup(pool, session_id);
+ i_array_init(&client->pending_backends, 4);
i_array_init(&client->rcpt_to, 8);
i_array_init(&client->rcpt_backends, 8);
client_disconnect(client, prefix, reason);
submission_backends_destroy_all(client);
+ array_free(&client->pending_backends);
array_free(&client->rcpt_to);
array_free(&client->rcpt_backends);