X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Fsilcd%2Fidlist.c;h=9acdd06844330fd6b2e7f93baaa55d344aa68687;hp=c9599deb2ed21ff1236496e9a8007689dc81a23e;hb=382d15d447b7a95390decfa783836ae4fe255b3d;hpb=a93321c8c98c4a84f5b3aefbb4f013d8978ec9b8 diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index c9599deb..9acdd068 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -90,13 +90,13 @@ void silc_idlist_del_data(void *entry) SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge) { + SilcServer server = app_context; SilcIDListPurge i = (SilcIDListPurge)context; - SILC_LOG_DEBUG(("Start")); + SILC_LOG_DEBUG(("Purging cache")); silc_idcache_purge(i->cache); - silc_schedule_task_add(i->schedule, 0, - silc_idlist_purge, + silc_schedule_task_add(server->schedule, 0, silc_idlist_purge, (void *)i, i->timeout, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW); } @@ -159,13 +159,13 @@ silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id, server = (SilcServerEntry)id_cache->context; - if (ret_entry) - *ret_entry = id_cache; - if (server && registered && !(server->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; + if (ret_entry) + *ret_entry = id_cache; + SILC_LOG_DEBUG(("Found")); return server; @@ -187,13 +187,13 @@ silc_idlist_find_server_by_name(SilcIDList id_list, char *name, server = (SilcServerEntry)id_cache->context; - if (ret_entry) - *ret_entry = id_cache; - if (server && registered && !(server->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; + if (ret_entry) + *ret_entry = id_cache; + SILC_LOG_DEBUG(("Found")); return server; @@ -227,7 +227,7 @@ silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname, if (sock && ((sock->hostname && !strcasecmp(sock->hostname, hostname)) || (sock->ip && !strcasecmp(sock->ip, hostname))) - && sock->port == port) + && server->id->port == htons(port)) break; id_cache = NULL; @@ -239,13 +239,13 @@ silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname, silc_idcache_list_free(list); - if (ret_entry) - *ret_entry = id_cache; - if (server && registered && !(server->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; + if (ret_entry) + *ret_entry = id_cache; + SILC_LOG_DEBUG(("Found")); return server; @@ -290,13 +290,16 @@ silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id, int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry) { - SILC_LOG_DEBUG(("Start")); - if (entry) { /* Remove from cache */ if (!silc_idcache_del_by_context(id_list->servers, entry)) return FALSE; + SILC_LOG_DEBUG(("Deleting server %s id %s", entry->server_name ? + entry->server_name : "", + entry->id ? + silc_id_render(entry->id, SILC_ID_SERVER) : "")); + /* Free data */ silc_free(entry->server_name); silc_free(entry->id); @@ -367,12 +370,15 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry) if (!silc_idcache_del_by_context(id_list->clients, entry)) return FALSE; + assert(!silc_hash_table_count(entry->channels)); + /* Free data */ silc_free(entry->nickname); silc_free(entry->servername); silc_free(entry->username); silc_free(entry->userinfo); silc_free(entry->id); + silc_free(entry->attrs); silc_hash_table_free(entry->channels); memset(entry, 'F', sizeof(*entry)); @@ -490,13 +496,13 @@ silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id, client = (SilcClientEntry)id_cache->context; - if (ret_entry) - *ret_entry = id_cache; - if (client && registered && !(client->data.status & SILC_IDLIST_STATUS_REGISTERED)) return NULL; + if (ret_entry) + *ret_entry = id_cache; + SILC_LOG_DEBUG(("Found")); return client; @@ -567,10 +573,12 @@ void silc_idlist_client_destructor(SilcIDCache cache, client = (SilcClientEntry)entry->context; if (client) { + assert(!silc_hash_table_count(client->channels)); silc_free(client->nickname); silc_free(client->username); silc_free(client->userinfo); silc_free(client->id); + silc_free(client->attrs); silc_hash_table_free(client->channels); memset(client, 'A', sizeof(*client)); @@ -604,7 +612,7 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, channel->router = router; channel->channel_key = channel_key; channel->hmac = hmac; - channel->created = time(0); + channel->created = channel->updated = time(0); if (!channel->hmac) if (!silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac)) { silc_free(channel); @@ -634,7 +642,8 @@ 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)); + chl->client->nickname ? chl->client->nickname : + (unsigned char *)"", 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. */ @@ -647,12 +656,12 @@ static void silc_idlist_del_channel_foreach(void *key, void *context, int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry) { if (entry) { - SILC_LOG_DEBUG(("Deleting channel %s", entry->channel_name)); - /* Remove from cache */ if (!silc_idcache_del_by_context(id_list->channels, entry)) return FALSE; + SILC_LOG_DEBUG(("Deleting channel %s", entry->channel_name)); + /* 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. */ @@ -664,6 +673,12 @@ int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry) silc_free(entry->channel_name); silc_free(entry->id); silc_free(entry->topic); + + if (entry->invite_list) + silc_hash_table_free(entry->invite_list); + if (entry->ban_list) + silc_hash_table_free(entry->ban_list); + if (entry->channel_key) silc_cipher_free(entry->channel_key); if (entry->key) { @@ -705,6 +720,9 @@ silc_idlist_find_channel_by_name(SilcIDList id_list, char *name, SILC_LOG_DEBUG(("Found")); + /* Touch channel */ + ((SilcChannelEntry)id_cache->context)->updated = time(NULL); + return id_cache->context; } @@ -733,6 +751,9 @@ silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id, SILC_LOG_DEBUG(("Found")); + /* Touch channel */ + channel->updated = time(NULL); + return channel; } @@ -769,6 +790,9 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id, SILC_LOG_DEBUG(("Replaced")); + /* Touch channel */ + channel->updated = time(NULL); + return channel; }