static ARRAY_DEFINE(auth_client_connections, struct auth_client_connection *);
+static void auth_client_disconnected(struct auth_client_connection **_conn);
static void auth_client_connection_unref(struct auth_client_connection **_conn);
static void auth_client_input(struct auth_client_connection *conn);
see if the old connection is still there. */
i_assert(old != conn);
if (i_stream_read(old->input) == -1) {
- auth_client_connection_destroy(&old);
+ auth_client_disconnected(&old);
old = NULL;
}
}
static int auth_client_output(struct auth_client_connection *conn)
{
if (o_stream_flush(conn->output) < 0) {
- auth_client_connection_destroy(&conn);
+ auth_client_disconnected(&conn);
return 1;
}
return;
case -1:
/* disconnected */
- auth_client_connection_destroy(&conn);
+ auth_client_disconnected(&conn);
return;
case -2:
/* buffer full */
str_append(str, "\nDONE\n");
if (o_stream_send(conn->output, str_data(str), str_len(str)) < 0)
- auth_client_connection_destroy(&conn);
+ auth_client_disconnected(&conn);
return conn;
}
auth_client_connection_unref(&conn);
}
+static void auth_client_disconnected(struct auth_client_connection **_conn)
+{
+ struct auth_client_connection *conn = *_conn;
+ unsigned int request_count;
+ int err;
+
+ *_conn = NULL;
+
+ if (conn->input->stream_errno != 0)
+ err = conn->input->stream_errno;
+ else if (conn->output->stream_errno != 0)
+ err = conn->output->stream_errno;
+ else
+ err = 0;
+
+ request_count = conn->request_handler == NULL ? 0 :
+ auth_request_handler_get_request_count(conn->request_handler);
+ if (request_count > 0) {
+ i_warning("auth client %u disconnected with %u "
+ "pending requests: %s", conn->pid, request_count,
+ err == 0 ? "EOF" : strerror(err));
+ }
+ auth_client_connection_destroy(&conn);
+}
+
static void auth_client_connection_unref(struct auth_client_connection **_conn)
{
struct auth_client_connection *conn = *_conn;
const void *reply, size_t reply_size);
void auth_request_handler_reply_continue(struct auth_request *request,
const void *reply, size_t reply_size);
+unsigned int
+auth_request_handler_get_request_count(struct auth_request_handler *handler);
bool auth_request_handler_master_request(struct auth_request_handler *handler,
struct auth_master_connection *master,
unsigned int id,