return FALSE;
if (new_id) {
- if (!silc_hash_table_del_by_context(cache->id_table, entry->id, entry))
- return FALSE;
+ if (entry->id) {
+ if (!silc_hash_table_del_by_context(cache->id_table, entry->id, entry))
+ return FALSE;
- if (cache->id_type == SILC_ID_CLIENT)
- *(SilcClientID *)entry->id = *(SilcClientID *)new_id;
- if (cache->id_type == SILC_ID_SERVER)
- *(SilcServerID *)entry->id = *(SilcServerID *)new_id;
- if (cache->id_type == SILC_ID_CHANNEL)
- *(SilcChannelID *)entry->id = *(SilcChannelID *)new_id;
+ if (cache->id_type == SILC_ID_CLIENT)
+ *(SilcClientID *)entry->id = *(SilcClientID *)new_id;
+ if (cache->id_type == SILC_ID_SERVER)
+ *(SilcServerID *)entry->id = *(SilcServerID *)new_id;
+ if (cache->id_type == SILC_ID_CHANNEL)
+ *(SilcChannelID *)entry->id = *(SilcChannelID *)new_id;
+ } else {
+ entry->id = new_id;
+ }
if (!silc_hash_table_add(cache->id_table, entry->id, entry))
return FALSE;
* DESCRIPTION
*
* Updates cache `entry' with new values. If the `new_id' is non-NULL
- * then the new value will be copied over the old value in the `entry'.
+ * then the new value will be copied over the old value in the `entry'
+ * unless the ID doesn't exist, when the `new_id' will be stored in `entry'.
* If the `new_name' is non-NULL then the `entry' will be updated with
* `new_name'. The caller is responsible of freeing the old name if it
* was updated with new one. The old ID value does not need to be freed