X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver_util.c;h=5c06bcd17f11abd582c0b083772f33e68f751a17;hb=9a85416f729ef965606a688fffb6baa9d22927a5;hp=f090ff1d43bd5a5099d9fd2250089cb84626da51;hpb=bd2c9343055303a5517a33401f57a0414639a953;p=silc.git diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index f090ff1d..5c06bcd1 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -105,6 +105,7 @@ static void silc_server_remove_clients_channels(SilcServer server, silc_hash_table_del(channel->user_list, chl2->client); silc_free(chl2); } + silc_hash_table_list_reset(&htl2); continue; } @@ -121,6 +122,7 @@ static void silc_server_remove_clients_channels(SilcServer server, if (!silc_hash_table_find(channels, channel, NULL, NULL)) silc_hash_table_add(channels, channel, channel); } + silc_hash_table_list_reset(&htl); silc_buffer_free(clidp); } @@ -210,13 +212,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 +276,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; @@ -324,8 +342,11 @@ bool silc_server_remove_clients_by_server(SilcServer server, must re-generate the channel key. */ silc_hash_table_list(channels, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&channel)) { - if (!silc_server_create_channel_key(server, channel, 0)) + if (!silc_server_create_channel_key(server, channel, 0)) { + silc_hash_table_list_reset(&htl); + silc_hash_table_free(channels); return FALSE; + } /* Do not send the channel key if private channel key mode is set */ if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) @@ -335,6 +356,7 @@ bool silc_server_remove_clients_by_server(SilcServer server, server->server_type == SILC_ROUTER ? FALSE : !server->standalone); } + silc_hash_table_list_reset(&htl); silc_hash_table_free(channels); return TRUE; @@ -683,9 +705,12 @@ bool silc_server_channel_has_global(SilcChannelEntry channel) silc_hash_table_list(channel->user_list, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chl)) { - if (chl->client->router) + if (chl->client->router) { + silc_hash_table_list_reset(&htl); return TRUE; + } } + silc_hash_table_list_reset(&htl); return FALSE; } @@ -700,9 +725,12 @@ bool silc_server_channel_has_local(SilcChannelEntry channel) silc_hash_table_list(channel->user_list, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chl)) { - if (!chl->client->router) + if (!chl->client->router) { + silc_hash_table_list_reset(&htl); return TRUE; + } } + silc_hash_table_list_reset(&htl); return FALSE; } @@ -718,10 +746,7 @@ bool silc_server_client_on_channel(SilcClientEntry client, if (!client || !channel) return FALSE; - if (silc_hash_table_find(client->channels, channel, NULL, NULL)) - return TRUE; - - return FALSE; + return silc_hash_table_find(client->channels, channel, NULL, NULL); } /* Checks string for bad characters and returns TRUE if they are found. */