return 1;
}
+static void smtp_client_command_payload_input(struct smtp_client_command *cmd)
+{
+ struct smtp_client_connection *conn = cmd->conn;
+
+ io_remove(&conn->io_cmd_payload);
+
+ smtp_client_connection_trigger_output(conn);
+}
+
static int
smtp_client_command_send_stream(struct smtp_client_command *cmd)
{
enum ostream_send_istream_result res;
int ret;
+ io_remove(&conn->io_cmd_payload);
+
if (cmd->stream_finished) {
if ((ret=smtp_client_command_finish_dot_stream(cmd)) <= 0)
return ret;
i_stream_unref(&cmd->stream);
return 1;
case OSTREAM_SEND_ISTREAM_RESULT_WAIT_INPUT:
+ /* input is blocking (client needs to act; disable timeout) */
+ conn->io_cmd_payload = io_add_istream(
+ stream, smtp_client_command_payload_input, cmd);
+ return 0;
case OSTREAM_SEND_ISTREAM_RESULT_WAIT_OUTPUT:
+ smtp_client_command_debug(cmd, "Partially sent payload");
i_assert(cmd->stream_size == 0 ||
stream->v_offset < cmd->stream_size);
return 0;
if (conn->dns_lookup != NULL)
dns_lookup_abort(&conn->dns_lookup);
+ io_remove(&conn->io_cmd_payload);
timeout_remove(&conn->to_connect);
timeout_remove(&conn->to_trans);
timeout_remove(&conn->to_commands);
{
struct smtp_client_transaction *trans;
+ if (conn->io_cmd_payload != NULL)
+ conn->io_cmd_payload = io_loop_move_io(&conn->io_cmd_payload);
if (conn->to_connect != NULL)
conn->to_connect = io_loop_move_timeout(&conn->to_connect);
if (conn->to_trans != NULL)
struct dns_lookup *dns_lookup;
struct dsasl_client *sasl_client;
struct timeout *to_connect, *to_trans, *to_commands;
+ struct io *io_cmd_payload;
struct istream *raw_input;
struct ostream *raw_output, *dot_output;