smtp_server_connection_unref(&conn);
}
+bool smtp_server_connection_is_closed(struct smtp_server_connection *conn)
+{
+ return conn->closed;
+}
+
void smtp_server_connection_terminate(struct smtp_server_connection **_conn,
const char *enh_code, const char *reason)
{
void smtp_server_connection_close(struct smtp_server_connection **_conn,
const char *reason) ATTR_NULL(2);
+bool smtp_server_connection_is_closed(struct smtp_server_connection *conn);
void smtp_server_connection_terminate(struct smtp_server_connection **_conn,
const char *enh_code, const char *reason)
ATTR_NULL(3);
return 0;
}
+static void
+submission_client_disconnect(struct client *client, const char *reason)
+{
+ struct submission_client *subm_client =
+ container_of(client, struct submission_client, common);
+
+ /* If the smtp-server connection is already in its close cascade (i.e.
+ we're being called via its conn_disconnect callback), skip closing
+ it again. Doing so would null subm_client->conn and prevent the
+ conn_free callback from invoking client_destroy(). */
+ if (subm_client->conn != NULL &&
+ !smtp_server_connection_is_closed(subm_client->conn))
+ smtp_server_connection_close(&subm_client->conn, reason);
+}
+
static void submission_client_destroy(struct client *client)
{
struct submission_client *subm_client =
static struct client_vfuncs submission_client_vfuncs = {
.alloc = submission_client_alloc,
.create = submission_client_create,
+ .disconnect = submission_client_disconnect,
.destroy = submission_client_destroy,
.reload_config = submission_client_reload_config,
.notify_auth_ready = submission_client_notify_auth_ready,