From 19e810405789a35b92026b56ea49d01a3f544b07 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Tue, 17 Jan 2017 23:09:24 +0100 Subject: [PATCH] Get compatible with potential irssi abi 8, and drop polling --- core/Makefile | 1 - core/quassel-net.c | 64 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 10 deletions(-) --- a/core/Makefile +++ b/core/Makefile @@ -16,7 +16,6 @@ SSL_CFLAGS=$(shell pkg-config --cflags o SSL_LDLAGS=$(shell pkg-config --libs openssl) OBJECTS:=quasselc-connector.o quassel-core.o OBJECTS+=quassel-net.o quassel-msgs.o quassel-cmds.o -OBJECTS+=irssi/network-openssl.o OBJECTS+=quassel-fe-window.o quassel-fe-level.o quassel-cfg.o LDFLAGS ?= --- a/core/quassel-net.c +++ b/core/quassel-net.c @@ -132,10 +132,10 @@ static SERVER_REC* quassel_server_init_c ret->got = 0; server_connect_ref(SERVER_CONNECT(conn)); - if(conn->use_ssl) { + if(conn->use_tls) { ret->ssl = 1; } - ret->connrec->use_ssl = 0; + ret->connrec->use_tls = 0; ret->channels_join = quassel_irssi_channels_join; ret->send_message = quassel_irssi_send_message; @@ -161,12 +161,59 @@ void quassel_net_init(CHAT_PROTOCOL_REC* signal_add_first("server connected", (SIGNAL_FUNC) sig_connected); } -GIOChannel *irssi_ssl_get_iochannel(GIOChannel *handle, int port, SERVER_REC *server); +static void quassel_net_final_setup(SERVER_REC* server, GIOChannel *handle) { + quassel_login(handle, server->connrec->nick, server->connrec->password); + server->handle->handle = handle; + + server->readtag = + g_input_add(handle, + G_INPUT_READ, + (GInputFunction) quassel_parse_incoming, server); +} + +static void quassel_net_ssl_callback(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) + quassel_net_ssl_callback, + server); + return; + } + + if (server->connect_tag != -1) { + g_source_remove(server->connect_tag); + server->connect_tag = -1; + } + + quassel_net_final_setup(server, handle); +} + void quassel_irssi_init_ack(void *arg) { Quassel_SERVER_REC *server = (Quassel_SERVER_REC*)arg; - if(!server->ssl) - goto login; - GIOChannel* ssl_handle = irssi_ssl_get_iochannel(server->handle->handle, 1337, SERVER(server)); + GIOChannel* ssl_handle = net_start_ssl((SERVER_REC*)server); + + if(server->readtag != -1) { + g_source_remove(server->readtag); + server->readtag = -1; + } + + if(!server->ssl) { + quassel_net_final_setup((SERVER_REC*)server, server->handle->handle); + return; + } + int error; //That's polling, and that's really bad... while( (error=irssi_ssl_handshake(ssl_handle)) & 1) { @@ -175,10 +222,7 @@ void quassel_irssi_init_ack(void *arg) { return; } } - server->handle->handle = ssl_handle; - -login: - quassel_login(server->handle->handle, server->connrec->nick, server->connrec->password); + quassel_net_ssl_callback((SERVER_REC*)server, ssl_handle); } void quassel_irssi_init_nack(void *arg) {