#include <unistd.h>
#include <libgen.h>
-static void connection_idle_timeout(struct connection *conn)
+static void connection_closed(struct connection *conn,
+ enum connection_disconnect_reason reason)
{
- conn->disconnect_reason = CONNECTION_DISCONNECT_IDLE_TIMEOUT;
+ conn->disconnect_reason = reason;
conn->v.destroy(conn);
}
+static void connection_idle_timeout(struct connection *conn)
+{
+ connection_closed(conn, CONNECTION_DISCONNECT_IDLE_TIMEOUT);
+}
+
static void connection_connect_timeout(struct connection *conn)
{
- conn->disconnect_reason = CONNECTION_DISCONNECT_CONNECT_TIMEOUT;
- conn->v.destroy(conn);
+ connection_closed(conn, CONNECTION_DISCONNECT_CONNECT_TIMEOUT);
}
void connection_input_default(struct connection *conn)
if (!conn->handshake_received &&
conn->v.handshake != NULL) {
if ((ret = conn->v.handshake(conn)) < 0) {
- conn->disconnect_reason = CONNECTION_DISCONNECT_HANDSHAKE_FAILED;
- conn->v.destroy(conn);
+ connection_closed(conn, CONNECTION_DISCONNECT_HANDSHAKE_FAILED);
return;
} else if (ret == 0) {
return;
o_stream_unref(&output);
}
if (ret < 0 && !input->closed) {
+ enum connection_disconnect_reason reason;
if (conn->handshake_received)
- conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
+ reason = CONNECTION_DISCONNECT_DEINIT;
else
- conn->disconnect_reason = CONNECTION_DISCONNECT_HANDSHAKE_FAILED;
- conn->v.destroy(conn);
+ reason = CONNECTION_DISCONNECT_HANDSHAKE_FAILED;
+ connection_closed(conn, reason);
}
i_stream_unref(&input);
}
if (conn->v.client_connected != NULL)
conn->v.client_connected(conn, success);
if (!success) {
- conn->disconnect_reason =
- CONNECTION_DISCONNECT_CONN_CLOSED;
- conn->v.destroy(conn);
+ connection_closed(conn, CONNECTION_DISCONNECT_CONN_CLOSED);
}
}
/* buffer full */
switch (conn->list->set.input_full_behavior) {
case CONNECTION_BEHAVIOR_DESTROY:
- conn->disconnect_reason =
- CONNECTION_DISCONNECT_BUFFER_FULL;
- conn->v.destroy(conn);
+ connection_closed(conn, CONNECTION_DISCONNECT_BUFFER_FULL);
return -1;
case CONNECTION_BEHAVIOR_ALLOW:
return -2;
i_unreached();
case -1:
/* disconnected */
- conn->disconnect_reason =
- CONNECTION_DISCONNECT_CONN_CLOSED;
- conn->v.destroy(conn);
+ connection_closed(conn, CONNECTION_DISCONNECT_CONN_CLOSED);
return -1;
case 0:
/* nothing new read */
while (list->connections != NULL) {
conn = list->connections;
- conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
- conn->v.destroy(conn);
+ connection_closed(conn, CONNECTION_DISCONNECT_DEINIT);
i_assert(conn != list->connections);
}
i_free(list);