X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient.c;h=af4de6513b719cd065905a6c275af92d8381c40c;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=ddd1285283653f8c688ca5d3b01f22587ebe6c3b;hpb=d47a87b03b846e2333ef57b2c0d81f1644992964;p=silc.git diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index ddd12852..af4de651 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -18,7 +18,8 @@ */ /* $Id$ */ -#include "clientlibincludes.h" +#include "silcincludes.h" +#include "silcclient.h" #include "client_internal.h" /* Static task callback prototypes */ @@ -36,7 +37,7 @@ static void silc_client_packet_parse_type(SilcClient client, void silc_client_resolve_auth_method(bool success, SilcProtocolAuthMeth auth_meth, const unsigned char *auth_data, - uint32 auth_data_len, void *context); + SilcUInt32 auth_data_len, void *context); /* Allocates new client object. This has to be done before client may work. After calling this one must call silc_client_init to initialize @@ -599,7 +600,7 @@ SILC_TASK_CALLBACK(silc_client_connect_to_server_second) void silc_client_resolve_auth_method(bool success, SilcProtocolAuthMeth auth_meth, const unsigned char *auth_data, - uint32 auth_data_len, void *context) + SilcUInt32 auth_data_len, void *context) { SilcClientConnAuthInternalContext *proto_ctx = (SilcClientConnAuthInternalContext *)context; @@ -611,8 +612,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; } @@ -1180,12 +1180,12 @@ void silc_client_packet_send(SilcClient client, SilcCipher cipher, SilcHmac hmac, unsigned char *data, - uint32 data_len, + SilcUInt32 data_len, int force_send) { SilcPacketContext packetdata; int block_len; - uint32 sequence = 0; + SilcUInt32 sequence = 0; if (!sock) return; @@ -1438,8 +1438,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 +1461,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 +1523,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 +1539,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 +1576,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); } @@ -1599,7 +1613,7 @@ void silc_client_process_failure(SilcClient client, SilcSocketConnection sock, SilcPacketContext *packet) { - uint32 failure = 0; + SilcUInt32 failure = 0; if (sock->protocol) { if (packet->buffer->len >= 4) @@ -1701,7 +1715,7 @@ void silc_client_connection_auth_request(SilcClient client, SilcPacketContext *packet) { SilcClientConnection conn = (SilcClientConnection)sock->user_data; - uint16 conn_type, auth_meth; + SilcUInt16 conn_type, auth_meth; int ret; /* If we haven't send our request then ignore this one. */