Integer type name change.
[silc.git] / apps / silcd / idlist.c
index 0360ad3713ea19887d1f7fc6482d83fcab5b9e32..110fa3cf5f3e20123ad0e1c23a64715789f7e4b7 100644 (file)
@@ -36,14 +36,19 @@ void silc_idlist_add_data(void *entry, SilcIDListData idata)
   SilcIDListData data = (SilcIDListData)entry;
   data->send_key = idata->send_key;
   data->receive_key = idata->receive_key;
-  data->rekey = idata->rekey;
-  data->hash = idata->hash;
   data->hmac_send = idata->hmac_send;
   data->hmac_receive = idata->hmac_receive;
+  data->psn_send = idata->psn_send;
+  data->psn_receive = idata->psn_receive;
+  data->hash = idata->hash;
   data->public_key = idata->public_key;
+  memcpy(data->fingerprint, idata->fingerprint, sizeof(data->fingerprint));
+  data->rekey = idata->rekey;
   data->last_receive = idata->last_receive;
   data->last_sent = idata->last_sent;
   data->status = idata->status;
+
+  data->created = time(0);     /* Update creation time */
 }
 
 /* Free's all data in the common ID entry data structure. */
@@ -62,8 +67,12 @@ void silc_idlist_del_data(void *entry)
     }
     silc_free(idata->rekey);
   }
-  if (idata->hmac_send)                /* Same as idata->hmac_receive */
+  if (idata->hmac_send)
     silc_hmac_free(idata->hmac_send);
+  if (idata->hmac_receive)
+    silc_hmac_free(idata->hmac_receive);
+  if (idata->hash)
+    silc_hash_free(idata->hash);
   if (idata->public_key)
     silc_pkcs_public_key_free(idata->public_key);
 }
@@ -79,7 +88,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge)
   silc_idcache_purge(i->cache);
   silc_schedule_task_add(i->schedule, 0, 
                         silc_idlist_purge,
-                        (void *)i, 600, 0,
+                        (void *)i, i->timeout, 0,
                         SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
 }
 
@@ -112,7 +121,7 @@ silc_idlist_add_server(SilcIDList id_list,
   server->connection = connection;
 
   if (!silc_idcache_add(id_list->servers, server->server_name, 
-                       (void *)server->id, (void *)server, FALSE)) {
+                       (void *)server->id, (void *)server, 0, NULL)) {
     silc_free(server);
     return NULL;
   }
@@ -261,7 +270,7 @@ silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
   server->id = new_id;
 
   silc_idcache_add(id_list->servers, server->server_name, server->id, 
-                  server, FALSE);
+                  server, 0, NULL);
 
   SILC_LOG_DEBUG(("Found"));
 
@@ -281,10 +290,8 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry)
        return FALSE;
 
     /* Free data */
-    if (entry->server_name)
-      silc_free(entry->server_name);
-    if (entry->id)
-      silc_free(entry->id);
+    silc_free(entry->server_name);
+    silc_free(entry->id);
 
     memset(entry, 'F', sizeof(*entry));
     silc_free(entry);
@@ -312,7 +319,8 @@ int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry)
 SilcClientEntry
 silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, 
                       char *userinfo, SilcClientID *id, 
-                      SilcServerEntry router, void *connection)
+                      SilcServerEntry router, void *connection,
+                      int expire)
 {
   SilcClientEntry client;
 
@@ -329,7 +337,7 @@ silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
                                           NULL, NULL, NULL, NULL, TRUE);
 
   if (!silc_idcache_add(id_list->clients, nickname, (void *)client->id, 
-                       (void *)client, FALSE)) {
+                       (void *)client, expire, NULL)) {
     silc_hash_table_free(client->channels);
     silc_free(client);
     return NULL;
@@ -352,14 +360,11 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry)
        return FALSE;
 
     /* Free data */
-    if (entry->nickname)
-      silc_free(entry->nickname);
-    if (entry->username)
-      silc_free(entry->username);
-    if (entry->userinfo)
-      silc_free(entry->userinfo);
-    if (entry->id)
-      silc_free(entry->id);
+    silc_free(entry->nickname);
+    silc_free(entry->username);
+    silc_free(entry->userinfo);
+    silc_free(entry->id);
+    silc_hash_table_free(entry->channels);
 
     memset(entry, 'F', sizeof(*entry));
     silc_free(entry);
@@ -376,7 +381,7 @@ int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry)
 int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
                                        char *server, 
                                        SilcClientEntry **clients,
-                                       uint32 *clients_count)
+                                       SilcUInt32 *clients_count)
 {
   SilcIDCacheList list = NULL;
   SilcIDCacheEntry id_cache = NULL;
@@ -409,7 +414,7 @@ int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
 int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
                                    SilcHash md5hash,
                                    SilcClientEntry **clients,
-                                   uint32 *clients_count)
+                                   SilcUInt32 *clients_count)
 {
   SilcIDCacheList list = NULL;
   SilcIDCacheEntry id_cache = NULL;
@@ -518,7 +523,7 @@ silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
   silc_free(client->id);
   client->id = new_id;
 
-  silc_idcache_add(id_list->clients, NULL, client->id, client, FALSE);
+  silc_idcache_add(id_list->clients, NULL, client->id, client, 0, NULL);
 
   SILC_LOG_DEBUG(("Replaced"));
 
@@ -532,18 +537,13 @@ void silc_idlist_client_destructor(SilcIDCache cache,
 {
   SilcClientEntry client;
 
-  SILC_LOG_DEBUG(("Start"));
-
   client = (SilcClientEntry)entry->context;
   if (client) {
-    if (client->nickname)
-      silc_free(client->nickname);
-    if (client->username)
-      silc_free(client->username);
-    if (client->userinfo)
-      silc_free(client->userinfo);
-    if (client->id)
-      silc_free(client->id);
+    silc_free(client->nickname);
+    silc_free(client->username);
+    silc_free(client->userinfo);
+    silc_free(client->id);
+    silc_hash_table_free(client->channels);
 
     memset(client, 'F', sizeof(*client));
     silc_free(client);
@@ -562,7 +562,8 @@ void silc_idlist_client_destructor(SilcIDCache cache,
 SilcChannelEntry
 silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
                        SilcChannelID *id, SilcServerEntry router,
-                       SilcCipher channel_key, SilcHmac hmac)
+                       SilcCipher channel_key, SilcHmac hmac,
+                       int expire)
 {
   SilcChannelEntry channel;
 
@@ -575,8 +576,9 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
   channel->router = router;
   channel->channel_key = channel_key;
   channel->hmac = hmac;
+  channel->created = time(0);
   if (!channel->hmac)
-    if (!silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac)) {
+    if (!silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac)) {
       silc_free(channel);
       return NULL;
     }
@@ -585,7 +587,7 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
                                             NULL, NULL, NULL, TRUE);
 
   if (!silc_idcache_add(id_list->channels, channel->channel_name, 
-                       (void *)channel->id, (void *)channel, FALSE)) {
+                       (void *)channel->id, (void *)channel, expire, NULL)) {
     silc_hmac_free(channel->hmac);
     silc_hash_table_free(channel->user_list);
     silc_free(channel);
@@ -603,6 +605,9 @@ static void silc_idlist_del_channel_foreach(void *key, void *context,
 {
   SilcChannelClientEntry chl = (SilcChannelClientEntry)context;
 
+  SILC_LOG_DEBUG(("Removing client %s from channel %s",
+                 chl->client->nickname, chl->channel->channel_name));
+
   /* Remove the context from the client's channel hash table as that
      table and channel's user_list hash table share this same context. */
   silc_hash_table_del(chl->client->channels, chl->channel);
@@ -621,32 +626,28 @@ int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry)
       if (!silc_idcache_del_by_id(id_list->channels, (void *)entry->id))
        return FALSE;
 
+    /* Free all client entrys from the users list. The silc_hash_table_free
+       will free all the entries so they are not freed at the foreach 
+       callback. */
+    silc_hash_table_foreach(entry->user_list, silc_idlist_del_channel_foreach,
+                           NULL);
+    silc_hash_table_free(entry->user_list);
+
     /* Free data */
-    if (entry->channel_name)
-      silc_free(entry->channel_name);
-    if (entry->id)
-      silc_free(entry->id);
-    if (entry->topic)
-      silc_free(entry->topic);
+    silc_free(entry->channel_name);
+    silc_free(entry->id);
+    silc_free(entry->topic);
     if (entry->channel_key)
       silc_cipher_free(entry->channel_key);
     if (entry->key) {
       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 client entrys from the users list. The silc_hash_table_free
-       will free all the entries so they are not freed at the foreach 
-       callback. */
-    silc_hash_table_foreach(entry->user_list, silc_idlist_del_channel_foreach,
-                           NULL);
-    silc_hash_table_free(entry->user_list);
+    silc_free(entry->cipher);
+    if (entry->hmac)
+      silc_hmac_free(entry->hmac);
+    silc_free(entry->hmac_name);
+    silc_free(entry->rekey);
 
     memset(entry, 'F', sizeof(*entry));
     silc_free(entry);
@@ -665,7 +666,7 @@ silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
 {
   SilcIDCacheEntry id_cache = NULL;
 
-  SILC_LOG_DEBUG(("Channel by name"));
+  SILC_LOG_DEBUG(("Channel by name %s", name));
 
   if (!silc_idcache_find_by_name_one(id_list->channels, name, &id_cache))
     return NULL;
@@ -735,7 +736,7 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
   channel->id = new_id;
 
   silc_idcache_add(id_list->channels, channel->channel_name, channel->id, 
-                  channel, FALSE);
+                  channel, 0, NULL);
 
   SILC_LOG_DEBUG(("Replaced"));
 
@@ -747,7 +748,7 @@ silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
 
 SilcChannelEntry *
 silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
-                        uint32 *channels_count)
+                        SilcUInt32 *channels_count)
 {
   SilcIDCacheList list = NULL;
   SilcIDCacheEntry id_cache = NULL;