- SILC_CLIENT_CMD_REPLY(whois, WHOIS),
- SILC_CLIENT_CMD_REPLY(whowas, WHOWAS),
- SILC_CLIENT_CMD_REPLY(identify, IDENTIFY),
- SILC_CLIENT_CMD_REPLY(nick, NICK),
- SILC_CLIENT_CMD_REPLY(list, LIST),
- SILC_CLIENT_CMD_REPLY(topic, TOPIC),
- SILC_CLIENT_CMD_REPLY(invite, INVITE),
- SILC_CLIENT_CMD_REPLY(kill, KILL),
- SILC_CLIENT_CMD_REPLY(info, INFO),
- SILC_CLIENT_CMD_REPLY(connect, CONNECT),
- SILC_CLIENT_CMD_REPLY(ping, PING),
- SILC_CLIENT_CMD_REPLY(oper, OPER),
- SILC_CLIENT_CMD_REPLY(join, JOIN),
- SILC_CLIENT_CMD_REPLY(motd, MOTD),
- SILC_CLIENT_CMD_REPLY(umode, UMODE),
- SILC_CLIENT_CMD_REPLY(cmode, CMODE),
- SILC_CLIENT_CMD_REPLY(cumode, CUMODE),
- SILC_CLIENT_CMD_REPLY(kick, KICK),
- SILC_CLIENT_CMD_REPLY(ban, BAN),
- SILC_CLIENT_CMD_REPLY(close, CLOSE),
- SILC_CLIENT_CMD_REPLY(shutdown, SHUTDOWN),
- SILC_CLIENT_CMD_REPLY(silcoper, SILCOPER),
- SILC_CLIENT_CMD_REPLY(leave, LEAVE),
- SILC_CLIENT_CMD_REPLY(users, USERS),
- SILC_CLIENT_CMD_REPLY(getkey, GETKEY),
-
- { NULL, 0 },
-};
-
-const SilcCommandStatusMessage silc_command_status_messages[] = {
-
- { STAT(NO_SUCH_NICK), "There was no such nickname" },
- { STAT(NO_SUCH_CHANNEL), "There was no such channel" },
- { STAT(NO_SUCH_SERVER), "No such server" },
- { STAT(TOO_MANY_TARGETS), "Duplicate recipients. No message delivered" },
- { STAT(NO_RECIPIENT), "No recipient given" },
- { STAT(UNKNOWN_COMMAND), "Unknown command" },
- { STAT(WILDCARDS), "Unknown command" },
- { STAT(NO_CLIENT_ID), "No Client ID given" },
- { STAT(NO_CHANNEL_ID), "No Channel ID given" },
- { STAT(NO_SERVER_ID), "No Server ID given" },
- { STAT(BAD_CLIENT_ID), "Bad Client ID" },
- { STAT(BAD_CHANNEL_ID), "Bad Channel ID" },
- { STAT(NO_SUCH_CLIENT_ID), "There was no such client" },
- { STAT(NO_SUCH_CHANNEL_ID),"There was no such channel" },
- { STAT(NICKNAME_IN_USE), "Nickname already exists" },
- { STAT(NOT_ON_CHANNEL), "You are not on that channel" },
- { STAT(USER_NOT_ON_CHANNEL),"They are not on the channel" },
- { STAT(USER_ON_CHANNEL), "User already on the channel" },
- { STAT(NOT_REGISTERED), "You have not registered" },
- { STAT(NOT_ENOUGH_PARAMS), "Not enough parameters" },
- { STAT(TOO_MANY_PARAMS), "Too many parameters" },
- { STAT(PERM_DENIED), "Permission denied" },
- { STAT(BANNED_FROM_SERVER),"You are banned from this server" },
- { STAT(BAD_PASSWORD), "Cannot join channel. Incorrect password" },
- { STAT(CHANNEL_IS_FULL), "Cannot join channel. Channel is full" },
- { STAT(NOT_INVITED), "Cannot join channel. You have not been invited" },
- { STAT(BANNED_FROM_CHANNEL), "Cannot join channel. You have been banned" },
- { STAT(UNKNOWN_MODE), "Unknown mode" },
- { STAT(NOT_YOU), "Cannot change mode for other users" },
- { STAT(NO_CHANNEL_PRIV), "Permission denied. You are not channel operator" },
- { STAT(NO_CHANNEL_FOPRIV),"Permission denied. You are not channel founder" },
- { STAT(NO_SERVER_PRIV), "Permission denied. You are not server operator" },
- { STAT(NO_ROUTER_PRIV), "Permission denied. You are not SILC operator" },
- { STAT(BAD_NICKNAME), "Bad nickname" },
- { STAT(BAD_CHANNEL), "Bad channel name" },
- { STAT(AUTH_FAILED), "Authentication failed" },
- { STAT(UNKNOWN_ALGORITHM), "Unsupported algorithm" },
- { STAT(NO_SUCH_SERVER_ID), "No such Server ID" },
-
- { 0, NULL }
-};
-/* Command reply operation that is called at the end of all command replys.
- Usage: COMMAND_REPLY((ARGS, argument1, argument2, etc...)), */
-#define COMMAND_REPLY(args) cmd->client->ops->command_reply args
-#define ARGS cmd->client, cmd->sock->user_data, \
- cmd->payload, TRUE, silc_command_get(cmd->payload), status
-
-/* Error reply to application. Usage: COMMAND_REPLY_ERROR; */
-#define COMMAND_REPLY_ERROR cmd->client->ops->command_reply(cmd->client, \
- cmd->sock->user_data, cmd->payload, FALSE, \
- silc_command_get(cmd->payload), status)
-
-/* Process received command reply. */
-
-void silc_client_command_reply_process(SilcClient client,
- SilcSocketConnection sock,
- SilcPacketContext *packet)
+ SilcClient client = cmd->conn->client;
+ SilcClientConnection conn = cmd->conn;
+ SilcArgumentPayload args = silc_command_get_args(payload);
+ SilcID id;
+
+ if (cmd->error == SILC_STATUS_ERR_NO_SUCH_CLIENT_ID) {
+ SilcClientEntry client_entry;
+
+ /* Remove unknown client entry from cache */
+ if (!silc_argument_get_decoded(args, 2, SILC_ARGUMENT_ID, &id, NULL))
+ return;
+
+ client_entry = silc_client_get_client_by_id(client, conn, &id.u.client_id);
+ if (client_entry) {
+ silc_client_remove_from_channels(client, conn, client_entry);
+ silc_client_del_client(client, conn, client_entry);
+ silc_client_unref_client(client, conn, client_entry);
+ }
+ return;
+ }
+
+ if (cmd->error == SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID) {
+ SilcChannelEntry channel;
+
+ /* Remove unknown channel entry from cache */
+ if (!silc_argument_get_decoded(args, 2, SILC_ARGUMENT_ID, &id, NULL))
+ return;
+
+ channel = silc_client_get_channel_by_id(client, conn, &id.u.channel_id);
+ if (channel) {
+ silc_client_empty_channel(client, conn, channel);
+ silc_client_del_channel(client, conn, channel);
+ silc_client_unref_channel(client, conn, channel);
+ }
+ return;
+ }
+
+ if (cmd->error == SILC_STATUS_ERR_NO_SUCH_SERVER_ID) {
+ SilcServerEntry server_entry;
+
+ /* Remove unknown server entry from cache */
+ if (!silc_argument_get_decoded(args, 2, SILC_ARGUMENT_ID, &id, NULL))
+ return;
+
+ server_entry = silc_client_get_server_by_id(client, conn, &id.u.server_id);
+ if (server_entry) {
+ silc_client_del_server(client, conn, server_entry);
+ silc_client_unref_server(client, conn, server_entry);
+ }
+ return;
+ }
+}
+
+/***************************** Command Reply ********************************/
+
+/* Process received command reply packet */
+
+SILC_FSM_STATE(silc_client_command_reply)