static void pop3c_client_disconnect(struct pop3c_client *client) { client->state = POP3C_CLIENT_STATE_DISCONNECTED; client->async_commands = 0; if (client->running) io_loop_stop(current_ioloop); if (client->dns_lookup != NULL) dns_lookup_abort(&client->dns_lookup); if (client->to != NULL) timeout_remove(&client->to); if (client->io != NULL) io_remove(&client->io); if (client->input != NULL) i_stream_destroy(&client->input); if (client->output != NULL) o_stream_destroy(&client->output); if (client->ssl_iostream != NULL) ssl_iostream_unref(&client->ssl_iostream); if (client->fd != -1) { if (close(client->fd) < 0) i_error("close(pop3c) failed: %m"); client->fd = -1; } client_login_callback(client, POP3C_COMMAND_STATE_DISCONNECTED, "Disconnected"); }
void lmtp_client_close(struct lmtp_client *client) { if (client->dns_lookup != NULL) dns_lookup_abort(&client->dns_lookup); if (client->to != NULL) timeout_remove(&client->to); if (client->io != NULL) io_remove(&client->io); if (client->input != NULL) i_stream_close(client->input); if (client->output != NULL) o_stream_close(client->output); if (client->fd != -1) { net_disconnect(client->fd); client->fd = -1; } if (client->data_input != NULL) i_stream_unref(&client->data_input); client->output_finished = TRUE; if (!client->finish_called) { client->finish_called = TRUE; client->finish_callback(client->finish_context); } }