return 0;
}
-static void imapc_connection_connected(struct imapc_connection *conn)
+static int imapc_connection_connected(struct imapc_connection *conn)
{
const struct ip_addr *ip = &conn->ips[conn->prev_connect_idx];
struct ip_addr local_ip;
in_port_t local_port;
int err;
- io_remove(&conn->io);
+
+ i_assert(conn->io == NULL);
err = net_geterror(conn->fd);
if (err != 0) {
"connect(%s, %u) failed: %s",
net_ip2addr(ip), conn->client->set.port,
strerror(err)), conn->client->set.connect_retry_interval_msecs, TRUE);
- return;
+ return -1;
}
if (net_getsockname(conn->fd, &local_ip, &local_port) < 0)
local_port = 0;
net_ip2addr(ip), conn->client->set.port,
net_ip2addr(&local_ip), local_port);
conn->io = io_add(conn->fd, IO_READ, imapc_connection_input, conn);
+ o_stream_set_flush_callback(conn->output, imapc_connection_output,
+ conn);
if (conn->client->set.ssl_mode == IMAPC_CLIENT_SSL_MODE_IMMEDIATE) {
if (imapc_connection_ssl_init(conn) < 0)
imapc_connection_disconnect(conn);
}
+ return imapc_connection_output(conn);
}
static void imapc_connection_timeout(struct imapc_connection *conn)
&conn->input, &conn->output);
}
- o_stream_set_flush_callback(conn->output, imapc_connection_output,
+ o_stream_set_flush_pending(conn->output, TRUE);
+ o_stream_set_flush_callback(conn->output, imapc_connection_connected,
conn);
- conn->io = io_add(fd, IO_WRITE, imapc_connection_connected, conn);
conn->parser = imap_parser_create(conn->input, NULL,
conn->client->set.max_line_length);
conn->to = timeout_add(conn->client->set.connect_timeout_msecs,