updates.
authorPekka Riikonen <priikone@silcnet.org>
Wed, 30 Jan 2002 17:52:44 +0000 (17:52 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 30 Jan 2002 17:52:44 +0000 (17:52 +0000)
CHANGES
apps/silcd/command.c
apps/silcd/command_reply.c
lib/silcclient/client.c
prepare

diff --git a/CHANGES b/CHANGES
index fd930fb940ca975bacfeb3c682d14caca4cefd72..410909db2a1ff0e9bf23e880dada06f57ef468d8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,9 @@
+Wed Jan 30 19:14:31 EET 2002  Pekka Riikonen <priikone@silcnet.org>
+
+       * Fixed founder regaining problem with JOIN command on normal
+         server.  The notify for mode change must be sent always and
+         not only if !cmd->pending.  Affected file silcd/command.c.
+
 Wed Jan 30 11:11:47 CET 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * When sending JOIN command to router for processing the
index 9ceb7caaf403e11568a81a0eaffc75e3bdf69b07..518555733ac5d779a91a7794b64ca0ee9049b6ec 100644 (file)
@@ -1083,36 +1083,53 @@ silc_server_command_whowas_send_reply(SilcServerCommandContext cmd,
 {
   SilcServer server = cmd->server;
   char *tmp;
-  int i, count = 0, len;
+  int i, k, count = 0, len;
   SilcBuffer packet, idp;
   SilcClientEntry entry = NULL;
   SilcCommandStatus status;
   uint16 ident = silc_command_get_ident(cmd->payload);
-  char found = FALSE;
   char nh[256], uh[256];
+  int valid_count;
 
   status = SILC_STATUS_OK;
-  if (clients_count > 1)
-    status = SILC_STATUS_LIST_START;
 
+  /* Process only entries that are not registered anymore. */
+  valid_count = 0;
   for (i = 0; i < clients_count; i++) {
-    entry = clients[i];
+    if (clients[i]->data.status & SILC_IDLIST_STATUS_REGISTERED)
+      clients[i] = NULL;
+    else
+      valid_count++;
+  }
 
-    /* We will take only clients that are not valid anymore. They are the
-       ones that are not registered anymore but still have a ID. They
-       have disconnected us, and thus valid for WHOWAS. */
-    if (entry->data.status & SILC_IDLIST_STATUS_REGISTERED || !entry->id)
-      continue;
+  if (!valid_count) {
+    /* No valid entries found at all, just send error */
+    unsigned char *tmp;
+    
+    tmp = silc_argument_get_arg_type(cmd->args, 1, NULL);
+    if (tmp)
+      silc_server_command_send_status_data(cmd, SILC_COMMAND_WHOWAS,
+                                          SILC_STATUS_ERR_NO_SUCH_NICK,
+                                          3, tmp, strlen(tmp));
+    return;
+  }
 
-    if (count && i - 1 == count)
-      break;
+  if (valid_count > 1)
+    status = SILC_STATUS_LIST_START;
 
-    found = TRUE;
+  for (i = 0, k = 0; i < clients_count; i++) {
+    entry = clients[i];
+    if (!entry)
+      continue;
 
-    if (clients_count > 2)
+    if (k >= 1)
       status = SILC_STATUS_LIST_ITEM;
-    if (clients_count > 1 && i == clients_count - 1)
+    if (valid_count > 1 && k == valid_count - 1)
+      status = SILC_STATUS_LIST_END;
+    if (count && k - 1 == count)
       status = SILC_STATUS_LIST_END;
+    if (count && k - 1 > count)
+      break;
 
     /* Send WHOWAS reply */
     idp = silc_id_payload_encode(entry->id, SILC_ID_CLIENT);
@@ -1153,13 +1170,9 @@ silc_server_command_whowas_send_reply(SilcServerCommandContext cmd,
     
     silc_buffer_free(packet);
     silc_buffer_free(idp);
-  }
 
-  if (found == FALSE && entry)
-    silc_server_command_send_status_data(cmd, SILC_COMMAND_WHOWAS,
-                                        SILC_STATUS_ERR_NO_SUCH_NICK,
-                                        3, entry->nickname, 
-                                        strlen(entry->nickname));
+    k++;
+  }
 }
 
 static int
@@ -3252,24 +3265,24 @@ static void silc_server_command_join_channel(SilcServer server,
       /* Distribute the channel key to all backup routers. */
       silc_server_backup_send(server, NULL, SILC_PACKET_CHANNEL_KEY, 0,
                              keyp->data, keyp->len, FALSE, TRUE);
+  }
 
-    /* If client became founder by providing correct founder auth data
-       notify the mode change to the channel. */
-    if (founder) {
-      SILC_PUT32_MSB(chl->mode, mode);
-      silc_server_send_notify_to_channel(server, NULL, channel, FALSE, 
-                                        SILC_NOTIFY_TYPE_CUMODE_CHANGE, 3,
-                                        clidp->data, clidp->len,
-                                        mode, 4, clidp->data, clidp->len);
+  /* If client became founder by providing correct founder auth data
+     notify the mode change to the channel. */
+  if (founder) {
+    SILC_PUT32_MSB(chl->mode, mode);
+    silc_server_send_notify_to_channel(server, NULL, channel, FALSE, 
+                                      SILC_NOTIFY_TYPE_CUMODE_CHANGE, 3,
+                                      clidp->data, clidp->len,
+                                      mode, 4, clidp->data, clidp->len);
       
-      /* Set CUMODE notify type to network */
-      if (!server->standalone)
-       silc_server_send_notify_cumode(server, server->router->connection,
-                                      server->server_type == SILC_ROUTER ? 
-                                      TRUE : FALSE, channel,
-                                      chl->mode, client->id, SILC_ID_CLIENT,
-                                      client->id);
-    }
+    /* Set CUMODE notify type to network */
+    if (!server->standalone)
+      silc_server_send_notify_cumode(server, server->router->connection,
+                                    server->server_type == SILC_ROUTER ? 
+                                    TRUE : FALSE, channel,
+                                    chl->mode, client->id, SILC_ID_CLIENT,
+                                    client->id);
   }
 
   silc_buffer_free(reply);
@@ -3397,6 +3410,7 @@ SILC_SERVER_CMD_FUNC(join)
                                      silc_server_command_dup(cmd));
          cmd->pending = TRUE;
           silc_command_set_ident(cmd->payload, old_ident);
+         silc_buffer_free(tmpbuf);
          goto out;
        }
        
@@ -3460,8 +3474,8 @@ SILC_SERVER_CMD_FUNC(join)
     if (silc_command_get(reply->payload) == SILC_COMMAND_JOIN) {
       tmp = silc_argument_get_arg_type(reply->args, 6, NULL);
       SILC_GET32_MSB(created, tmp);
-      if (silc_argument_get_arg_type(reply->args, 7, NULL)
-        create_key = FALSE;    /* Router returned the key already */
+      if (silc_argument_get_arg_type(reply->args, 7, NULL))
+       create_key = FALSE;     /* Router returned the key already */
     }
 
     if (silc_command_get(reply->payload) == SILC_COMMAND_WHOIS &&
index d9fbe6a8e603c85027c532c6714fffd6673b0540..68e6143337f85ff6aaa16c92a911ce1a0d80b35f 100644 (file)
@@ -895,8 +895,8 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
     /* The entry exists. */
 
     /* If ID has changed, then update it to the cache too. */
-    if (!SILC_ID_CHANNEL_COMPARE(channel->id, id))
-      silc_idlist_replace_channel_id(server->local_list, channel->id, id);
+    if (!SILC_ID_CHANNEL_COMPARE(entry->id, id))
+      silc_idlist_replace_channel_id(server->local_list, entry->id, id);
 
     entry->disabled = FALSE;
 
@@ -917,8 +917,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
   /* Get the ban list */
   tmp = silc_argument_get_arg_type(cmd->args, 8, &len);
   if (tmp) {
-    if (entry->ban_list)
-      silc_free(entry->ban_list);
+    silc_free(entry->ban_list);
     entry->ban_list = silc_calloc(len, sizeof(*entry->ban_list));
     memcpy(entry->ban_list, tmp, len);
   }
@@ -926,8 +925,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
   /* Get the invite list */
   tmp = silc_argument_get_arg_type(cmd->args, 9, &len);
   if (tmp) {
-    if (entry->invite_list)
-      silc_free(entry->invite_list);
+    silc_free(entry->invite_list);
     entry->invite_list = silc_calloc(len, sizeof(*entry->invite_list));
     memcpy(entry->invite_list, tmp, len);
   }
@@ -935,8 +933,7 @@ SILC_SERVER_CMD_REPLY_FUNC(join)
   /* Get the topic */
   tmp = silc_argument_get_arg_type(cmd->args, 10, &len);
   if (tmp) {
-    if (entry->topic)
-      silc_free(entry->topic);
+    silc_free(entry->topic);
     entry->topic = strdup(tmp);
   }
 
index 964df1805065791a8bff40d9b1adec99310ecbfa..d5867f13c6e392c928cce6c2da5ed26741fc9d23 100644 (file)
@@ -1376,9 +1376,8 @@ void silc_client_close_connection(SilcClient client,
     if (conn->server_cache)
       silc_idcache_free(conn->server_cache);
 
-    /* Free data (my ID is freed in above silc_client_del_client) */
-    if (conn->nickname)
-      silc_free(conn->nickname);
+    /* Free data (my ID is freed in above silc_client_del_client).
+       conn->nickname is freed when freeing the local_entry->nickname. */
     if (conn->remote_host)
       silc_free(conn->remote_host);
     if (conn->local_id_data)
@@ -1509,7 +1508,7 @@ void silc_client_receive_new_id(SilcClient client,
   if (!conn->local_entry)
     conn->local_entry = silc_calloc(1, sizeof(*conn->local_entry));
 
-  conn->local_entry->nickname = strdup(conn->nickname);
+  conn->local_entry->nickname = conn->nickname;
   if (!conn->local_entry->username)
     conn->local_entry->username = strdup(client->username);
   if (!conn->local_entry->hostname)
diff --git a/prepare b/prepare
index c3ab1ef9dc692fb8976cc2bc79c3d13a99bffffb..191a915d22ccb0e35d664deec5a6ce8e6e81f895 100755 (executable)
--- a/prepare
+++ b/prepare
@@ -37,7 +37,7 @@
 # SILC Distribution versions. Set here or give the version on the command
 # line as argument.
 #
-SILC_VERSION=0.7.2                     # Base version
+SILC_VERSION=0.7.3                     # Base version
 
 #############################################################################