};
static struct server_connection *printing_conn = NULL;
+static ARRAY(struct doveadm_server *) print_pending_servers = ARRAY_INIT;
static void server_connection_input(struct server_connection *conn);
static bool server_connection_input_one(struct server_connection *conn);
-static void print_connection_released(void)
+static void server_set_print_pending(struct doveadm_server *server)
+{
+ struct doveadm_server *const *serverp;
+
+ if (!array_is_created(&print_pending_servers))
+ i_array_init(&print_pending_servers, 16);
+ array_foreach(&print_pending_servers, serverp) {
+ if (*serverp == server)
+ return;
+ }
+ array_append(&print_pending_servers, &server, 1);
+}
+
+static void server_print_connection_released(struct doveadm_server *server)
{
- struct doveadm_server *server = printing_conn->server;
struct server_connection *const *conns;
unsigned int i, count;
- printing_conn = NULL;
-
conns = array_get(&server->connections, &count);
for (i = 0; i < count; i++) {
if (conns[i]->io != NULL)
}
}
+static void print_connection_released(void)
+{
+ struct doveadm_server *const *serverp;
+
+ printing_conn = NULL;
+ if (!array_is_created(&print_pending_servers))
+ return;
+
+ array_foreach(&print_pending_servers, serverp)
+ server_print_connection_released(*serverp);
+ array_free(&print_pending_servers);
+}
+
static int server_connection_send_cmd_input_more(struct server_connection *conn)
{
enum ostream_send_istream_result res;
} else {
/* someone else is printing. don't continue until it
goes away */
+ server_set_print_pending(conn->server);
io_remove(&conn->io);
return;
}