updates.
[silc.git] / apps / silcd / server_util.c
index f090ff1d43bd5a5099d9fd2250089cb84626da51..88e6afa610357b01bccd8b9687d849d55a1d8a51 100644 (file)
@@ -210,13 +210,21 @@ bool silc_server_remove_clients_by_server(SilcServer server,
          silc_buffer_free(idp);
        }
 
-       /* Remove the client entry */
-       silc_server_remove_clients_channels(server, NULL, client, channels);
-       client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
-       id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+       /* Update statistics */
        server->stat.clients--;
        if (server->server_type == SILC_ROUTER)
          server->stat.cell_clients--;
+       SILC_OPER_STATS_UPDATE(client, server, SILC_UMODE_SERVER_OPERATOR);
+       SILC_OPER_STATS_UPDATE(client, router, SILC_UMODE_ROUTER_OPERATOR);
+
+       /* Remove the client entry */
+       silc_server_remove_clients_channels(server, NULL, client, channels);
+       if (!server_signoff) {
+         client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
+         id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+       } else {
+         silc_idlist_del_client(server->local_list, client);
+       }
 
        if (!silc_idcache_list_next(list, &id_cache))
          break;
@@ -266,13 +274,21 @@ bool silc_server_remove_clients_by_server(SilcServer server,
          silc_buffer_free(idp);
        }
 
-       /* Remove the client entry */
-       silc_server_remove_clients_channels(server, NULL, client, channels);
-       client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
-       id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+       /* Update statistics */
        server->stat.clients--;
        if (server->server_type == SILC_ROUTER)
          server->stat.cell_clients--;
+       SILC_OPER_STATS_UPDATE(client, server, SILC_UMODE_SERVER_OPERATOR);
+       SILC_OPER_STATS_UPDATE(client, router, SILC_UMODE_ROUTER_OPERATOR);
+
+       /* Remove the client entry */
+       silc_server_remove_clients_channels(server, NULL, client, channels);
+       if (!server_signoff) {
+         client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
+         id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+       } else {
+         silc_idlist_del_client(server->global_list, client);
+       }
 
        if (!silc_idcache_list_next(list, &id_cache))
          break;