return conn->list->v.input_args(conn, args);
}
+void connection_input_halt(struct connection *conn)
+{
+ if (conn->io != NULL)
+ io_remove(&conn->io);
+}
+
+void connection_input_resume(struct connection *conn)
+{
+ const struct connection_settings *set = &conn->list->set;
+
+ if (conn->io != NULL)
+ return;
+ if (conn->from_streams || set->input_max_size != 0) {
+ conn->io = io_add_istream(conn->input,
+ *conn->list->v.input, conn);
+ } else {
+ conn->io = io_add(conn->fd_in, IO_READ,
+ *conn->list->v.input, conn);
+ }
+}
+
static void connection_init_streams(struct connection *conn)
{
const struct connection_settings *set = &conn->list->set;
conn->input = i_stream_create_fd(conn->fd_in,
set->input_max_size, FALSE);
i_stream_set_name(conn->input, conn->name);
- conn->io = io_add_istream(conn->input, *conn->list->v.input, conn);
- } else {
- conn->io = io_add(conn->fd_in, IO_READ, *conn->list->v.input, conn);
}
if (set->output_max_size != 0) {
if (conn->unix_socket)
o_stream_set_no_error_handling(conn->output, TRUE);
o_stream_set_name(conn->output, conn->name);
}
+ connection_input_resume(conn);
if (set->input_idle_timeout_secs != 0) {
conn->to = timeout_add(set->input_idle_timeout_secs*1000,
connection_idle_timeout, conn);
const struct connection_settings *set = &conn->list->set;
if (set->input_max_size != 0 && conn->io != NULL) {
- io_remove(&conn->io);
- conn->io = io_add_istream(conn->input, *conn->list->v.input, conn);
+ connection_input_halt(conn);
+ connection_input_resume(conn);
}
}
conn->list = list;
conn->name = i_strdup(name);
+ conn->from_streams = TRUE;
conn->fd_in = i_stream_get_fd(input);
conn->fd_out = o_stream_get_fd(output);
o_stream_set_no_error_handling(conn->output, TRUE);
o_stream_set_name(conn->output, conn->name);
- conn->io = io_add_istream(conn->input, *list->v.input, conn);
-
DLLIST_PREPEND(&list->connections, conn);
list->connections_count++;
+ connection_input_resume(conn);
if (list->v.client_connected != NULL)
list->v.client_connected(conn, TRUE);
unsigned int version_received:1;
unsigned int unix_socket:1;
+ unsigned int from_streams:1;
};
struct connection_list {
void connection_disconnect(struct connection *conn);
void connection_deinit(struct connection *conn);
+void connection_input_halt(struct connection *conn);
+void connection_input_resume(struct connection *conn);
void connection_streams_changed(struct connection *conn);
/* Returns -1 = disconnected, 0 = nothing new, 1 = something new.