From 56d41461f857007d8228dfc7b0025065c14b5696 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 12 Dec 2006 18:43:59 +0000 Subject: [PATCH] Handle disconnection better. And more porting to new API. --- apps/irssi/src/silc/core/client_ops.c | 22 ++++------- apps/irssi/src/silc/core/silc-channels.c | 21 ++++------- apps/irssi/src/silc/core/silc-core.c | 33 +++++++++++++++-- apps/irssi/src/silc/core/silc-servers.c | 47 ++++++++++++++++++------ apps/irssi/src/silc/core/silc-servers.h | 5 ++- 5 files changed, 82 insertions(+), 46 deletions(-) diff --git a/apps/irssi/src/silc/core/client_ops.c b/apps/irssi/src/silc/core/client_ops.c index 776fe69d..09654cce 100644 --- a/apps/irssi/src/silc/core/client_ops.c +++ b/apps/irssi/src/silc/core/client_ops.c @@ -1150,7 +1150,6 @@ void silc_notify(SilcClient client, SilcClientConnection conn, /* * Server has quit the network. */ - int i; SilcDList clients; SILC_LOG_DEBUG(("Notify: SERVER_SIGNOFF")); @@ -1537,6 +1536,7 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, SilcChannelPayload entry; int i = 0; + memset(buf, 0, sizeof(buf)); silc_dlist_start(channels); while ((entry = silc_dlist_get(channels))) { SilcUInt32 name_len; @@ -1856,8 +1856,10 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, break; case SILC_COMMAND_OPER: - if (SILC_STATUS_IS_ERROR(status)) + if (SILC_STATUS_IS_ERROR(status)) { + silc_say_error("OPER: %s", silc_get_status_message(status)); return; + } server->umode |= SILC_UMODE_SERVER_OPERATOR; signal_emit("user mode changed", 2, server, NULL); @@ -1867,8 +1869,10 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, break; case SILC_COMMAND_SILCOPER: - if (SILC_STATUS_IS_ERROR(status)) + if (SILC_STATUS_IS_ERROR(status)) { + silc_say_error("SILCOPER: %s", silc_get_status_message(status)); return; + } server->umode |= SILC_UMODE_ROUTER_OPERATOR; signal_emit("user mode changed", 2, server, NULL); @@ -2065,9 +2069,6 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, case SILC_COMMAND_STATS: { SilcClientStats *cstats; - SilcUInt32 buf_len; - SilcBufferStruct buf; - unsigned char *tmp_buf; char tmp[40]; const char *tmptime; int days, hours, mins, secs; @@ -2694,14 +2695,6 @@ silc_detach(SilcClient client, SilcClientConnection conn, silc_free(file); } -/* Called to indicate the client library is running. */ - -static void -silc_running(SilcClient client, void *application) -{ - SILC_LOG_DEBUG(("Client library is running")); -} - /* SILC client operations */ SilcClientOperations ops = { silc_say, @@ -2716,5 +2709,4 @@ SilcClientOperations ops = { silc_key_agreement, silc_ftp, silc_detach, - silc_running, }; diff --git a/apps/irssi/src/silc/core/silc-channels.c b/apps/irssi/src/silc/core/silc-channels.c index 502bb61b..85ebe48d 100644 --- a/apps/irssi/src/silc/core/silc-channels.c +++ b/apps/irssi/src/silc/core/silc-channels.c @@ -140,11 +140,6 @@ static void sig_server_quit(SILC_SERVER_REC *server, const char *msg) silc_command_exec(server, "QUIT", msg); } -static void sig_gui_quit(SILC_SERVER_REC *server, const char *msg) -{ - silc_client_stop(silc_client); -} - /* Find Irssi channel entry by SILC channel entry */ SILC_CHANNEL_REC *silc_channel_find_entry(SILC_SERVER_REC *server, @@ -255,11 +250,10 @@ static void command_action(const char *data, SILC_SERVER_REC *server, message, len); } - sign = (g_hash_table_lookup(optlist, "sign") ? TRUE : - settings_get_bool("sign_channel_messages") ? TRUE : FALSE); - if (target != NULL) { if (target_type == SEND_TARGET_CHANNEL) { + sign = (g_hash_table_lookup(optlist, "sign") ? TRUE : + settings_get_bool("sign_channel_messages") ? TRUE : FALSE); if (silc_send_channel(server, target, (message != NULL ? message : msg), SILC_MESSAGE_FLAG_ACTION | SILC_MESSAGE_FLAG_UTF8 | (sign ? SILC_MESSAGE_FLAG_SIGNED : 0))) { @@ -269,6 +263,8 @@ static void command_action(const char *data, SILC_SERVER_REC *server, signal_emit("message silc own_action", 3, server, msg, target); } } else { + sign = (g_hash_table_lookup(optlist, "sign") ? TRUE : + settings_get_bool("sign_private_messages") ? TRUE : FALSE); if (silc_send_msg(server, target, (message != NULL ? message : msg), (message != NULL ? strlen(message) : strlen(msg)), SILC_MESSAGE_FLAG_ACTION | SILC_MESSAGE_FLAG_UTF8 | @@ -361,11 +357,10 @@ static void command_notice(const char *data, SILC_SERVER_REC *server, message, len); } - sign = (g_hash_table_lookup(optlist, "sign") ? TRUE : - settings_get_bool("sign_channel_messages") ? TRUE : FALSE); - if (target != NULL) { if (target_type == SEND_TARGET_CHANNEL) { + sign = (g_hash_table_lookup(optlist, "sign") ? TRUE : + settings_get_bool("sign_channel_messages") ? TRUE : FALSE); if (silc_send_channel(server, target, (message != NULL ? message : msg), SILC_MESSAGE_FLAG_NOTICE | SILC_MESSAGE_FLAG_UTF8 | (sign ? SILC_MESSAGE_FLAG_SIGNED : 0))) { @@ -375,6 +370,8 @@ static void command_notice(const char *data, SILC_SERVER_REC *server, signal_emit("message silc own_notice", 3, server, msg, target); } } else { + sign = (g_hash_table_lookup(optlist, "sign") ? TRUE : + settings_get_bool("sign_private_messages") ? TRUE : FALSE); if (silc_send_msg(server, target, (message != NULL ? message : msg), (message != NULL ? strlen(message) : strlen(msg)), SILC_MESSAGE_FLAG_NOTICE | SILC_MESSAGE_FLAG_UTF8 | @@ -1243,7 +1240,6 @@ void silc_channels_init(void) signal_add("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed); signal_add("server connected", (SIGNAL_FUNC) sig_connected); signal_add("server quit", (SIGNAL_FUNC) sig_server_quit); - signal_add("gui exit", (SIGNAL_FUNC) sig_gui_quit); signal_add("mime", (SIGNAL_FUNC) sig_mime); command_bind_silc("part", MODULE_NAME, (SIGNAL_FUNC) command_part); @@ -1266,7 +1262,6 @@ void silc_channels_deinit(void) signal_remove("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed); signal_remove("server connected", (SIGNAL_FUNC) sig_connected); signal_remove("server quit", (SIGNAL_FUNC) sig_server_quit); - signal_remove("gui exit", (SIGNAL_FUNC) sig_gui_quit); signal_remove("mime", (SIGNAL_FUNC) sig_mime); command_unbind("part", (SIGNAL_FUNC) command_part); diff --git a/apps/irssi/src/silc/core/silc-core.c b/apps/irssi/src/silc/core/silc-core.c index 430748b2..26c6f379 100644 --- a/apps/irssi/src/silc/core/silc-core.c +++ b/apps/irssi/src/silc/core/silc-core.c @@ -372,28 +372,51 @@ void silc_opt_callback(poptContext con, } } +/* Called to indicate the client library has stopped. */ + +static void +silc_stopped(SilcClient client, void *context) +{ + SILC_LOG_DEBUG(("Client library has stopped")); + if (idletag != -1) + g_source_remove(idletag); +} + +static void sig_gui_quit(SILC_SERVER_REC *server, const char *msg) +{ + silc_client_stop(silc_client, silc_stopped, NULL); +} + +/* Called to indicate the client library is running. */ + +static void +silc_running(SilcClient client, void *context) +{ + SILC_LOG_DEBUG(("Client library is running")); +} + static void sig_init_finished(void) { /* Check ~/.silc directory and public and private keys */ if (!silc_client_check_silc_dir()) { sleep(1); - signal_emit("gui exit", 0); + exit(1); return; } /* Load public and private key */ if (!silc_client_load_keys(silc_client)) { sleep(1); - signal_emit("gui exit", 0); + exit(1); return; } /* Initialize the SILC client */ if (!silc_client_init(silc_client, settings_get_str("user_name"), opt_hostname ? opt_hostname : silc_net_localhost(), - settings_get_str("real_name"))) { + settings_get_str("real_name"), silc_running, NULL)) { sleep(1); - signal_emit("gui exit", 0); + exit(1); return; } @@ -486,6 +509,7 @@ void silc_core_init(void) signal_add("setup changed", (SIGNAL_FUNC) sig_setup_changed); signal_add("irssi init finished", (SIGNAL_FUNC) sig_init_finished); + signal_add("gui exit", (SIGNAL_FUNC) sig_gui_quit); silc_init_userinfo(); @@ -555,6 +579,7 @@ void silc_core_deinit(void) chat_protocol_find("SILC")); signal_remove("setup changed", (SIGNAL_FUNC) sig_setup_changed); signal_remove("irssi init finished", (SIGNAL_FUNC) sig_init_finished); + signal_remove("gui exit", (SIGNAL_FUNC) sig_gui_quit); silc_queue_deinit(); silc_server_deinit(); diff --git a/apps/irssi/src/silc/core/silc-servers.c b/apps/irssi/src/silc/core/silc-servers.c index 6f57d782..59739a1e 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -256,13 +256,13 @@ static void send_message(SILC_SERVER_REC *server, char *target, silc_utf8_encode(msg, strlen(msg), SILC_STRING_LOCALE, message, len); } - sign = settings_get_bool("sign_channel_messages"); - - if (target_type == SEND_TARGET_CHANNEL) + if (target_type == SEND_TARGET_CHANNEL) { + sign = settings_get_bool("sign_channel_messages"); silc_send_channel(server, target, message ? message : msg, SILC_MESSAGE_FLAG_UTF8 | (sign ? SILC_MESSAGE_FLAG_SIGNED : 0)); - else { + } else { + sign = settings_get_bool("sign_private_messages"); if (!silc_term_utf8()) { len = silc_utf8_encoded_len(target, strlen(target), SILC_STRING_LOCALE); t = silc_calloc(len + 1, sizeof(*t)); @@ -292,13 +292,15 @@ static void silc_connect_cb(SilcClient client, SILC_SERVER_REC *server = context; char *file; - if (server->disconnected) { - silc_client_close_connection(client, conn); - return; - } + server->op = NULL; switch (status) { case SILC_CLIENT_CONN_SUCCESS: + if (server->disconnected) { + silc_client_close_connection(client, conn); + return; + } + /* We have successfully connected to server */ /* Enable queueing until we have our requested nick */ @@ -319,6 +321,11 @@ static void silc_connect_cb(SilcClient client, break; case SILC_CLIENT_CONN_SUCCESS_RESUME: + if (server->disconnected) { + silc_client_close_connection(client, conn); + return; + } + /* We have successfully resumed old detached session */ server->connected = TRUE; server->conn = conn; @@ -367,7 +374,9 @@ static void silc_connect_cb(SilcClient client, server->conn->context = NULL; server->conn = NULL; server->connection_lost = TRUE; - server_disconnect(SERVER(server)); + if (!server->disconnected) + server_disconnect(SERVER(server)); + server_unref(SERVER(server)); break; default: @@ -381,7 +390,9 @@ static void silc_connect_cb(SilcClient client, server->connection_lost = TRUE; if (server->conn) server->conn->context = NULL; - server_disconnect(SERVER(server)); + if (!server->disconnected) + server_disconnect(SERVER(server)); + server_unref(SERVER(server)); break; } } @@ -422,9 +433,18 @@ static void sig_connected_stream_created(SilcSocketStreamStatus status, SILCTXT_REATTACH, server->tag); /* Start key exchange */ - silc_client_key_exchange(silc_client, ¶ms, irssi_pubkey, irssi_privkey, - stream, SILC_CONN_SERVER, silc_connect_cb, server); + server->op = silc_client_key_exchange(silc_client, ¶ms, + irssi_pubkey, irssi_privkey, + stream, SILC_CONN_SERVER, + silc_connect_cb, server); + if (!server->op) { + server->connection_lost = TRUE; + server_disconnect(SERVER(server)); + silc_stream_destroy(stream); + return; + } + server_ref(SERVER(server)); server->ftp_sessions = silc_dlist_init(); server->isnickflag = isnickflag_func; server->ischannel = ischannel_func; @@ -459,6 +479,9 @@ static void sig_disconnected(SILC_SERVER_REC *server) g_io_channel_unref(net_sendbuffer_handle(server->handle)); net_sendbuffer_destroy(server->handle, FALSE); server->handle = NULL; + } else if (server->op) { + silc_async_abort(server->op, NULL, NULL); + server->op = NULL; } } diff --git a/apps/irssi/src/silc/core/silc-servers.h b/apps/irssi/src/silc/core/silc-servers.h index cc6b9443..ff8ad603 100644 --- a/apps/irssi/src/silc/core/silc-servers.h +++ b/apps/irssi/src/silc/core/silc-servers.h @@ -41,16 +41,17 @@ typedef struct { SilcDList ftp_sessions; FtpSession current_session; - + gpointer chanqueries; SilcClientConnection conn; + SilcAsyncOperation op; SilcUInt32 umode; } SILC_SERVER_REC; SERVER_REC *silc_server_init_connect(SERVER_CONNECT_REC *conn); void silc_server_connect(SERVER_REC *server); -/* Return a string of all channels in server in server->channels_join() +/* Return a string of all channels in server in server->channels_join() format */ char *silc_server_get_channels(SILC_SERVER_REC *server); void silc_command_exec(SILC_SERVER_REC *server, -- 2.24.0