summaryrefslogtreecommitdiff
path: root/src/core/servers.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/servers.c')
-rw-r--r--src/core/servers.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/core/servers.c b/src/core/servers.c
index 046fa072..2e9d11fc 100644
--- a/src/core/servers.c
+++ b/src/core/servers.c
@@ -167,6 +167,39 @@ static void server_connect_callback_init(SERVER_REC *server, GIOChannel *handle)
server_connect_finished(server);
}
+#ifdef HAVE_OPENSSL
+static void server_connect_callback_init_ssl(SERVER_REC *server, GIOChannel *handle)
+{
+ int error;
+
+ g_return_if_fail(IS_SERVER(server));
+
+ error = irssi_ssl_handshake(handle);
+ if (error == -1) {
+ server->connection_lost = TRUE;
+ server_connect_failed(server, NULL);
+ return;
+ }
+ if (error & 1) {
+ if (server->connect_tag != -1)
+ g_source_remove(server->connect_tag);
+ server->connect_tag = g_input_add(handle, error == 1 ? G_INPUT_READ : G_INPUT_WRITE,
+ (GInputFunction)
+ server_connect_callback_init_ssl,
+ server);
+ return;
+ }
+
+ lookup_servers = g_slist_remove(lookup_servers, server);
+ if (server->connect_tag != -1) {
+ g_source_remove(server->connect_tag);
+ server->connect_tag = -1;
+ }
+
+ server_connect_finished(server);
+}
+#endif
+
static void server_real_connect(SERVER_REC *server, IPADDR *ip,
const char *unix_socket)
{
@@ -218,6 +251,11 @@ server->connrec->ssl_cafile, server->connrec->ssl_capath, server->connrec->ssl_v
g_free(errmsg2);
} else {
server->handle = net_sendbuffer_create(handle, 0);
+#ifdef HAVE_OPENSSL
+ if (server->connrec->use_ssl)
+ server_connect_callback_init_ssl(server, handle);
+ else
+#endif
server->connect_tag =
g_input_add(handle, G_INPUT_WRITE | G_INPUT_READ,
(GInputFunction)