updates.
[silc.git] / apps / silcd / command_reply.c
index 2bc68693f2f79de17ddeef74b1a0f94e64a8cd0a..a012aa8c7db56bbf843e87b706c5b60de4028f7c 100644 (file)
@@ -107,7 +107,7 @@ void silc_server_command_reply_process(SilcServer server,
     return;
   }
 
-  cmd->cb(ctx);
+  cmd->cb(ctx, NULL);
 }
 
 /* Free command reply context and its internals. */
@@ -115,7 +115,7 @@ void silc_server_command_reply_process(SilcServer server,
 void silc_server_command_reply_free(SilcServerCommandReplyContext cmd)
 {
   if (cmd) {
-    silc_command_free_payload(cmd->payload);
+    silc_command_payload_free(cmd->payload);
     if (cmd->sock)
       silc_socket_free(cmd->sock); /* Decrease the reference counter */
     silc_free(cmd);
@@ -129,10 +129,9 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
 {
   SilcServer server = cmd->server;
   unsigned char *tmp, *id_data;
-  char *nickname, *username, *realname;
+  char *nickname, *username, *realname, *servername = NULL;
   SilcClientID *client_id;
   SilcClientEntry client;
-  SilcIDCacheEntry cache = NULL;
   char global = FALSE;
   char *nick;
   uint32 mode = 0, len, id_len;
@@ -159,11 +158,10 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
 
   /* Check if we have this client cached already. */
 
-  client = silc_idlist_find_client_by_id(server->local_list, client_id,
-                                        &cache);
+  client = silc_idlist_find_client_by_id(server->local_list, client_id, NULL);
   if (!client) {
-    client = silc_idlist_find_client_by_id(server->global_list, 
-                                          client_id, &cache);
+    client = silc_idlist_find_client_by_id(server->global_list, client_id, 
+                                          NULL);
     global = TRUE;
   }
 
@@ -177,7 +175,9 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
     if (strchr(nickname, '@')) {
       int len = strcspn(nickname, "@");
       nick = silc_calloc(len + 1, sizeof(char));
+      servername = silc_calloc((strlen(nickname) - len) + 1, sizeof(char));
       memcpy(nick, nickname, len);
+      memcpy(servername, nickname + len + 1, strlen(nickname) - len);
     } else {
       nick = strdup(nickname);
     }
@@ -185,7 +185,7 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
     /* We don't have that client anywhere, add it. The client is added
        to global list since server didn't have it in the lists so it must be 
        global. */
-    client = silc_idlist_add_client(server->global_list, nick, strlen(nick),
+    client = silc_idlist_add_client(server->global_list, nick, 
                                    strdup(username), 
                                    strdup(realname), client_id, 
                                    cmd->sock->user_data, NULL);
@@ -194,6 +194,7 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
 
     client->data.registered = TRUE;
     client->mode = mode;
+    client->servername = servername;
   } else {
     /* We have the client already, update the data */
 
@@ -203,7 +204,9 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
     if (strchr(nickname, '@')) {
       int len = strcspn(nickname, "@");
       nick = silc_calloc(len + 1, sizeof(char));
+      servername = silc_calloc((strlen(nickname) - len) + 1, sizeof(char));
       memcpy(nick, nickname, len);
+      memcpy(servername, nickname + len + 1, strlen(nickname) - len);
     } else {
       nick = strdup(nickname);
     }
@@ -219,14 +222,14 @@ silc_server_command_reply_whois_save(SilcServerCommandReplyContext cmd)
     client->username = strdup(username);
     client->userinfo = strdup(realname);
     client->mode = mode;
-
-    if (cache) {
-      cache->data = nick;
-      cache->data_len = strlen(nick);
-      silc_idcache_sort_by_data(global ? server->global_list->clients : 
-                               server->local_list->clients);
-    }
-
+    client->servername = servername;
+
+    /* Remove the old cache entry and create a new one */
+    silc_idcache_del_by_context(global ? server->global_list->clients :
+                               server->local_list->clients, client);
+    silc_idcache_add(global ? server->global_list->clients :
+                    server->local_list->clients, nick, client->id, 
+                    client, FALSE);
     silc_free(client_id);
   }
 
@@ -270,7 +273,7 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
   SilcServer server = cmd->server;
   uint32 len, id_len;
   unsigned char *id_data;
-  char *nickname, *username, *realname;
+  char *nickname, *username, *realname, *servername = NULL;
   SilcClientID *client_id;
   SilcClientEntry client;
   SilcIDCacheEntry cache = NULL;
@@ -309,7 +312,9 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
     if (strchr(nickname, '@')) {
       int len = strcspn(nickname, "@");
       nick = silc_calloc(len + 1, sizeof(char));
+      servername = silc_calloc((strlen(nickname) - len) + 1, sizeof(char));
       memcpy(nick, nickname, len);
+      memcpy(servername, nickname + len + 1, strlen(nickname) - len);
     } else {
       nick = strdup(nickname);
     }
@@ -317,7 +322,7 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
     /* We don't have that client anywhere, add it. The client is added
        to global list since server didn't have it in the lists so it must be 
        global. */
-    client = silc_idlist_add_client(server->global_list, nick, strlen(nick),
+    client = silc_idlist_add_client(server->global_list, nick,
                                    strdup(username), strdup(realname), 
                                    silc_id_dup(client_id, SILC_ID_CLIENT), 
                                    cmd->sock->user_data, NULL);
@@ -328,6 +333,7 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
     client = silc_idlist_find_client_by_id(server->global_list, 
                                           client_id, &cache);
     cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
+    client->servername = servername;
   } else {
     /* We have the client already, update the data */
 
@@ -335,7 +341,9 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
     if (strchr(nickname, '@')) {
       int len = strcspn(nickname, "@");
       nick = silc_calloc(len + 1, sizeof(char));
+      servername = silc_calloc((strlen(nickname) - len) + 1, sizeof(char));
       memcpy(nick, nickname, len);
+      memcpy(servername, nickname + len + 1, strlen(nickname) - len);
     } else {
       nick = strdup(nickname);
     }
@@ -347,13 +355,14 @@ silc_server_command_reply_whowas_save(SilcServerCommandReplyContext cmd)
     
     client->nickname = nick;
     client->username = strdup(username);
-
-    if (cache) {
-      cache->data = nick;
-      cache->data_len = strlen(nick);
-      silc_idcache_sort_by_data(global ? server->global_list->clients : 
-                               server->local_list->clients);
-    }
+    client->servername = servername;
+
+    /* Remove the old cache entry and create a new one */
+    silc_idcache_del_by_context(global ? server->global_list->clients :
+                               server->local_list->clients, client);
+    silc_idcache_add(global ? server->global_list->clients :
+                    server->local_list->clients, nick, client->id, 
+                    client, FALSE);
   }
 
   silc_free(client_id);
@@ -398,7 +407,6 @@ silc_server_command_reply_identify_save(SilcServerCommandReplyContext cmd)
   char *nickname, *username;
   SilcClientID *client_id;
   SilcClientEntry client;
-  SilcIDCacheEntry cache = NULL;
   char global = FALSE;
   char *nick = NULL;
 
@@ -414,11 +422,10 @@ silc_server_command_reply_identify_save(SilcServerCommandReplyContext cmd)
 
   /* Check if we have this client cached already. */
 
-  client = silc_idlist_find_client_by_id(server->local_list, client_id,
-                                        &cache);
+  client = silc_idlist_find_client_by_id(server->local_list, client_id, NULL);
   if (!client) {
-    client = silc_idlist_find_client_by_id(server->global_list, 
-                                          client_id, &cache);
+    client = silc_idlist_find_client_by_id(server->global_list, client_id,
+                                          NULL);
     global = TRUE;
   }
 
@@ -442,7 +449,7 @@ silc_server_command_reply_identify_save(SilcServerCommandReplyContext cmd)
     /* We don't have that client anywhere, add it. The client is added
        to global list since server didn't have it in the lists so it must be 
        global. */
-    client = silc_idlist_add_client(server->global_list, nick, strlen(nick),
+    client = silc_idlist_add_client(server->global_list, nick, 
                                    username ? strdup(username) : NULL, NULL,
                                    client_id, cmd->sock->user_data, NULL);
     client->data.registered = TRUE;
@@ -473,13 +480,14 @@ silc_server_command_reply_identify_save(SilcServerCommandReplyContext cmd)
       client->username = strdup(username);
     }
 
-    if (nickname && cache) {
-      cache->data = nick;
-      cache->data_len = strlen(nick);
-      silc_idcache_sort_by_data(global ? server->global_list->clients : 
-                               server->local_list->clients);
+    /* Remove the old cache entry and create a new one */
+    if (nickname) {
+      silc_idcache_del_by_context(global ? server->global_list->clients :
+                                 server->local_list->clients, client);
+      silc_idcache_add(global ? server->global_list->clients :
+                      server->local_list->clients, nick, client->id, 
+                      client, FALSE);
     }
-
     silc_free(client_id);
   }