Merge commit 'origin/silc.1.1.branch'
[silc.git] / apps / silcd / command_reply.c
index 36eb1368497914f62fe0e3623ee9276aa6f71b08..0b1645ec4fba9332a1c8e0dea17eba370916680d 100644 (file)
@@ -152,6 +152,7 @@ silc_server_command_process_error(SilcServerCommandReplyContext cmd,
 
       silc_server_remove_from_channels(server, NULL, client, TRUE,
                                       NULL, TRUE, FALSE);
+      silc_dlist_del(server->expired_clients, client);
       silc_idlist_del_data(client);
       silc_idlist_del_client(server->global_list, client);
     }
@@ -533,6 +534,7 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
     client->servername = servername[0] ? strdup(servername) : NULL;
     client->data.status |= SILC_IDLIST_STATUS_RESOLVED;
     client->data.status &= ~SILC_IDLIST_STATUS_RESOLVING;
+    client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
 
     /* Update cache entry */
     silc_idcache_update_by_context(global ? server->global_list->clients :
@@ -543,10 +545,13 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
   /* If client is global and is not on any channel then add that we'll
      expire the entry after a while. */
   if (global) {
-    silc_idlist_find_client_by_id(server->global_list, client->id,
-                                 FALSE, &cache);
-    if (!silc_hash_table_count(client->channels))
+    client = silc_idlist_find_client_by_id(server->global_list, client->id,
+                                          FALSE, &cache);
+    if (client && !silc_hash_table_count(client->channels)) {
+      client->data.created = silc_time();
+      silc_dlist_del(server->expired_clients, client);
       silc_dlist_add(server->expired_clients, client);
+    }
   }
 
   return TRUE;