X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Fsilcd%2Fidlist.c;h=110fa3cf5f3e20123ad0e1c23a64715789f7e4b7;hp=fa084ec69496e6349eacc35489e03431b6c57ee8;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hpb=7428855aff83c6dd40431bb88d3f1e5c973e7c06 diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index fa084ec6..110fa3cf 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -88,7 +88,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge) silc_idcache_purge(i->cache); silc_schedule_task_add(i->schedule, 0, silc_idlist_purge, - (void *)i, 600, 0, + (void *)i, i->timeout, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW); } @@ -121,7 +121,7 @@ silc_idlist_add_server(SilcIDList id_list, server->connection = connection; if (!silc_idcache_add(id_list->servers, server->server_name, - (void *)server->id, (void *)server, FALSE)) { + (void *)server->id, (void *)server, 0, NULL)) { silc_free(server); return NULL; } @@ -270,7 +270,7 @@ silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id, server->id = new_id; silc_idcache_add(id_list->servers, server->server_name, server->id, - server, FALSE); + server, 0, NULL); SILC_LOG_DEBUG(("Found")); @@ -319,7 +319,8 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry) SilcClientEntry silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, char *userinfo, SilcClientID *id, - SilcServerEntry router, void *connection) + SilcServerEntry router, void *connection, + int expire) { SilcClientEntry client; @@ -336,7 +337,7 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, NULL, NULL, NULL, NULL, TRUE); if (!silc_idcache_add(id_list->clients, nickname, (void *)client->id, - (void *)client, FALSE)) { + (void *)client, expire, NULL)) { silc_hash_table_free(client->channels); silc_free(client); return NULL; @@ -380,7 +381,7 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry) int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname, char *server, SilcClientEntry **clients, - uint32 *clients_count) + SilcUInt32 *clients_count) { SilcIDCacheList list = NULL; SilcIDCacheEntry id_cache = NULL; @@ -413,7 +414,7 @@ int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname, int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, SilcHash md5hash, SilcClientEntry **clients, - uint32 *clients_count) + SilcUInt32 *clients_count) { SilcIDCacheList list = NULL; SilcIDCacheEntry id_cache = NULL; @@ -522,7 +523,7 @@ silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id, silc_free(client->id); client->id = new_id; - silc_idcache_add(id_list->clients, NULL, client->id, client, FALSE); + silc_idcache_add(id_list->clients, NULL, client->id, client, 0, NULL); SILC_LOG_DEBUG(("Replaced")); @@ -561,7 +562,8 @@ void silc_idlist_client_destructor(SilcIDCache cache, SilcChannelEntry silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, SilcChannelID *id, SilcServerEntry router, - SilcCipher channel_key, SilcHmac hmac) + SilcCipher channel_key, SilcHmac hmac, + int expire) { SilcChannelEntry channel; @@ -585,7 +587,7 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, NULL, NULL, NULL, TRUE); if (!silc_idcache_add(id_list->channels, channel->channel_name, - (void *)channel->id, (void *)channel, FALSE)) { + (void *)channel->id, (void *)channel, expire, NULL)) { silc_hmac_free(channel->hmac); silc_hash_table_free(channel->user_list); silc_free(channel); @@ -603,6 +605,9 @@ static void silc_idlist_del_channel_foreach(void *key, void *context, { SilcChannelClientEntry chl = (SilcChannelClientEntry)context; + SILC_LOG_DEBUG(("Removing client %s from channel %s", + chl->client->nickname, chl->channel->channel_name)); + /* Remove the context from the client's channel hash table as that table and channel's user_list hash table share this same context. */ silc_hash_table_del(chl->client->channels, chl->channel); @@ -621,6 +626,13 @@ int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry) if (!silc_idcache_del_by_id(id_list->channels, (void *)entry->id)) return FALSE; + /* Free all client entrys from the users list. The silc_hash_table_free + will free all the entries so they are not freed at the foreach + callback. */ + silc_hash_table_foreach(entry->user_list, silc_idlist_del_channel_foreach, + NULL); + silc_hash_table_free(entry->user_list); + /* Free data */ silc_free(entry->channel_name); silc_free(entry->id); @@ -637,13 +649,6 @@ int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry) silc_free(entry->hmac_name); silc_free(entry->rekey); - /* Free all client entrys from the users list. The silc_hash_table_free - will free all the entries so they are not freed at the foreach - callback. */ - silc_hash_table_foreach(entry->user_list, silc_idlist_del_channel_foreach, - NULL); - silc_hash_table_free(entry->user_list); - memset(entry, 'F', sizeof(*entry)); silc_free(entry); return TRUE; @@ -661,7 +666,7 @@ silc_idlist_find_channel_by_name(SilcIDList id_list, char *name, { SilcIDCacheEntry id_cache = NULL; - SILC_LOG_DEBUG(("Channel by name")); + SILC_LOG_DEBUG(("Channel by name %s", name)); if (!silc_idcache_find_by_name_one(id_list->channels, name, &id_cache)) return NULL; @@ -731,7 +736,7 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id, channel->id = new_id; silc_idcache_add(id_list->channels, channel->channel_name, channel->id, - channel, FALSE); + channel, 0, NULL); SILC_LOG_DEBUG(("Replaced")); @@ -743,7 +748,7 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id, SilcChannelEntry * silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id, - uint32 *channels_count) + SilcUInt32 *channels_count) { SilcIDCacheList list = NULL; SilcIDCacheEntry id_cache = NULL;