}
if (cond & G_IO_HUP) {
- transport->callbacks->disconnect(transport);
+ irc_transport_disconnect(transport);
return FALSE;
}
}
if (status == G_IO_STATUS_EOF) {
- transport->callbacks->disconnect(transport);
+ irc_transport_disconnect(transport);
return FALSE;
}
void irc_transport_disconnect(struct irc_transport *transport)
{
- g_assert(transport->incoming != NULL);
+ if (transport->incoming == NULL)
+ return; /* We're already disconnected */
- g_io_channel_shutdown(transport->incoming, FALSE, NULL);
+ g_io_channel_unref(transport->incoming);
g_source_remove(transport->incoming_id);
if (transport->outgoing_id)
g_source_remove(transport->outgoing_id);
+
+ transport->incoming = NULL;
+
+ transport->callbacks->disconnect(transport);
}
static void free_pending_line(void *_line, void *userdata)
void free_irc_transport(struct irc_transport *transport)
{
+ /* Should already be disconnected */
+ g_assert(transport->incoming == NULL);
g_free(transport->charset);
- g_io_channel_unref(transport->incoming);
-
- transport->incoming = NULL;
if (transport->outgoing_iconv != (GIConv)-1)
g_iconv_close(transport->outgoing_iconv);
if (transport->incoming_iconv != (GIConv)-1)
g_iconv_close(transport->incoming_iconv);
+ g_assert(transport->pending_lines != NULL);
g_queue_foreach(transport->pending_lines, free_pending_line, NULL);
g_queue_free(transport->pending_lines);
g_assert(ioc == transport->incoming);
+ g_assert(transport->pending_lines != NULL);
+
while (!g_queue_is_empty(transport->pending_lines)) {
GIOStatus status;
GError *error = NULL;
} else if (status == G_IO_STATUS_EOF) {
transport->outgoing_id = 0;
- transport->callbacks->disconnect(transport);
+ irc_transport_disconnect(transport);
free_line(l);
transport_send_queue, transport);
g_queue_push_tail(transport->pending_lines, linedup(l));
} else if (status == G_IO_STATUS_EOF) {
- transport->callbacks->disconnect(transport);
+ irc_transport_disconnect(transport);
return FALSE;
} else if (status == G_IO_STATUS_ERROR) {
transport->callbacks->log(transport, l, error);