updates. New data types.
[silc.git] / lib / silccore / idcache.c
index 6c836514941aeac007b2efe154c57babeb862083..caf6549fc45319a3e7be78c80ff78b0c3cb025d8 100644 (file)
@@ -42,7 +42,7 @@ static void silc_idcache_list_add(SilcIDCacheList list,
        Table of the cache entries allocated by silc_idcache_add function.
        This table is reallocated when new entry is added into the cache.
 
-   unsigned int cache_count
+   uint32 cache_count
 
        Number of cache entries in the cache.
 
@@ -71,7 +71,7 @@ static void silc_idcache_list_add(SilcIDCacheList list,
 */
 struct SilcIDCacheStruct {
   SilcIDCacheEntry cache;
-  unsigned int cache_count;
+  uint32 cache_count;
   int sorted;
   int fast_access[256];
   SilcIDCacheDestructor destructor;
@@ -94,15 +94,15 @@ struct SilcIDCacheStruct {
 struct SilcIDCacheListStruct {
   SilcIDCacheEntry cache[64];
   SilcIDCacheEntry *cache_dyn;
-  unsigned int cache_dyn_count;
-  unsigned int cache_count;
-  unsigned int pos;
+  uint32 cache_dyn_count;
+  uint32 cache_count;
+  uint32 pos;
 };
 
 /* Allocates new ID cache object. The initial amount of allocated entries
    can be sent as argument. If `count' is 0 the system uses default values. */
 
-SilcIDCache silc_idcache_alloc(unsigned int count,
+SilcIDCache silc_idcache_alloc(uint32 count,
                               SilcIDCacheDestructor destructor)
 {
   SilcIDCache cache;
@@ -200,12 +200,14 @@ int silc_idcache_find_by_data(SilcIDCache cache, unsigned char *data,
       break;
 
     if (cache->cache[i].data && 
-       !memcmp(cache->cache[i].data, data, strlen(cache->cache[i].data)))
+       !memcmp(cache->cache[i].data, data, cache->cache[i].data_len))
       silc_idcache_list_add(list, &(cache->cache[i]));
   }
 
-  if (!silc_idcache_list_count(list))
+  if (!silc_idcache_list_count(list)) {
+    silc_idcache_list_free(list);
     return FALSE;
+  }
 
   if (ret)
     *ret = list;
@@ -236,7 +238,7 @@ int silc_idcache_find_by_data_one(SilcIDCache cache, unsigned char *data,
 
   for (i = i; i < cache->cache_count; i++)
     if (cache->cache[i].data && 
-       !memcmp(cache->cache[i].data, data, strlen(cache->cache[i].data))) {
+       !memcmp(cache->cache[i].data, data, cache->cache[i].data_len)) {
       if (ret)
        *ret = &(cache->cache[i]);
       return TRUE;
@@ -295,8 +297,10 @@ int silc_idcache_find_by_data_loose(SilcIDCache cache, unsigned char *data,
     }
   }
     
-  if (!silc_idcache_list_count(list))
+  if (!silc_idcache_list_count(list)) {
+    silc_idcache_list_free(list);
     return FALSE;
+  }
 
   if (ret)
     *ret = list;
@@ -332,8 +336,10 @@ int silc_idcache_find_by_id(SilcIDCache cache, void *id, SilcIdType type,
        silc_idcache_list_add(list, &(cache->cache[i]));
   }
 
-  if (!silc_idcache_list_count(list))
+  if (!silc_idcache_list_count(list)) {
+    silc_idcache_list_free(list);
     return FALSE;
+  }
 
   if (ret)
     *ret = list;
@@ -391,12 +397,12 @@ int silc_idcache_find_by_context(SilcIDCache cache, void *context,
    however, it is not mandatory. */
 
 int silc_idcache_add(SilcIDCache cache, unsigned char *data, 
-                    SilcIdType id_type, void *id, void *context, int sort,
-                    int expire)
+                    uint32 data_len, SilcIdType id_type, void *id, 
+                    void *context, int sort, int expire)
 {
   int i;
-  unsigned int count;
-  unsigned long curtime = time(NULL);
+  uint32 count;
+  uint32 curtime = time(NULL);
   SilcIDCacheEntry c;
 
   if (!cache || !cache->cache)
@@ -420,6 +426,7 @@ int silc_idcache_add(SilcIDCache cache, unsigned char *data,
   for (i = 0; i < count; i++) {
     if (c[i].data == NULL && c[i].id == NULL) {
       c[i].data = data;
+      c[i].data_len = data_len;
       c[i].type = id_type;
       c[i].id = id;
       c[i].expire = (expire ? (curtime + SILC_ID_CACHE_EXPIRE) : 0);
@@ -435,6 +442,7 @@ int silc_idcache_add(SilcIDCache cache, unsigned char *data,
       c[i].id = NULL;
     }
     c[count].data = data;
+    c[count].data_len = data_len;
     c[count].type = id_type;
     c[count].id = id;
     c[count].expire = (expire ? (curtime + SILC_ID_CACHE_EXPIRE) : 0);
@@ -512,7 +520,7 @@ int silc_idcache_del_all(SilcIDCache cache)
 int silc_idcache_purge(SilcIDCache cache)
 {
   SilcIDCacheEntry c;
-  unsigned long curtime = time(NULL);
+  uint32 curtime = time(NULL);
   int i;
 
   if (!cache || !cache->cache)
@@ -521,7 +529,7 @@ int silc_idcache_purge(SilcIDCache cache)
   c = cache->cache;
 
   for (i = 0; i < cache->cache_count; i++) {
-    if (c[i].data && c[i].expire < curtime) {
+    if (c[i].data && c[i].expire && c[i].expire < curtime) {
 
       /* Call the destructor */
       if (cache->destructor)