A LOT updates. Cannot separate. :)
[silc.git] / lib / silccore / idcache.c
index 87ac53c7a3d562b63142460e9d5326f6a18dcef6..9dc176f3c84401806870adab7decc839a0427924 100644 (file)
   GNU General Public License for more details.
 
 */
-/*
- * $Id$
- * $Log$
- * Revision 1.4  2000/07/17 11:46:36  priikone
- *     Added debug logging
- *
- * Revision 1.3  2000/07/12 05:54:01  priikone
- *     Major rewrite of whole ID Cache system.
- *
- * Revision 1.2  2000/07/05 06:06:35  priikone
- *     Global cosmetic change.
- *
- * Revision 1.1.1.1  2000/06/27 11:36:55  priikone
- *     Imported from internal CVS/Added Log headers.
- *
- *
- */
+/* $Id$ */
 
 #include "silcincludes.h"
 #include "idcache.h"
@@ -203,7 +187,7 @@ int silc_idcache_find_by_data(SilcIDCache cache, char *data,
       break;
 
     if (cache->cache[i].data && 
-       !memcmp(cache->cache[i].data, data, strlen(data)))
+       !memcmp(cache->cache[i].data, data, strlen(cache->cache[i].data)))
       silc_idcache_list_add(list, &(cache->cache[i]));
   }
 
@@ -236,7 +220,7 @@ int silc_idcache_find_by_data_one(SilcIDCache cache, char *data,
 
   for (i = i; i < cache->cache_count; i++)
     if (cache->cache[i].data && 
-       !memcmp(cache->cache[i].data, data, strlen(data))) {
+       !memcmp(cache->cache[i].data, data, strlen(cache->cache[i].data))) {
       if (ret)
        *ret = &(cache->cache[i]);
       return TRUE;
@@ -303,8 +287,8 @@ int silc_idcache_find_by_data_loose(SilcIDCache cache, char *data,
   return TRUE;
 }
 
-/* Find ID Cache entry by ID. Returns list of cache entries. */
-/* XXX this may be useless, need for list really? */
+/* Find ID Cache entry by ID. Returns list of cache entries. If `id' is
+   SILC_ID_CACHE_ANY this returns all ID's of type `type'. */
 
 int silc_idcache_find_by_id(SilcIDCache cache, void *id, SilcIdType type,
                            SilcIDCacheList *ret)
@@ -319,9 +303,15 @@ int silc_idcache_find_by_id(SilcIDCache cache, void *id, SilcIdType type,
 
   list = silc_idcache_list_alloc();
 
-  for (i = 0; i < cache->cache_count; i++)
-    if (cache->cache[i].id && !memcmp(cache->cache[i].id, id, id_len))
-      silc_idcache_list_add(list, &(cache->cache[i]));
+  if (id != SILC_ID_CACHE_ANY) {
+    for (i = 0; i < cache->cache_count; i++)
+      if (cache->cache[i].id && !memcmp(cache->cache[i].id, id, id_len))
+       silc_idcache_list_add(list, &(cache->cache[i]));
+  } else {
+    for (i = 0; i < cache->cache_count; i++)
+      if (cache->cache[i].id && cache->cache[i].type == type)
+       silc_idcache_list_add(list, &(cache->cache[i]));
+  }
 
   if (!silc_idcache_list_count(list))
     return FALSE;
@@ -408,7 +398,7 @@ int silc_idcache_add(SilcIDCache cache, char *data, SilcIdType id_type,
     return FALSE;
 
   for (i = 0; i < count; i++) {
-    if (c[i].data == NULL) {
+    if (c[i].data == NULL && c[i].id == NULL) {
       c[i].data = data;
       c[i].type = id_type;
       c[i].id = id;