+
+/* Returns channels from the ID list. If the `channel_id' is NULL then
+ all channels are returned. */
+
+SilcChannelEntry *
+silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
+ SilcUInt32 *channels_count)
+{
+ SilcIDCacheList list = NULL;
+ SilcIDCacheEntry id_cache = NULL;
+ SilcChannelEntry *channels = NULL;
+ int i = 0;
+
+ SILC_LOG_DEBUG(("Start"));
+
+ if (!channel_id) {
+ if (!silc_idcache_get_all(id_list->channels, &list))
+ return NULL;
+
+ channels = silc_calloc(silc_idcache_list_count(list), sizeof(*channels));
+
+ i = 0;
+ silc_idcache_list_first(list, &id_cache);
+ channels[i++] = (SilcChannelEntry)id_cache->context;
+
+ while (silc_idcache_list_next(list, &id_cache))
+ channels[i++] = (SilcChannelEntry)id_cache->context;
+
+ silc_idcache_list_free(list);
+ } else {
+ if (!silc_idcache_find_by_id_one(id_list->channels, channel_id, &id_cache))
+ return NULL;
+
+ i = 1;
+ channels = silc_calloc(1, sizeof(*channels));
+ channels[0] = (SilcChannelEntry)id_cache->context;
+ }
+
+ if (channels_count)
+ *channels_count = i;
+
+ return channels;
+}