Handle disconnection better. And more porting to new API.
authorPekka Riikonen <priikone@silcnet.org>
Tue, 12 Dec 2006 18:43:59 +0000 (18:43 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 12 Dec 2006 18:43:59 +0000 (18:43 +0000)
apps/irssi/src/silc/core/client_ops.c
apps/irssi/src/silc/core/silc-channels.c
apps/irssi/src/silc/core/silc-core.c
apps/irssi/src/silc/core/silc-servers.c
apps/irssi/src/silc/core/silc-servers.h

index 776fe69de16fdda84651a55dd5a0193434eef058..09654ccebe68bbd84c672c4b8c363af1334ea474 100644 (file)
@@ -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,
 };
index 502bb61b62a6f46b93651a55c133ae5bc119c7b8..85ebe48d9f6fceaa3175364ea33a71b2769c6e25 100644 (file)
@@ -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);
index 430748b28d00cc89dff747c37e973bc729a52b2c..26c6f379d338f99dec8e1cc9a8e1f39bc35c1039 100644 (file)
@@ -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();
index 6f57d782fb158e80cd9effd29b1dab36c291ba39..59739a1e2ff844126f64ce50f6ad95cbc220cef8 100644 (file)
@@ -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, &params, irssi_pubkey, irssi_privkey,
-                          stream, SILC_CONN_SERVER, silc_connect_cb, server);
+  server->op = silc_client_key_exchange(silc_client, &params,
+                                       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;
   }
 }
 
index cc6b94439f1f5ca551c4f7931014df02320b0a67..ff8ad603664832d23bfa2ef149317041969101f5 100644 (file)
@@ -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,