g_io_channel_set_close_on_unref(ioc, TRUE);
+ cs = s->connection.data.tcp.current_server;
+ if (cs->ssl) {
+#ifdef HAVE_GNUTLS
+ g_io_channel_set_close_on_unref(ioc, TRUE);
+ g_io_channel_set_flags(ioc, G_IO_FLAG_NONBLOCK, NULL);
+
+ ioc = ssl_wrap_iochannel (ioc, SSL_TYPE_CLIENT,
+ s->connection.data.tcp.current_server->host,
+ s->ssl_credentials
+ );
+ if (!ioc) {
+ network_report_disconnect(s, "Couldn't connect via server %s:%s", cs->host, cs->port);
+ reconnect(s);
+ return FALSE;
+ }
+#else
+ network_log(LOG_WARNING, s, "SSL enabled for %s:%s, but no SSL support loaded", cs->host, cs->port);
+#endif
+ }
+
s->connection.state = NETWORK_CONNECTION_STATE_CONNECTING;
if (!connect_finished) {
void *data)
{
struct irc_network *s = data;
- struct tcp_server_config *cs;
if (cond & G_IO_ERR) {
network_report_disconnect(s, "Error connecting: %s",
if (cond & G_IO_OUT) {
s->connection.state = NETWORK_CONNECTION_STATE_CONNECTED;
- cs = s->connection.data.tcp.current_server;
- if (cs->ssl) {
-#ifdef HAVE_GNUTLS
- g_io_channel_set_close_on_unref(ioc, TRUE);
- g_io_channel_set_flags(ioc, G_IO_FLAG_NONBLOCK, NULL);
-
- ioc = ssl_wrap_iochannel (ioc, SSL_TYPE_CLIENT,
- s->connection.data.tcp.current_server->host,
- s->ssl_credentials
- );
- g_assert(ioc != NULL);
-#else
- network_log(LOG_WARNING, s, "SSL enabled for %s:%s, but no SSL support loaded", cs->host, cs->port);
-#endif
- }
-
- if (!ioc) {
- network_report_disconnect(s, "Couldn't connect via server %s:%s", cs->host, cs->port);
- reconnect(s);
- return FALSE;
- }
-
s->connection.data.tcp.connect_id = 0; /* Otherwise data will be queued */
network_set_iochannel(s, ioc);
if (result < 0) {
g_set_error (err, G_IO_CHANNEL_ERROR,
G_IO_CHANNEL_ERROR_FAILED,
- "Unable to handshake");
+ gnutls_strerror(result));
return G_IO_STATUS_ERROR;
}
result == G_IO_STATUS_ERROR)
return result;
+ g_assert(result >= 0);
+
chan->established = TRUE;
}
} else {
*bytes_read = result;
- return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF;
+ return G_IO_STATUS_NORMAL;
}
}
result == G_IO_STATUS_ERROR)
return result;
+
+ g_assert(result >= 0);
+
chan->established = TRUE;
}
} else {
*bytes_written = result;
- return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF;
+ return G_IO_STATUS_NORMAL;
}
}
g_return_val_if_fail (sock != NULL, NULL);
g_return_val_if_fail (credentials != NULL, NULL);
+ g_io_channel_set_encoding(sock, NULL, NULL);
+ g_io_channel_set_buffered(sock, FALSE);
+
sockfd = g_io_channel_unix_get_fd (sock);
if (!sockfd) {
g_warning ("Failed to get channel fd.");
gchan->funcs = &gnutls_channel_funcs;
g_io_channel_init (gchan);
gchan->is_readable = gchan->is_writeable = TRUE;
- gchan->use_buffer = FALSE;
return gchan;