irc_sendf(cd->connection, (GIConv)-1, NULL, "PASS %s", password);
+ g_io_channel_flush(cd->connection, NULL);
+
/* FIXME: Check whether the client doesn't return anything */
return TRUE;
/* Only called after authentication */
irc_sendf(cd->connection, (GIConv)-1, NULL, "CONNECT %s %d", hostname, port);
+ g_io_channel_flush(cd->connection, NULL);
client_done(cl);
} else {
irc_sendf(pc->connection, pc->listener->iconv, NULL, ":%s %d %s :You are not registered",
get_my_hostname(), ERR_NOTREGISTERED, "*");
+ g_io_channel_flush(pc->connection, NULL);
}
if (cd->username != NULL && cd->password != NULL && cd->nick != NULL) {
irc_sendf(cd->connection, (GIConv)-1, NULL, "USER %s %s %s %s", cd->username,
cd->mode, cd->unused, cd->realname);
irc_sendf(cd->connection, (GIConv)-1, NULL, "NICK %s", cd->nick);
+ g_io_channel_flush(cd->connection, NULL);
client_done(pc);
return FALSE;
}
status = irc_send_line(s->connection.outgoing, s->connection.outgoing_iconv, l, &error);
- if (status == G_IO_STATUS_AGAIN)
+ if (status == G_IO_STATUS_AGAIN) {
+ free_line(l);
return TRUE;
+ }
g_queue_pop_head(s->connection.pending_lines);
return FALSE;
}
+
+ status = g_io_channel_flush(s->connection.outgoing, &error);
+
+ if (status == G_IO_STATUS_AGAIN) {
+ free_line(l);
+ return TRUE;
+ }
+
+ if (status != G_IO_STATUS_NORMAL) {
+ network_log(LOG_WARNING, s, "Error sending line '%s': %s",
+ l->args[0], error != NULL?error->message:"ERROR");
+ free_line(l);
+
+ return FALSE;
+ }
+
s->connection.last_line_sent = time(NULL);
free_line(l);
return FALSE;
}
+ status = g_io_channel_flush(s->connection.outgoing, &error);
+ if (status == G_IO_STATUS_AGAIN) {
+ s->connection.outgoing_id = g_io_add_watch(s->connection.outgoing, G_IO_OUT, server_send_queue, s);
+ } else if (status != G_IO_STATUS_NORMAL) {
+ network_log(LOG_WARNING, s, "Error sending line '%s': %s",
+ l->args[0], error != NULL?error->message:"ERROR");
+ return FALSE;
+ }
+
s->connection.last_line_sent = time(NULL);
return TRUE;
} else {
static gboolean transport_send_queue(GIOChannel *ioc, GIOCondition cond,
void *_transport)
{
+ gboolean ret = FALSE;
struct irc_transport *transport = _transport;
+ GIOStatus status;
g_assert(ioc == transport->incoming);
+ status = g_io_channel_flush(transport->incoming, NULL);
+ if (status == G_IO_STATUS_AGAIN)
+ ret = TRUE;
+
g_assert(transport->pending_lines != NULL);
while (!g_queue_is_empty(transport->pending_lines)) {
- GIOStatus status;
GError *error = NULL;
struct irc_line *l = g_queue_pop_head(transport->pending_lines);
status = irc_send_line(transport->incoming,
transport->outgoing_iconv, l, &error);
- if (status == G_IO_STATUS_AGAIN) {
+ switch (status) {
+ case G_IO_STATUS_AGAIN:
g_queue_push_head(transport->pending_lines, l);
return TRUE;
- }
-
- if (status == G_IO_STATUS_ERROR) {
+ case G_IO_STATUS_ERROR:
transport->callbacks->log(transport, l, error);
-
- } else if (status == G_IO_STATUS_EOF) {
+ break;
+ case G_IO_STATUS_EOF:
transport->outgoing_id = 0;
irc_transport_disconnect(transport);
free_line(l);
return FALSE;
- } else if (status == G_IO_STATUS_NORMAL) {
+ case G_IO_STATUS_NORMAL:
transport->last_line_sent = time(NULL);
+ break;
}
+ status = g_io_channel_flush(transport->incoming, &error);
+ switch (status) {
+ case G_IO_STATUS_AGAIN:
+ free_line(l);
+ return TRUE;
+ case G_IO_STATUS_NORMAL:
+ break;
+ case G_IO_STATUS_ERROR:
+ transport->callbacks->log(transport, l, error);
+ break;
+ }
free_line(l);
}
- transport->outgoing_id = 0;
- return FALSE;
+ if (!ret)
+ transport->outgoing_id = 0;
+ return ret;
}
gboolean transport_send_line(struct irc_transport *transport,
const struct irc_line *l)
{
- if (transport->outgoing_id == 0) {
- GError *error = NULL;
- GIOStatus status = irc_send_line(transport->incoming, transport->outgoing_iconv, l, &error);
-
- if (status == G_IO_STATUS_AGAIN) {
- transport->outgoing_id = g_io_add_watch(transport->incoming, G_IO_OUT,
- transport_send_queue, transport);
- g_queue_push_tail(transport->pending_lines, linedup(l));
- } else if (status == G_IO_STATUS_EOF) {
- irc_transport_disconnect(transport);
- return FALSE;
- } else if (status == G_IO_STATUS_ERROR) {
- transport->callbacks->log(transport, l, error);
- } else if (status == G_IO_STATUS_NORMAL) {
- transport->last_line_sent = time(NULL);
- }
+ GError *error = NULL;
+ GIOStatus status;
+ if (transport->outgoing_id != 0) {
+ g_queue_push_tail(transport->pending_lines, linedup(l));
return TRUE;
}
- g_queue_push_tail(transport->pending_lines, linedup(l));
+ status = irc_send_line(transport->incoming, transport->outgoing_iconv, l, &error);
+
+ switch (status) {
+ case G_IO_STATUS_AGAIN:
+ transport->outgoing_id = g_io_add_watch(transport->incoming, G_IO_OUT,
+ transport_send_queue, transport);
+ g_queue_push_tail(transport->pending_lines, linedup(l));
+ break;
+ case G_IO_STATUS_EOF:
+ irc_transport_disconnect(transport);
+ return FALSE;
+ case G_IO_STATUS_ERROR:
+ transport->callbacks->log(transport, l, error);
+ return FALSE;
+ case G_IO_STATUS_NORMAL:
+ transport->last_line_sent = time(NULL);
+ break;
+ }
+
+ status = g_io_channel_flush(transport->incoming, &error);
+
+ switch (status) {
+ case G_IO_STATUS_NORMAL:
+ break;
+ case G_IO_STATUS_AGAIN:
+ transport->outgoing_id = g_io_add_watch(transport->incoming, G_IO_OUT,
+ transport_send_queue, transport);
+ break;
+ case G_IO_STATUS_ERROR:
+ transport->callbacks->log(transport, l, error);
+ return FALSE;
+ }
return TRUE;
}
if (n == NULL) {
irc_sendf(pc->connection, pc->listener->iconv, NULL, ":%s %d %s :Password error: unable to find network",
get_my_hostname(), ERR_PASSWDMISMATCH, "*");
+ g_io_channel_flush(pc->connection, NULL);
return FALSE;
}
!connect_network(n)) {
irc_sendf(pc->connection, pc->listener->iconv, NULL, ":%s %d %s :Password error: unable to connect",
get_my_hostname(), ERR_PASSWDMISMATCH, "*");
+ g_io_channel_flush(pc->connection, NULL);
return FALSE;
}
}
}
} else {
irc_sendf(pc->connection, pc->listener->iconv, NULL, ":%s %d %s :You are not registered", get_my_hostname(), ERR_NOTREGISTERED, "*");
+ g_io_channel_flush(pc->connection, NULL);
}
return TRUE;