X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver_util.c;h=54ed8e135327edc2d7fe893863e173a5c802101d;hb=6b6b1b00eeea0a5a9faac129cba3f3a4e46fec16;hp=fbb0c7fd91273a08ca92280cd50d87cb040248fa;hpb=d4b044342895424f18e1d94de809fe256696cacb;p=silc.git diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index fbb0c7fd..54ed8e13 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -38,18 +38,15 @@ silc_server_remove_clients_channels(SilcServer server, SilcChannelEntry channel; SilcChannelClientEntry chl, chl2; SilcHashTableList htl, htl2; - SilcBuffer clidp; SILC_LOG_DEBUG(("Start")); - if (!client || !client->id) + if (!client) return; if (silc_hash_table_find(clients, client, NULL, NULL)) silc_hash_table_del(clients, client); - clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT); - /* Remove the client from all channels. The client is removed from the channels' user list. */ silc_hash_table_list(client->channels, &htl); @@ -120,7 +117,6 @@ silc_server_remove_clients_channels(SilcServer server, silc_hash_table_add(channels, channel, channel); } silc_hash_table_list_reset(&htl); - silc_buffer_free(clidp); } /* This function is used to remove all client entries by the server `entry'. @@ -208,15 +204,15 @@ bool silc_server_remove_clients_by_server(SilcServer server, 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, entry, clients, client, channels); + silc_server_del_from_watcher_list(server, client); + + /* Remove the client entry */ if (!server_signoff) { client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED; id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF; } else { - /* Remove this client from watcher list if it is */ - silc_server_del_from_watcher_list(server, client); silc_idlist_del_client(server->local_list, client); } @@ -268,9 +264,11 @@ bool silc_server_remove_clients_by_server(SilcServer server, 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, entry, clients, client, channels); + silc_server_del_from_watcher_list(server, client); + + /* Remove the client entry */ if (!server_signoff) { client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED; id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF; @@ -290,21 +288,16 @@ bool silc_server_remove_clients_by_server(SilcServer server, SilcBuffer args, not; /* Send SERVER_SIGNOFF notify to our primary router */ - if (!server->standalone && server->router && - server->router != entry) { + if (server->router != entry) { args = silc_argument_payload_encode(1, argv, argv_lens, argv_types); - silc_server_send_notify_args(server, - server->router->connection, - server->server_type == SILC_SERVER ? - FALSE : TRUE, + silc_server_send_notify_args(server, SILC_PRIMARY_ROUTE(server), + SILC_BROADCAST(server), SILC_NOTIFY_TYPE_SERVER_SIGNOFF, argc, args); silc_buffer_free(args); } - - /* Send to local clients. We also send the list of client ID's that is to be removed for those servers that would like to use that list. */ args = silc_argument_payload_encode(argc, argv, argv_lens, @@ -1277,10 +1270,9 @@ void silc_server_kill_client(SilcServer server, killer->data, killer->len); /* Send KILLED notify to primary route */ - if (!server->standalone) - silc_server_send_notify_killed(server, server->router->connection, TRUE, - remote_client->id, comment, - killer_id, killer_id_type); + silc_server_send_notify_killed(server, SILC_PRIMARY_ROUTE(server), + SILC_BROADCAST(server), remote_client->id, + comment, killer_id, killer_id_type); /* Send KILLED notify to the client directly */ if (remote_client->connection || remote_client->router) @@ -1369,7 +1361,7 @@ bool silc_server_check_watcher_list(SilcServer server, WatcherNotifyContext n; SILC_LOG_DEBUG(("Checking watcher list %s", - client->nickname ? client->nickname : "")); + client->nickname ? client->nickname : (unsigned char *)"")); /* If the watching is rejected by the client do nothing */ if (client->mode & SILC_UMODE_REJECT_WATCHING) @@ -1414,8 +1406,9 @@ bool silc_server_del_from_watcher_list(SilcServer server, if (entry == client) { silc_hash_table_del_by_context(server->watcher_list, key, client); - SILC_LOG_DEBUG(("Removing %s from WATCH list", - silc_id_render(client->id, SILC_ID_CLIENT))); + if (client->id) + SILC_LOG_DEBUG(("Removing %s from WATCH list", + silc_id_render(client->id, SILC_ID_CLIENT))); /* Now check whether there still exists entries with this key, if not then free the key to not leak memory. */ @@ -1442,7 +1435,7 @@ bool silc_server_force_cumode_change(SilcServer server, SilcBuffer idp1, idp2; unsigned char cumode[4]; - SILC_LOG_DEBUG(("Start")); + SILC_LOG_DEBUG(("Enforcing sender to change mode")); if (sock) silc_server_send_notify_cumode(server, sock, FALSE, channel, forced_mode,