Added some asserts and error checks.
[silc.git] / lib / silcclient / idlist.c
index f20efc260bbb325f945cc4fb8bdd8706e00ac4ed..cd48b287516a3a6d55a0b25868fe0ec6438e008e 100644 (file)
@@ -49,8 +49,13 @@ SilcClientEntry *silc_client_get_clients_local(SilcClient client,
   int i = 0;
   bool found = FALSE;
 
+  assert(client && conn);
+  if (!nickname)
+    return NULL;
+
   /* Find ID from cache */
-  if (!silc_idcache_find_by_name(conn->client_cache, (char *)nickname, &list))
+  if (!silc_idcache_find_by_name(conn->internal->client_cache,
+                                (char *)nickname, &list))
     return NULL;
 
   if (!silc_idcache_list_count(list)) {
@@ -158,8 +163,11 @@ void silc_client_get_clients(SilcClient client,
                             void *context)
 {
   GetClientInternal i;
+  int len;
   char *userhost;
 
+  assert(client && conn);
+
   if (!nickname)
     return;
 
@@ -172,13 +180,13 @@ void silc_client_get_clients(SilcClient client,
   i->context = context;
 
   if (nickname && server) {
-    userhost = silc_calloc(strlen(nickname) + strlen(server) + 2,
-                          sizeof(*userhost));
-    strncat(userhost, nickname, strlen(nickname));
-    strncat(userhost, "@", 1);
-    strncat(userhost, server, strlen(server));
+    len = strlen(nickname) + strlen(server) + 3;
+    userhost = silc_calloc(len, sizeof(*userhost));
+    silc_strncat(userhost, len, nickname, strlen(nickname));
+    silc_strncat(userhost, len, "@", 1);
+    silc_strncat(userhost, len, server, strlen(server));
   } else {
-    userhost = strdup(nickname);
+    userhost = silc_memdup(nickname, strlen(nickname));
   }
 
   /* Register our own command reply for this command */
@@ -218,8 +226,8 @@ SilcClientEntry silc_idlist_get_client(SilcClient client,
   SILC_LOG_DEBUG(("Start"));
 
   /* Find ID from cache */
-  if (!silc_idcache_find_by_name(conn->client_cache, (char *)nickname, 
-                                &list)) {
+  if (!silc_idcache_find_by_name(conn->internal->client_cache,
+                                (char *)nickname, &list)) {
   identify:
 
     if (query) {
@@ -324,7 +332,7 @@ SILC_CLIENT_CMD_FUNC(get_clients_list_callback)
     }
 
     /* Get the client entry */
-    if (silc_idcache_find_by_id_one_ext(i->conn->client_cache, 
+    if (silc_idcache_find_by_id_one_ext(i->conn->internal->client_cache, 
                                        (void *)client_id, 
                                        NULL, NULL, 
                                        silc_hash_client_id_compare, NULL,
@@ -373,6 +381,8 @@ void silc_client_get_clients_by_list(SilcClient client,
   GetClientsByListInternal in;
   bool wait_res = FALSE;
 
+  assert(client && conn && client_id_list);
+
   SILC_LOG_DEBUG(("Start"));
 
   in = silc_calloc(1, sizeof(*in));
@@ -400,8 +410,8 @@ void silc_client_get_clients_by_list(SilcClient client,
 
     /* Check if we have this client cached already. */
     ret =
-      silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)client_id, 
-                                     NULL, NULL, 
+      silc_idcache_find_by_id_one_ext(conn->internal->client_cache,
+                                     (void *)client_id, NULL, NULL, 
                                      silc_hash_client_id_compare, NULL,
                                      &id_cache);
 
@@ -498,12 +508,16 @@ SilcClientEntry silc_client_get_client_by_id(SilcClient client,
 {
   SilcIDCacheEntry id_cache;
 
+  assert(client && conn);
+  if (!client_id)
+    return NULL;
+
   SILC_LOG_DEBUG(("Finding client by ID (%s)", 
                  silc_id_render(client_id, SILC_ID_CLIENT)));
 
   /* Find ID from cache */
-  if (!silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)client_id, 
-                                      NULL, NULL, 
+  if (!silc_idcache_find_by_id_one_ext(conn->internal->client_cache,
+                                      (void *)client_id, NULL, NULL, 
                                       silc_hash_client_id_compare, NULL,
                                       &id_cache))
     return NULL;
@@ -547,12 +561,15 @@ SILC_CLIENT_CMD_FUNC(get_client_by_id_callback)
 void silc_client_get_client_by_id_resolve(SilcClient client,
                                          SilcClientConnection conn,
                                          SilcClientID *client_id,
+                                         SilcBuffer attributes,
                                          SilcGetClientCallback completion,
                                          void *context)
 {
   SilcBuffer idp;
   GetClientByIDInternal i = silc_calloc(1, sizeof(*i));
 
+  assert(client && conn && client_id);
+
   SILC_LOG_DEBUG(("Start"));
 
   i->client = client;
@@ -569,7 +586,9 @@ void silc_client_get_client_by_id_resolve(SilcClient client,
   /* Send the command */
   idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
   silc_client_command_send(client, conn, SILC_COMMAND_WHOIS, conn->cmd_ident,
-                          1, 4, idp->data, idp->len);
+                          2, 3, attributes ? attributes->data : NULL,
+                          attributes ? attributes->len : 0,
+                          4, idp->data, idp->len);
   silc_buffer_free(idp);
 
   /* Add pending callback */
@@ -618,7 +637,7 @@ silc_client_add_client(SilcClient client, SilcClientConnection conn,
   silc_client_nickname_format(client, conn, client_entry);
   
   /* Add client to cache, the non-formatted nickname is saved to cache */
-  if (!silc_idcache_add(conn->client_cache, nick, client_entry->id, 
+  if (!silc_idcache_add(conn->internal->client_cache, nick, client_entry->id, 
                        (void *)client_entry, 0, NULL)) {
     silc_free(client_entry->nickname);
     silc_free(client_entry->username);
@@ -646,9 +665,14 @@ void silc_client_update_client(SilcClient client,
 
   SILC_LOG_DEBUG(("Start"));
 
-  if (!client_entry->username && username)
-    silc_parse_userfqdn(username, &client_entry->username, 
+  if ((!client_entry->username || !client_entry->hostname) && username) {
+    silc_free(client_entry->username);
+    silc_free(client_entry->hostname);
+    client_entry->username = NULL;
+    client_entry->hostname = NULL;
+    silc_parse_userfqdn(username, &client_entry->username,
                        &client_entry->hostname);
+  }
   if (!client_entry->realname && userinfo)
     client_entry->realname = strdup(userinfo);
   if (!client_entry->nickname && nickname) {
@@ -660,8 +684,8 @@ void silc_client_update_client(SilcClient client,
 
   if (nick) {
     /* Remove the old cache entry and create a new one */
-    silc_idcache_del_by_context(conn->client_cache, client_entry);
-    silc_idcache_add(conn->client_cache, nick, client_entry->id, 
+    silc_idcache_del_by_context(conn->internal->client_cache, client_entry);
+    silc_idcache_add(conn->internal->client_cache, nick, client_entry->id, 
                     client_entry, 0, NULL);
   }
 }
@@ -698,7 +722,8 @@ void silc_client_del_client_entry(SilcClient client,
 bool silc_client_del_client(SilcClient client, SilcClientConnection conn,
                            SilcClientEntry client_entry)
 {
-  bool ret = silc_idcache_del_by_context(conn->client_cache, client_entry);
+  bool ret = silc_idcache_del_by_context(conn->internal->client_cache,
+                                        client_entry);
 
   /* Remove from channels */
   silc_client_remove_from_channels(client, conn, client_entry);
@@ -729,7 +754,7 @@ SilcChannelEntry silc_client_add_channel(SilcClient client,
                                             NULL, NULL, NULL, TRUE);
 
   /* Put it to the ID cache */
-  if (!silc_idcache_add(conn->channel_cache, channel->channel_name, 
+  if (!silc_idcache_add(conn->internal->channel_cache, channel->channel_name, 
                        (void *)channel->id, (void *)channel, 0, NULL)) {
     silc_free(channel->channel_name);
     silc_hash_table_free(channel->user_list);
@@ -761,7 +786,8 @@ static void silc_client_del_channel_foreach(void *key, void *context,
 bool silc_client_del_channel(SilcClient client, SilcClientConnection conn,
                             SilcChannelEntry channel)
 {
-  bool ret = silc_idcache_del_by_context(conn->channel_cache, channel);
+  bool ret = silc_idcache_del_by_context(conn->internal->channel_cache,
+                                        channel);
 
   SILC_LOG_DEBUG(("Start"));
 
@@ -806,10 +832,11 @@ bool silc_client_replace_channel_id(SilcClient client,
   SILC_LOG_DEBUG(("New Channel ID id(%s)", 
                  silc_id_render(new_id, SILC_ID_CHANNEL)));
 
-  silc_idcache_del_by_id(conn->channel_cache, channel->id);
+  silc_idcache_del_by_id(conn->internal->channel_cache, channel->id);
   silc_free(channel->id);
   channel->id = new_id;
-  return silc_idcache_add(conn->channel_cache, channel->channel_name, 
+  return silc_idcache_add(conn->internal->channel_cache,
+                         channel->channel_name, 
                          (void *)channel->id, (void *)channel, 0, NULL);
 
 }
@@ -825,9 +852,13 @@ SilcChannelEntry silc_client_get_channel(SilcClient client,
   SilcIDCacheEntry id_cache;
   SilcChannelEntry entry;
 
+  assert(client && conn);
+  if (!channel)
+    return NULL;
+
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_name_one(conn->channel_cache, channel, 
+  if (!silc_idcache_find_by_name_one(conn->internal->channel_cache, channel, 
                                     &id_cache))
     return NULL;
 
@@ -849,9 +880,13 @@ SilcChannelEntry silc_client_get_channel_by_id(SilcClient client,
   SilcIDCacheEntry id_cache;
   SilcChannelEntry entry;
 
+  assert(client && conn);
+  if (!channel_id)
+    return NULL;
+
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_id_one(conn->channel_cache, channel_id, 
+  if (!silc_idcache_find_by_id_one(conn->internal->channel_cache, channel_id, 
                                   &id_cache))
     return NULL;
 
@@ -900,6 +935,8 @@ void silc_client_get_channel_by_id_resolve(SilcClient client,
   SilcBuffer idp;
   GetChannelByIDInternal i = silc_calloc(1, sizeof(*i));
 
+  assert(client && conn && channel_id);
+
   SILC_LOG_DEBUG(("Start"));
 
   i->client = client;
@@ -935,10 +972,14 @@ SilcServerEntry silc_client_get_server(SilcClient client,
   SilcIDCacheEntry id_cache;
   SilcServerEntry entry;
 
+  assert(client && conn);
+  if (!server_name)
+    return NULL;
+
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_name_one(conn->server_cache, server_name, 
-                                    &id_cache))
+  if (!silc_idcache_find_by_name_one(conn->internal->server_cache,
+                                    server_name, &id_cache))
     return NULL;
 
   entry = (SilcServerEntry)id_cache->context;
@@ -955,10 +996,14 @@ SilcServerEntry silc_client_get_server_by_id(SilcClient client,
   SilcIDCacheEntry id_cache;
   SilcServerEntry entry;
 
+  assert(client && conn);
+  if (!server_id)
+    return NULL;
+
   SILC_LOG_DEBUG(("Start"));
 
-  if (!silc_idcache_find_by_id_one(conn->server_cache, (void *)server_id, 
-                                  &id_cache))
+  if (!silc_idcache_find_by_id_one(conn->internal->server_cache,
+                                  (void *)server_id, &id_cache))
     return NULL;
 
   entry = (SilcServerEntry)id_cache->context;
@@ -989,7 +1034,8 @@ SilcServerEntry silc_client_add_server(SilcClient client,
     server_entry->server_info = strdup(server_info);
 
   /* Add server to cache */
-  if (!silc_idcache_add(conn->server_cache, server_entry->server_name,
+  if (!silc_idcache_add(conn->internal->server_cache,
+                       server_entry->server_name,
                        server_entry->server_id, server_entry, 0, NULL)) {
     silc_free(server_entry->server_id);
     silc_free(server_entry->server_name);
@@ -1006,7 +1052,7 @@ SilcServerEntry silc_client_add_server(SilcClient client,
 bool silc_client_del_server(SilcClient client, SilcClientConnection conn,
                            SilcServerEntry server)
 {
-  bool ret = silc_idcache_del_by_context(conn->server_cache, server);
+  bool ret = silc_idcache_del_by_context(conn->internal->server_cache, server);
   silc_free(server->server_name);
   silc_free(server->server_info);
   silc_free(server->server_id);
@@ -1027,10 +1073,10 @@ void silc_client_update_server(SilcClient client,
   if (server_name && (!server_entry->server_name ||
                      strcmp(server_entry->server_name, server_name))) {
 
-    silc_idcache_del_by_context(conn->server_cache, server_entry);
+    silc_idcache_del_by_context(conn->internal->server_cache, server_entry);
     silc_free(server_entry->server_name);
     server_entry->server_name = strdup(server_name);
-    silc_idcache_add(conn->server_cache, server_entry->server_name,
+    silc_idcache_add(conn->internal->server_cache, server_entry->server_name,
                     server_entry->server_id,
                     server_entry, 0, NULL);
   }