X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_entry.c;h=017f8f8a7aebed168f14779bff0149df5d0b944b;hp=bdcdd1cabe47843af73bb0195e3ba335b477b5b1;hb=HEAD;hpb=90e14dc985628e0b0f86e604d511039d302dc956 diff --git a/lib/silcclient/client_entry.c b/lib/silcclient/client_entry.c index bdcdd1ca..017f8f8a 100644 --- a/lib/silcclient/client_entry.c +++ b/lib/silcclient/client_entry.c @@ -85,13 +85,8 @@ SilcDList silc_client_get_clients_local_ext(SilcClient client, if (!silc_client_nickname_parse(client, conn, (char *)nick, &parsed)) return NULL; - if (!get_all && parsed) + if (!get_all) format = (char *)nick; - if (!parsed) { - parsed = silc_memdup(nick, strlen(nick)); - if (!parsed) - return NULL; - } SILC_LOG_DEBUG(("Find clients by nickname %s", parsed)); @@ -124,7 +119,7 @@ SilcDList silc_client_get_clients_local_ext(SilcClient client, } silc_list_start(list); - if (!format && get_all) { + if (get_all) { /* Take all without any further checking */ while ((id_cache = silc_list_get(list))) { entry = id_cache->context; @@ -517,7 +512,6 @@ SilcUInt16 silc_client_get_clients_by_list(SilcClient client, SilcUInt32 *res_argv_lens = NULL, *res_argv_types = NULL, res_argc = 0; SilcUInt16 idp_len, cmd_ident; SilcID id; - va_list tmp; int i; SILC_LOG_DEBUG(("Resolve clients from Client ID list")); @@ -585,7 +579,7 @@ SilcUInt16 silc_client_get_clients_by_list(SilcClient client, /* We have the clients in cache, get them and call the completion */ silc_client_get_clients_list_cb(client, conn, SILC_COMMAND_WHOIS, - SILC_STATUS_OK, SILC_STATUS_OK, in, tmp); + SILC_STATUS_OK, SILC_STATUS_OK, in, NULL); return 0; err: @@ -811,8 +805,8 @@ SilcClientEntry silc_client_add_client(SilcClient client, client_entry->hostname, sizeof(client_entry->hostname)); - client_entry->channels = silc_hash_table_alloc(1, silc_hash_ptr, NULL, NULL, - NULL, NULL, NULL, TRUE); + client_entry->channels = silc_hash_table_alloc(NULL, 1, silc_hash_ptr, NULL, + NULL, NULL, NULL, NULL, TRUE); if (!client_entry->channels) { silc_free(client_entry->realname); silc_free(client_entry); @@ -1010,16 +1004,15 @@ SilcBool silc_client_del_client(SilcClient client, SilcClientConnection conn, if (!client_entry) return FALSE; - if (silc_atomic_sub_int32(&client_entry->internal.deleted, 1) != 0) - { - SILC_LOG_DEBUG(("** WARNING ** Deleting a client twice %p", client_entry)); -// asm("int3"); - return FALSE; + SILC_LOG_DEBUG(("Marking client entry %p deleted")); + + if (silc_atomic_sub_int32(&client_entry->internal.deleted, 1) != 0) { + SILC_LOG_DEBUG(("Client entry %p already marked deleted")); + return FALSE; } silc_client_unref_client(client, conn, client_entry); return TRUE; - } /* Internal routine used to find client by ID and if not found this creates @@ -1075,31 +1068,32 @@ SilcClientEntry silc_client_ref_client(SilcClient client, void silc_client_unref_client(SilcClient client, SilcClientConnection conn, SilcClientEntry client_entry) { - if (client_entry) { - SilcBool ret; + SilcBool ret; - SILC_LOG_DEBUG(("Client %p refcnt %d->%d", client_entry, - silc_atomic_get_int32(&client_entry->internal.refcnt), - silc_atomic_get_int32(&client_entry->internal.refcnt) - 1)); + if (!client_entry) + return; - if (silc_atomic_sub_int32(&client_entry->internal.refcnt, 1) > 0) - return; - - SILC_LOG_DEBUG(("Deleting client %p (%d)", client_entry, - silc_atomic_get_int32(&client_entry->internal.deleted))); + SILC_LOG_DEBUG(("Client %p refcnt %d->%d", client_entry, + silc_atomic_get_int32(&client_entry->internal.refcnt), + silc_atomic_get_int32(&client_entry->internal.refcnt) - 1)); - silc_mutex_lock(conn->internal->lock); - ret = silc_idcache_del_by_context(conn->internal->client_cache, - client_entry, NULL); - silc_mutex_unlock(conn->internal->lock); + if (silc_atomic_sub_int32(&client_entry->internal.refcnt, 1) > 0) + return; - if (ret) { - /* Remove from channels */ - silc_client_remove_from_channels(client, conn, client_entry); + SILC_LOG_DEBUG(("Deleting client %p (%d)", client_entry, + silc_atomic_get_int32(&client_entry->internal.deleted))); - /* Free the client entry data */ - silc_client_del_client_entry(client, conn, client_entry); - } + silc_mutex_lock(conn->internal->lock); + ret = silc_idcache_del_by_context(conn->internal->client_cache, + client_entry, NULL); + silc_mutex_unlock(conn->internal->lock); + + if (ret) { + /* Remove from channels */ + silc_client_remove_from_channels(client, conn, client_entry); + + /* Free the client entry data */ + silc_client_del_client_entry(client, conn, client_entry); } } @@ -1311,7 +1305,7 @@ SilcBool silc_client_nickname_parse(SilcClient client, int len; if (!client->internal->params->nickname_format[0]) { - *ret_nick = NULL; + *ret_nick = silc_strdup(nickname); return TRUE; } @@ -1656,7 +1650,7 @@ SilcChannelEntry silc_client_add_channel(SilcClient client, return NULL; } - channel->user_list = silc_hash_table_alloc(1, silc_hash_ptr, NULL, NULL, + channel->user_list = silc_hash_table_alloc(NULL, 1, silc_hash_ptr, NULL, NULL, NULL, NULL, NULL, TRUE); if (!channel->user_list) { silc_rwlock_free(channel->internal.lock); @@ -1706,14 +1700,17 @@ SilcChannelEntry silc_client_add_channel(SilcClient client, SilcBool silc_client_del_channel(SilcClient client, SilcClientConnection conn, SilcChannelEntry channel) { + if (!channel) return FALSE; - if (silc_atomic_sub_int32(&channel->internal.deleted, 1) > 0) - { - SILC_LOG_DEBUG(("** WARNING ** Deleting a channel twice %p", channel)); -// asm("int3"); + SILC_LOG_DEBUG(("Marking channel entry %p deleted")); + + + if (silc_atomic_sub_int32(&channel->internal.deleted, 1) != 0) { + SILC_LOG_DEBUG(("Channel entry %p already marked deleted")); return FALSE; + silc_client_del_channel_private_keys(client, conn, channel); } silc_client_unref_channel(client, conn, channel); @@ -1781,70 +1778,71 @@ SilcChannelEntry silc_client_ref_channel(SilcClient client, void silc_client_unref_channel(SilcClient client, SilcClientConnection conn, SilcChannelEntry channel_entry) { - if (channel_entry) { - SilcIDCacheEntry id_cache; - SilcBool ret = TRUE; - SilcCipher key; - SilcHmac hmac; - char *namec; - - SILC_LOG_DEBUG(("Channel %p refcnt %d->%d", channel_entry, - silc_atomic_get_int32(&channel_entry->internal.refcnt), - silc_atomic_get_int32(&channel_entry->internal.refcnt) - - 1)); + SilcIDCacheEntry id_cache; + SilcBool ret = TRUE; + SilcCipher key; + SilcHmac hmac; + char *namec; - if (silc_atomic_sub_int32(&channel_entry->internal.refcnt, 1) > 0) - return; + if (!channel_entry) + return; - SILC_LOG_DEBUG(("Deleting channel %p", channel_entry)); + SILC_LOG_DEBUG(("Channel %p refcnt %d->%d", channel_entry, + silc_atomic_get_int32(&channel_entry->internal.refcnt), + silc_atomic_get_int32(&channel_entry->internal.refcnt) + - 1)); - silc_mutex_lock(conn->internal->lock); - if (silc_idcache_find_by_context(conn->internal->channel_cache, channel_entry, + if (silc_atomic_sub_int32(&channel_entry->internal.refcnt, 1) > 0) + return; + + SILC_LOG_DEBUG(("Deleting channel %p", channel_entry)); + + silc_mutex_lock(conn->internal->lock); + if (silc_idcache_find_by_context(conn->internal->channel_cache, channel_entry, &id_cache)) { - namec = id_cache->name; - ret = silc_idcache_del_by_context(conn->internal->channel_cache, + namec = id_cache->name; + ret = silc_idcache_del_by_context(conn->internal->channel_cache, channel_entry, NULL); - silc_free(namec); - } - silc_mutex_unlock(conn->internal->lock); + silc_free(namec); + } + silc_mutex_unlock(conn->internal->lock); - if (!ret) - return; + if (!ret) + return; - silc_client_empty_channel(client, conn, channel_entry); - silc_client_del_channel_private_keys(client, conn, channel_entry); - silc_hash_table_free(channel_entry->user_list); - silc_free(channel_entry->channel_name); - silc_free(channel_entry->topic); - if (channel_entry->founder_key) - silc_pkcs_public_key_free(channel_entry->founder_key); - if (channel_entry->internal.send_key) - silc_cipher_free(channel_entry->internal.send_key); - if (channel_entry->internal.receive_key) - silc_cipher_free(channel_entry->internal.receive_key); - if (channel_entry->internal.hmac) - silc_hmac_free(channel_entry->internal.hmac); - if (channel_entry->internal.old_channel_keys) { - silc_dlist_start(channel_entry->internal.old_channel_keys); - while ((key = silc_dlist_get(channel_entry->internal.old_channel_keys))) - silc_cipher_free(key); - silc_dlist_uninit(channel_entry->internal.old_channel_keys); - } - if (channel_entry->internal.old_hmacs) { - silc_dlist_start(channel_entry->internal.old_hmacs); - while ((hmac = silc_dlist_get(channel_entry->internal.old_hmacs))) - silc_hmac_free(hmac); - silc_dlist_uninit(channel_entry->internal.old_hmacs); - } - if (channel_entry->channel_pubkeys) - silc_argument_list_free(channel_entry->channel_pubkeys, + silc_client_empty_channel(client, conn, channel_entry); + silc_client_del_channel_private_keys(client, conn, channel_entry); + silc_hash_table_free(channel_entry->user_list); + silc_free(channel_entry->channel_name); + silc_free(channel_entry->topic); + if (channel_entry->founder_key) + silc_pkcs_public_key_free(channel_entry->founder_key); + if (channel_entry->internal.send_key) + silc_cipher_free(channel_entry->internal.send_key); + if (channel_entry->internal.receive_key) + silc_cipher_free(channel_entry->internal.receive_key); + if (channel_entry->internal.hmac) + silc_hmac_free(channel_entry->internal.hmac); + if (channel_entry->internal.old_channel_keys) { + silc_dlist_start(channel_entry->internal.old_channel_keys); + while ((key = silc_dlist_get(channel_entry->internal.old_channel_keys))) + silc_cipher_free(key); + silc_dlist_uninit(channel_entry->internal.old_channel_keys); + } + if (channel_entry->internal.old_hmacs) { + silc_dlist_start(channel_entry->internal.old_hmacs); + while ((hmac = silc_dlist_get(channel_entry->internal.old_hmacs))) + silc_hmac_free(hmac); + silc_dlist_uninit(channel_entry->internal.old_hmacs); + } + if (channel_entry->channel_pubkeys) + silc_argument_list_free(channel_entry->channel_pubkeys, SILC_ARGUMENT_PUBLIC_KEY); - silc_atomic_uninit32(&channel_entry->internal.deleted); - silc_atomic_uninit32(&channel_entry->internal.refcnt); - silc_rwlock_free(channel_entry->internal.lock); - silc_schedule_task_del_by_context(conn->client->schedule, channel_entry); - silc_free(channel_entry); - } + silc_atomic_uninit32(&channel_entry->internal.deleted); + silc_atomic_uninit32(&channel_entry->internal.refcnt); + silc_rwlock_free(channel_entry->internal.lock); + silc_schedule_task_del_by_context(conn->client->schedule, channel_entry); + silc_free(channel_entry); } /* Free channel entry list */