updates.
[silc.git] / lib / silcclient / client.c
index ddd1285283653f8c688ca5d3b01f22587ebe6c3b..620e3de07318002e6e9c3306e56d27dedf613d00 100644 (file)
@@ -611,8 +611,7 @@ void silc_client_resolve_auth_method(bool success,
   proto_ctx->auth_meth = auth_meth;
 
   if (auth_data && auth_data_len) {
-    proto_ctx->auth_data = silc_calloc(auth_data_len, sizeof(*auth_data));
-    memcpy(proto_ctx->auth_data, auth_data, auth_data_len);
+    proto_ctx->auth_data = silc_memdup(auth_data, auth_data_len);
     proto_ctx->auth_data_len = auth_data_len;
   }
 
@@ -1438,8 +1437,7 @@ void silc_client_disconnected_by_server(SilcClient client,
 
   SILC_LOG_DEBUG(("Server disconnected us, sock %d", sock->sock));
 
-  msg = silc_calloc(message->len + 1, sizeof(char));
-  memcpy(msg, message->data, message->len);
+  msg = silc_memdup(message->data, message->len);
   client->internal->ops->say(client, sock->user_data, 
                             SILC_CLIENT_MESSAGE_AUDIT, msg);
   silc_free(msg);
@@ -1462,13 +1460,24 @@ void silc_client_error_by_server(SilcClient client,
 {
   char *msg;
 
-  msg = silc_calloc(message->len + 1, sizeof(char));
-  memcpy(msg, message->data, message->len);
+  msg = silc_memdup(message->data, message->len);
   client->internal->ops->say(client, sock->user_data, 
                             SILC_CLIENT_MESSAGE_AUDIT, msg);
   silc_free(msg);
 }
 
+/* Auto-nicking callback to send NICK command to server. */
+
+SILC_TASK_CALLBACK(silc_client_send_auto_nick)
+{
+  SilcClientConnection conn = (SilcClientConnection)context;
+  SilcClient client = conn->client;
+
+  silc_client_command_send(client, conn, SILC_COMMAND_NICK, 
+                          ++conn->cmd_ident, 1, 1, 
+                          client->nickname, strlen(client->nickname));
+}
+
 /* Processes the received new Client ID from server. Old Client ID is
    deleted from cache and new one is added. */
 
@@ -1513,12 +1522,15 @@ void silc_client_receive_new_id(SilcClient client,
     conn->local_entry->username = strdup(client->username);
   if (!conn->local_entry->hostname)
     conn->local_entry->hostname = strdup(client->hostname);
-  conn->local_entry->server = strdup(conn->remote_host);
+  if (!conn->local_entry->server)
+    conn->local_entry->server = strdup(conn->remote_host);
   conn->local_entry->id = conn->local_id;
   conn->local_entry->valid = TRUE;
-  conn->local_entry->channels = silc_hash_table_alloc(1, silc_hash_ptr, 
-                                                     NULL, NULL,
-                                                     NULL, NULL, NULL, TRUE);
+  if (!conn->local_entry->channels)
+    conn->local_entry->channels = silc_hash_table_alloc(1, silc_hash_ptr, 
+                                                       NULL, NULL,
+                                                       NULL, NULL, NULL, 
+                                                       TRUE);
 
   /* Put it to the ID cache */
   silc_idcache_add(conn->client_cache, strdup(conn->nickname), conn->local_id, 
@@ -1526,11 +1538,11 @@ void silc_client_receive_new_id(SilcClient client,
 
   if (connecting) {
     /* Send NICK command if the nickname was set by the application (and is
-       not same as the username). */
+       not same as the username). Send this with little timeout. */
     if (client->nickname && strcmp(client->nickname, client->username))
-      silc_client_command_send(client, conn, SILC_COMMAND_NICK, 
-                              ++conn->cmd_ident, 1, 1, 
-                              client->nickname, strlen(client->nickname));
+      silc_schedule_task_add(client->schedule, 0,
+                            silc_client_send_auto_nick, conn,
+                            1, 0, SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
 
     /* Issue INFO command to fetch the real server name and server information
        and other stuff. */
@@ -1563,6 +1575,7 @@ void silc_client_remove_from_channels(SilcClient client,
     silc_hash_table_del(chu->channel->user_list, chu->client);
     silc_free(chu);
   }
+
   silc_hash_table_list_reset(&htl);
 }