X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fserver.c;h=09c54b7d9af231dd659546308b98d75e04fafdaa;hb=da3a876c26b6d697ee6446ad81a8edfff1828cab;hp=25c719e7777c01b2be7cc3e5db2b52358c4fd317;hpb=346885ee9466a6f1d5ecc99a5401aa3043acf7c0;p=silc.git diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 25c719e7..09c54b7d 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -108,6 +108,7 @@ void silc_server_free(SilcServer server) silc_idcache_free(server->global_list->clients); silc_idcache_free(server->global_list->servers); silc_idcache_free(server->global_list->channels); + silc_hash_table_free(server->watcher_list); silc_free(server->sockets); silc_free(server); @@ -208,6 +209,14 @@ bool silc_server_init(SilcServer server) server->global_list->servers = silc_idcache_alloc(0, SILC_ID_SERVER, NULL); server->global_list->channels = silc_idcache_alloc(0, SILC_ID_CHANNEL, NULL); + /* Init watcher list */ + server->watcher_list = + silc_hash_table_alloc(1, silc_hash_client_id_hash, NULL, + silc_hash_data_compare, (void *)CLIENTID_HASH_LEN, + NULL, NULL, TRUE); + if (!server->watcher_list) + goto err; + /* Create a listening server */ if (!silc_server_listen(server, &sock)) goto err; @@ -2506,6 +2515,14 @@ void silc_server_free_client_data(SilcServer server, silc_server_remove_from_channels(server, NULL, client, FALSE, NULL, FALSE); + /* Check if anyone is watching this nickname */ + if (server->server_type == SILC_ROUTER) + silc_server_check_watcher_list(server, client, NULL, + SILC_NOTIFY_TYPE_SIGNOFF); + + /* Remove this client from watcher list if it is */ + silc_server_del_from_watcher_list(server, client); + /* Update statistics */ server->stat.my_clients--; server->stat.clients--;