X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fcommand.c;h=7c94838374a6167cca177d69a3af66e4dac7974e;hb=9a85416f729ef965606a688fffb6baa9d22927a5;hp=37ea4d6fff9744b1a1482f13475d326af447e8ff;hpb=e8c2b7b9cabcf221862e7d91a1a7a1e0d6f02dd8;p=silc.git diff --git a/lib/silcclient/command.c b/lib/silcclient/command.c index 37ea4d6f..7c948383 100644 --- a/lib/silcclient/command.c +++ b/lib/silcclient/command.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2001 Pekka Riikonen + Copyright (C) 1997 - 2002 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -93,7 +93,6 @@ void silc_client_command_call(SilcClientCommand command, void silc_client_command_pending(SilcClientConnection conn, SilcCommand reply_cmd, uint16 ident, - SilcClientPendingDestructor destructor, SilcCommandCb callback, void *context) { @@ -104,7 +103,6 @@ void silc_client_command_pending(SilcClientConnection conn, reply->ident = ident; reply->context = context; reply->callback = callback; - reply->destructor = destructor; silc_dlist_add(conn->pending_commands, reply); } @@ -140,7 +138,6 @@ int silc_client_command_pending_check(SilcClientConnection conn, if (r->reply_cmd == command && r->ident == ident) { ctx->context = r->context; ctx->callback = r->callback; - ctx->destructor = r->destructor; ctx->ident = ident; return TRUE; } @@ -187,13 +184,6 @@ SilcClientCommandContext silc_client_command_dup(SilcClientCommandContext ctx) return ctx; } -/* Pending command destructor. */ - -static void silc_client_command_destructor(void *context) -{ - silc_client_command_free((SilcClientCommandContext)context); -} - /* Command WHOIS. This command is used to query information about specific user. */ @@ -410,11 +400,9 @@ SILC_CLIENT_CMD_FUNC(nick) if there were no errors returned by the server. */ silc_client_command_pending(conn, SILC_COMMAND_NICK, cmd->conn->cmd_ident, - silc_client_command_destructor, silc_client_command_nick_change, silc_client_command_dup(cmd)); cmd->pending = TRUE; - return; out: silc_client_command_free(cmd); @@ -612,17 +600,15 @@ SILC_CLIENT_CMD_FUNC(invite) COMMAND_ERROR; goto out; } - silc_free(nickname); /* Client entry not found, it was requested thus mark this to be pending command. */ silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, conn->cmd_ident, - silc_client_command_destructor, silc_client_command_invite, silc_client_command_dup(cmd)); cmd->pending = 1; - return; + goto out; } } else { invite = cmd->argv[2]; @@ -746,10 +732,9 @@ SILC_TASK_CALLBACK(silc_client_command_kill_remove_later) /* Get the target client */ target = silc_idlist_get_client(cmd->client, conn, nickname, cmd->argv[1], FALSE); - if (target) { - silc_client_remove_from_channels(client, conn, target); + if (target) + /* Remove the client from all channels and free it */ silc_client_del_client(client, conn, target); - } silc_free(nickname); silc_client_command_free(cmd); @@ -817,17 +802,14 @@ SILC_CLIENT_CMD_FUNC(kill) goto out; } - silc_free(nickname); - /* Client entry not found, it was requested thus mark this to be pending command. */ silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, conn->cmd_ident, - silc_client_command_destructor, silc_client_command_kill, silc_client_command_dup(cmd)); cmd->pending = 1; - return; + goto out; } /* Send the KILL command to the server */ @@ -853,7 +835,7 @@ SILC_CLIENT_CMD_FUNC(kill) /* Register a pending callback that will actually remove the killed client from our cache. */ silc_client_command_pending(conn, SILC_COMMAND_KILL, conn->cmd_ident, - NULL, silc_client_command_kill_remove, + silc_client_command_kill_remove, silc_client_command_dup(cmd)); out: @@ -965,7 +947,7 @@ SILC_CLIENT_CMD_FUNC(join) { SilcClientCommandContext cmd = (SilcClientCommandContext)context; SilcClientConnection conn = cmd->conn; - SilcIDCacheEntry id_cache = NULL; + SilcChannelEntry channel; SilcBuffer buffer, idp, auth = NULL; char *name, *passphrase = NULL, *cipher = NULL, *hmac = NULL; int i; @@ -982,12 +964,9 @@ SILC_CLIENT_CMD_FUNC(join) } /* See if we have joined to the requested channel already */ - if (silc_idcache_find_by_name_one(conn->channel_cache, cmd->argv[1], - &id_cache)) { - SilcChannelEntry channel = (SilcChannelEntry)id_cache->context; - if (channel->on_channel) - goto out; - } + channel = silc_client_get_channel(cmd->client, conn, cmd->argv[1]); + if (channel && silc_client_on_channel(channel, conn->local_entry)) + goto out; idp = silc_id_payload_encode(conn->local_id, SILC_ID_CLIENT); @@ -1474,27 +1453,20 @@ SILC_CLIENT_CMD_FUNC(cumode) goto out; } - silc_free(nickname); - /* Client entry not found, it was requested thus mark this to be pending command. */ silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, conn->cmd_ident, - silc_client_command_destructor, silc_client_command_cumode, silc_client_command_dup(cmd)); cmd->pending = 1; - return; + goto out; } /* Get the current mode */ - silc_list_start(channel->clients); - while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { - if (chu->client == client_entry) { - mode = chu->mode; - break; - } - } + chu = silc_client_on_channel(channel, client_entry); + if (chu) + mode = chu->mode; /* Are we adding or removing mode */ if (cmd->argv[2][0] == '-') @@ -2016,8 +1988,8 @@ SILC_CLIENT_CMD_FUNC(leave) { SilcClientCommandContext cmd = (SilcClientCommandContext)context; SilcClientConnection conn = cmd->conn; - SilcIDCacheEntry id_cache = NULL; SilcChannelEntry channel; + SilcChannelUser chu; SilcBuffer buffer, idp; char *name; @@ -2046,19 +2018,25 @@ SILC_CLIENT_CMD_FUNC(leave) name = cmd->argv[1]; } - /* Get the Channel ID of the channel */ - if (!silc_idcache_find_by_name_one(conn->channel_cache, name, &id_cache)) { + /* Get the channel entry */ + channel = silc_client_get_channel(cmd->client, conn, name); + if (!channel) { SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, "You are not on that channel"); COMMAND_ERROR; goto out; } - channel = (SilcChannelEntry)id_cache->context; - channel->on_channel = FALSE; + /* Remove us from channel */ + chu = silc_client_on_channel(channel, conn->local_entry); + if (chu) { + silc_hash_table_del(chu->client->channels, chu->channel); + silc_hash_table_del(chu->channel->user_list, chu->client); + silc_free(chu); + } /* Send LEAVE command to the server */ - idp = silc_id_payload_encode(id_cache->id, SILC_ID_CHANNEL); + idp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL); buffer = silc_command_payload_encode_va(SILC_COMMAND_LEAVE, 0, 1, 1, idp->data, idp->len); silc_client_packet_send(cmd->client, conn->sock, SILC_PACKET_COMMAND, NULL, @@ -2141,6 +2119,8 @@ SILC_CLIENT_CMD_FUNC(getkey) char *nickname = NULL; SilcBuffer idp, buffer; + SILC_LOG_DEBUG(("Start")); + if (!cmd->conn) { SILC_NOT_CONNECTED(cmd->client, cmd->conn); COMMAND_ERROR; @@ -2154,22 +2134,6 @@ SILC_CLIENT_CMD_FUNC(getkey) goto out; } - if (cmd->pending) { - SilcClientCommandReplyContext reply = - (SilcClientCommandReplyContext)context2; - SilcCommandStatus status; - unsigned char *tmp = silc_argument_get_arg_type(reply->args, 1, NULL); - SILC_GET16_MSB(status, tmp); - - if (status == SILC_STATUS_ERR_NO_SUCH_NICK || - status == SILC_STATUS_ERR_NO_SUCH_SERVER) { - SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, "%s", - silc_client_command_status_message(status)); - COMMAND_ERROR; - goto out; - } - } - /* Parse the typed nickname. */ if (client->internal->params->nickname_parse) client->internal->params->nickname_parse(cmd->argv[1], &nickname); @@ -2184,38 +2148,57 @@ SILC_CLIENT_CMD_FUNC(getkey) server_entry = silc_client_get_server(client, conn, cmd->argv[1]); if (!server_entry) { - if (cmd->pending) { + /* No. what ever user wants we don't have it, so resolve it. We + will first try to resolve the client, and if that fails then + we'll try to resolve the server. */ + + if (!cmd->pending) { + /* This will send the IDENTIFY command for nickname */ + silc_idlist_get_client(client, conn, nickname, cmd->argv[1], TRUE); + silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, + conn->cmd_ident, + silc_client_command_getkey, + silc_client_command_dup(cmd)); + cmd->pending = 1; + goto out; + } else { + SilcClientCommandReplyContext reply = + (SilcClientCommandReplyContext)context2; + SilcCommandStatus status; + unsigned char *tmp = silc_argument_get_arg_type(reply->args, 1, NULL); + SILC_GET16_MSB(status, tmp); + + /* If nickname was not found, then resolve the server. */ + if (status == SILC_STATUS_ERR_NO_SUCH_NICK) { + /* This sends the IDENTIFY command to resolve the server. */ + silc_client_command_register(client, SILC_COMMAND_IDENTIFY, + NULL, NULL, + silc_client_command_reply_identify_i, 0, + ++conn->cmd_ident); + silc_client_command_send(client, conn, SILC_COMMAND_IDENTIFY, + conn->cmd_ident, 1, + 2, cmd->argv[1], cmd->argv_lens[1]); + silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, + conn->cmd_ident, + silc_client_command_getkey, + silc_client_command_dup(cmd)); + goto out; + } + + /* If server was not found, then we've resolved both nickname and + server and did not find anybody. */ + if (status == SILC_STATUS_ERR_NO_SUCH_SERVER) { + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, "%s", + silc_client_command_status_message(SILC_STATUS_ERR_NO_SUCH_NICK)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, "%s", + silc_client_command_status_message(status)); + COMMAND_ERROR; + goto out; + } + COMMAND_ERROR; goto out; } - - /* No. what ever user wants we don't have it, so resolve it. We - will try to resolve both client and server, one of them is - bound to be wrong. */ - - /* This will send the IDENTIFY command */ - silc_idlist_get_client(client, conn, nickname, cmd->argv[1], TRUE); - silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, - conn->cmd_ident, - silc_client_command_destructor, - silc_client_command_getkey, - silc_client_command_dup(cmd)); - - /* This sends the IDENTIFY command to resolve the server. */ - silc_client_command_register(client, SILC_COMMAND_IDENTIFY, NULL, NULL, - silc_client_command_reply_identify_i, 0, - ++conn->cmd_ident); - silc_client_command_send(client, conn, SILC_COMMAND_IDENTIFY, - conn->cmd_ident, 1, - 2, cmd->argv[1], cmd->argv_lens[1]); - silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, - conn->cmd_ident, NULL, - silc_client_command_getkey, - silc_client_command_dup(cmd)); - - cmd->pending = 1; - silc_free(nickname); - return; } idp = silc_id_payload_encode(server_entry->server_id, SILC_ID_SERVER); @@ -2366,6 +2349,4 @@ void silc_client_commands_unregister(SilcClient client) SILC_CLIENT_CMDU(leave, LEAVE, "LEAVE"); SILC_CLIENT_CMDU(users, USERS, "USERS"); SILC_CLIENT_CMDU(getkey, GETKEY, "GETKEY"); - - silc_list_uninit(client->internal->commands); }