updates. New data types.
[silc.git] / apps / silcd / idlist.c
index b5c17daf5627dd5b9e79f2063538d4085b01a66c..7e4aa75257292d51b3a7afed46cd03d416166621 100644 (file)
@@ -40,7 +40,6 @@ void silc_idlist_add_data(void *entry, SilcIDListData idata)
   data->hmac = idata->hmac;
   data->hmac_key = idata->hmac_key;
   data->hmac_key_len = idata->hmac_key_len;
-  data->pkcs = idata->pkcs;
   data->public_key = idata->public_key;
   data->last_receive = idata->last_receive;
   data->last_sent = idata->last_sent;
@@ -62,8 +61,6 @@ void silc_idlist_del_data(void *entry)
     memset(idata->hmac_key, 0, idata->hmac_key_len);
     silc_free(idata->hmac_key);
   }
-  if (idata->pkcs)
-    silc_pkcs_free(idata->pkcs);
   if (idata->public_key)
     silc_pkcs_public_key_free(idata->public_key);
 }
@@ -251,13 +248,14 @@ silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
 
 /* Removes and free's server entry from ID list */
 
-void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry)
+int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry)
 {
   if (entry) {
     /* Remove from cache */
     if (entry->id)
-      silc_idcache_del_by_id(id_list->servers, SILC_ID_SERVER, 
-                            (void *)entry->id);
+      if (!silc_idcache_del_by_id(id_list->servers, SILC_ID_SERVER, 
+                                 (void *)entry->id))
+       return FALSE;
 
     /* Free data */
     if (entry->server_name)
@@ -267,7 +265,10 @@ void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry)
 
     memset(entry, 'F', sizeof(*entry));
     silc_free(entry);
+    return TRUE;
   }
+
+  return FALSE;
 }
 
 /******************************************************************************
@@ -287,7 +288,7 @@ void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry)
 
 SilcClientEntry
 silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname, 
-                      unsigned int nickname_len, char *username, 
+                      uint32 nickname_len, char *username, 
                       char *userinfo, SilcClientID *id, 
                       SilcServerEntry router, void *connection)
 {
@@ -349,35 +350,36 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry)
 /* Returns all clients matching requested nickname. Number of clients is
    returned to `clients_count'. Caller must free the returned table. */
 
-SilcClientEntry *
-silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
-                                   char *server, unsigned int *clients_count)
+int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
+                                       char *server, 
+                                       SilcClientEntry **clients,
+                                       uint32 *clients_count)
 {
   SilcIDCacheList list = NULL;
   SilcIDCacheEntry id_cache = NULL;
-  SilcClientEntry *clients;
   int i;
 
   SILC_LOG_DEBUG(("Start"));
 
   if (!silc_idcache_find_by_data(id_list->clients, nickname, &list))
-    return NULL;
+    return FALSE;
 
-  clients = silc_calloc(silc_idcache_list_count(list), sizeof(*clients));
+  *clients = silc_realloc(*clients, 
+                         (silc_idcache_list_count(list) + *clients_count) * 
+                         sizeof(**clients));
 
   i = 0;
   silc_idcache_list_first(list, &id_cache);
-  clients[i++] = (SilcClientEntry)id_cache->context;
+  (*clients)[i++] = (SilcClientEntry)id_cache->context;
 
   while (silc_idcache_list_next(list, &id_cache))
-    clients[i++] = (SilcClientEntry)id_cache->context;
+    (*clients)[i++] = (SilcClientEntry)id_cache->context;
   
   silc_idcache_list_free(list);
   
-  if (clients_count)
-    *clients_count = i;
+  *clients_count += i;
 
-  return clients;
+  return TRUE;
 }
 
 /* Returns all clients matching requested nickname. Number of clients is
@@ -385,16 +387,15 @@ silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
 /* XXX This actually checks the data, which can be hash of the nickname
    but is not if the client is local client. Global client on global
    list may have hash.  Thus, this is not fully reliable function.
-   Instead this should probably check the hash from the lists client ID's. */
+   Instead this should probably check the hash from the list of client ID's. */
 
-SilcClientEntry *
-silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
-                               SilcHash md5hash,
-                               unsigned int *clients_count)
+int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
+                                   SilcHash md5hash,
+                                   SilcClientEntry **clients,
+                                   uint32 *clients_count)
 {
   SilcIDCacheList list = NULL;
   SilcIDCacheEntry id_cache = NULL;
-  SilcClientEntry *clients;
   unsigned char hash[32];
   int i;
 
@@ -403,69 +404,24 @@ silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
   silc_hash_make(md5hash, nickname, strlen(nickname), hash);
 
   if (!silc_idcache_find_by_data(id_list->clients, hash, &list))
-    return NULL;
+    return FALSE;
 
-  clients = silc_calloc(silc_idcache_list_count(list), sizeof(*clients));
+  *clients = silc_realloc(*clients, 
+                         (silc_idcache_list_count(list) + *clients_count) * 
+                         sizeof(**clients));
 
   i = 0;
   silc_idcache_list_first(list, &id_cache);
-  clients[i++] = (SilcClientEntry)id_cache->context;
+  (*clients)[i++] = (SilcClientEntry)id_cache->context;
 
   while (silc_idcache_list_next(list, &id_cache))
-    clients[i++] = (SilcClientEntry)id_cache->context;
+    (*clients)[i++] = (SilcClientEntry)id_cache->context;
   
   silc_idcache_list_free(list);
   
-  if (clients_count)
-    *clients_count = i;
-
-  return clients;
-}
-
-/* Finds client entry by nickname. */
-
-SilcClientEntry
-silc_idlist_find_client_by_nickname(SilcIDList id_list, char *nickname,
-                                   char *server, SilcIDCacheEntry *ret_entry)
-{
-  SilcIDCacheList list = NULL;
-  SilcIDCacheEntry id_cache = NULL;
-  SilcClientEntry client = NULL;
-
-  SILC_LOG_DEBUG(("Client by nickname"));
+  *clients_count += i;
 
-  if (server) {
-    if (!silc_idcache_find_by_data(id_list->clients, nickname, &list))
-      return NULL;
-
-#if 0
-    while (silc_idcache_list_next(list, &id_cache)) {
-      client = (SilcClientEntry)id_cache->context;
-
-      if (!strcmp(server, XXX, strlen(server)))
-       break;
-
-      client = NULL;
-    }
-#endif
-
-   silc_idcache_list_free(list);
-
-   if (!client)
-     return NULL;
-  } else {
-    if (!silc_idcache_find_by_data_one(id_list->clients, nickname, &id_cache))
-      return NULL;
-
-    client = (SilcClientEntry)id_cache->context;
-
-    if (ret_entry)
-      *ret_entry = id_cache;
-  }
-
-  SILC_LOG_DEBUG(("Found"));
-
-  return client;
+  return TRUE;
 }
 
 /* Finds client by nickname hash. */
@@ -675,6 +631,12 @@ int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry)
       memset(entry->key, 0, entry->key_len / 8);
       silc_free(entry->key);
     }
+    if (entry->cipher)
+      silc_free(entry->cipher);
+    if (entry->hmac_name)
+      silc_free(entry->hmac_name);
+    if (entry->rekey)
+      silc_free(entry->rekey);
 
     /* Free all data, free also any reference from the client's channel
        list since they share the same memory. */
@@ -789,7 +751,7 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
 
 SilcChannelEntry *
 silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
-                        unsigned int *channels_count)
+                        uint32 *channels_count)
 {
   SilcIDCacheList list = NULL;
   SilcIDCacheEntry id_cache = NULL;