X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcclient%2Fcommand_reply.c;h=9e8d9a9ecb28868df5dfc4e32c63a5fb1360be8a;hp=5fee4e825b52ad3d08c245bab454b80baf4c4a9f;hb=386c883d8774999c6e74d7c6c37e52e4163a4cb1;hpb=2bde404c8c0498aae2b6f7ec68061abaf4ba5592 diff --git a/lib/silcclient/command_reply.c b/lib/silcclient/command_reply.c index 5fee4e82..9e8d9a9e 100644 --- a/lib/silcclient/command_reply.c +++ b/lib/silcclient/command_reply.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 @@ -39,7 +39,7 @@ 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(NO_SUCH_SERVER), "There was no such server" }, { STAT(TOO_MANY_TARGETS), "Duplicate recipients. No message delivered" }, { STAT(NO_RECIPIENT), "No recipient given" }, { STAT(UNKNOWN_COMMAND), "Unknown command" }, @@ -89,6 +89,8 @@ const SilcCommandStatusMessage silc_command_status_messages[] = { command_reply(cmd->client, cmd->sock->user_data, cmd->payload, \ FALSE, silc_command_get(cmd->payload), status) +#define SAY cmd->client->internal->ops->say + /* All functions that call the COMMAND_CHECK_STATUS or the COMMAND_CHECK_STATUS_LIST macros must have out: goto label. */ @@ -209,7 +211,6 @@ silc_client_command_reply_whois_save(SilcClientCommandReplyContext cmd, { SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; SilcClientID *client_id; - SilcIDCacheEntry id_cache = NULL; SilcClientEntry client_entry = NULL; int argc; uint32 len; @@ -264,26 +265,20 @@ silc_client_command_reply_whois_save(SilcClientCommandReplyContext cmd, fingerprint = silc_argument_get_arg_type(cmd->args, 9, &fingerprint_len); /* Check if we have this client cached already. */ - if (!silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)client_id, - NULL, NULL, - silc_hash_client_id_compare, NULL, - &id_cache)) { + client_entry = silc_client_get_client_by_id(cmd->client, conn, client_id); + if (!client_entry) { SILC_LOG_DEBUG(("Adding new client entry")); client_entry = silc_client_add_client(cmd->client, conn, nickname, username, realname, client_id, mode); } else { - client_entry = (SilcClientEntry)id_cache->context; silc_client_update_client(cmd->client, conn, client_entry, nickname, username, realname, mode); silc_free(client_id); } if (fingerprint && !client_entry->fingerprint) { - client_entry->fingerprint = - silc_calloc(fingerprint_len, - sizeof(*client_entry->fingerprint)); - memcpy(client_entry->fingerprint, fingerprint, fingerprint_len); + client_entry->fingerprint = silc_memdup(fingerprint, fingerprint_len); client_entry->fingerprint_len = fingerprint_len; } @@ -322,7 +317,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(whois) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_WHOIS); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_WHOIS); /* If we received notify for invalid ID we'll remove the ID if we have it cached. */ @@ -355,7 +349,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(whowas) SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; SilcCommandStatus status; SilcClientID *client_id; - SilcIDCacheEntry id_cache = NULL; SilcClientEntry client_entry = NULL; uint32 len; unsigned char *id_data; @@ -377,11 +370,7 @@ SILC_CLIENT_CMD_REPLY_FUNC(whowas) } /* Get the client entry, if exists */ - if (silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)client_id, - NULL, NULL, - silc_hash_client_id_compare, NULL, - &id_cache)) - client_entry = (SilcClientEntry)id_cache->context; + client_entry = silc_client_get_client_by_id(cmd->client, conn, client_id); silc_free(client_id); nickname = silc_argument_get_arg_type(cmd->args, 3, &len); @@ -406,7 +395,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(whowas) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_WHOWAS); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_WHOWAS); silc_client_command_reply_free(cmd); } @@ -458,17 +446,13 @@ silc_client_command_reply_identify_save(SilcClientCommandReplyContext cmd, SILC_LOG_DEBUG(("Received client information")); /* Check if we have this client cached already. */ - if (!silc_idcache_find_by_id_one_ext(conn->client_cache, - (void *)client_id, - NULL, NULL, - silc_hash_client_id_compare, NULL, - &id_cache)) { + client_entry = silc_client_get_client_by_id(cmd->client, conn, client_id); + if (!client_entry) { SILC_LOG_DEBUG(("Adding new client entry")); client_entry = silc_client_add_client(cmd->client, conn, name, info, NULL, silc_id_dup(client_id, id_type), 0); } else { - client_entry = (SilcClientEntry)id_cache->context; silc_client_update_client(cmd->client, conn, client_entry, name, info, NULL, 0); } @@ -517,16 +501,15 @@ silc_client_command_reply_identify_save(SilcClientCommandReplyContext cmd, SILC_LOG_DEBUG(("Received channel information")); /* Check if we have this channel cached already. */ - if (!silc_idcache_find_by_id_one(conn->channel_cache, - (void *)channel_id, &id_cache)) { + channel_entry = silc_client_get_channel_by_id(client, conn, channel_id); + if (!channel_entry) { if (!name) break; - SILC_LOG_DEBUG(("Adding new channel entry")); - channel_entry = silc_client_new_channel_id(client, conn->sock, - strdup(name), 0, idp); - } else { - channel_entry = (SilcChannelEntry)id_cache->context; + /* Add new channel entry */ + channel_entry = silc_client_add_channel(client, conn, name, 0, + channel_id); + channel_id = NULL; } /* Notify application */ @@ -565,7 +548,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(identify) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_IDENTIFY); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_IDENTIFY); /* If we received notify for invalid ID we'll remove the ID if we have it cached. */ @@ -606,21 +588,16 @@ SILC_CLIENT_CMD_REPLY_FUNC(nick) SILC_GET16_MSB(status, silc_argument_get_arg_type(cmd->args, 1, NULL)); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, - conn, SILC_CLIENT_MESSAGE_ERROR, - "Cannot set nickname: %s", - silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "Cannot set nickname: %s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } argc = silc_argument_get_arg_num(cmd->args); if (argc < 2 || argc > 2) { - cmd->client->internal->ops->say( - cmd->client, - conn, SILC_CLIENT_MESSAGE_ERROR, - "Cannot set nickname: bad reply to command"); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "Cannot set nickname: bad reply to command"); COMMAND_REPLY_ERROR; goto out; } @@ -637,13 +614,11 @@ SILC_CLIENT_CMD_REPLY_FUNC(nick) /* Notify application */ SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_NICK); COMMAND_REPLY((ARGS, conn->local_entry)); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_NICK); silc_client_command_reply_free(cmd); return; out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_NICK); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_NICK); silc_client_command_reply_free(cmd); } @@ -676,7 +651,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(list) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_LIST); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_LIST); silc_client_command_reply_free(cmd); } @@ -689,15 +663,14 @@ SILC_CLIENT_CMD_REPLY_FUNC(topic) SilcCommandStatus status; SilcChannelEntry channel; SilcChannelID *channel_id = NULL; - SilcIDCacheEntry id_cache = NULL; unsigned char *tmp; char *topic; uint32 argc, len; SILC_GET16_MSB(status, silc_argument_get_arg_type(cmd->args, 1, NULL)); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -723,21 +696,18 @@ SILC_CLIENT_CMD_REPLY_FUNC(topic) goto out; /* Get the channel entry */ - if (!silc_idcache_find_by_id_one(conn->channel_cache, (void *)channel_id, - &id_cache)) { + channel = silc_client_get_channel_by_id(cmd->client, conn, channel_id); + if (!channel) { silc_free(channel_id); COMMAND_REPLY_ERROR; goto out; } - channel = (SilcChannelEntry)id_cache->context; - /* Notify application */ COMMAND_REPLY((ARGS, channel, topic)); out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_TOPIC); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_TOPIC); silc_client_command_reply_free(cmd); } @@ -750,15 +720,14 @@ SILC_CLIENT_CMD_REPLY_FUNC(invite) SilcCommandStatus status; SilcChannelEntry channel; SilcChannelID *channel_id; - SilcIDCacheEntry id_cache; unsigned char *tmp; uint32 len; tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -773,14 +742,12 @@ SILC_CLIENT_CMD_REPLY_FUNC(invite) goto out; /* Get the channel entry */ - if (!silc_idcache_find_by_id_one(conn->channel_cache, (void *)channel_id, - &id_cache)) { + channel = silc_client_get_channel_by_id(cmd->client, conn, channel_id); + if (!channel) { silc_free(channel_id); COMMAND_REPLY_ERROR; goto out; } - - channel = (SilcChannelEntry)id_cache->context; /* Get the invite list */ tmp = silc_argument_get_arg_type(cmd->args, 3, &len); @@ -790,7 +757,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(invite) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_INVITE); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_INVITE); silc_client_command_reply_free(cmd); } @@ -804,8 +770,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(kill) SILC_GET16_MSB(status, silc_argument_get_arg_type(cmd->args, 1, NULL)); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -815,7 +781,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(kill) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_KILL); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_KILL); silc_client_command_reply_free(cmd); } @@ -839,11 +804,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(info) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, - SILC_CLIENT_MESSAGE_ERROR, - "%s", - silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, "%s", + silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -889,7 +851,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(info) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_INFO); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_INFO); silc_free(server_id); silc_client_command_reply_free(cmd); } @@ -907,8 +868,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(ping) SILC_GET16_MSB(status, silc_argument_get_arg_type(cmd->args, 1, NULL)); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -926,10 +887,10 @@ SILC_CLIENT_CMD_REPLY_FUNC(ping) continue; if (SILC_ID_SERVER_COMPARE(conn->ping[i].dest_id, id)) { diff = curtime - conn->ping[i].start_time; - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "Ping reply from %s: %d second%s", - conn->ping[i].dest_name, diff, - diff == 1 ? "" : "s"); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, + "Ping reply from %s: %d second%s", + conn->ping[i].dest_name, diff, + diff == 1 ? "" : "s"); conn->ping[i].start_time = 0; silc_free(conn->ping[i].dest_id); @@ -947,7 +908,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(ping) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_PING); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_PING); silc_client_command_reply_free(cmd); } @@ -958,11 +918,10 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context; SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; SilcCommandStatus status; - SilcIDPayload idp = NULL; SilcChannelEntry channel; - SilcIDCacheEntry id_cache = NULL; SilcChannelUser chu; - uint32 argc, mode, len, list_count; + SilcChannelID *channel_id; + uint32 argc, mode = 0, len, list_count; char *topic, *tmp, *channel_name = NULL, *hmac; SilcBuffer keyp = NULL, client_id_list = NULL, client_mode_list = NULL; int i; @@ -972,16 +931,16 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) SILC_GET16_MSB(status, silc_argument_get_arg_type(cmd->args, 1, NULL)); if (status != SILC_STATUS_OK) { if (status != SILC_STATUS_ERR_USER_ON_CHANNEL) - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } argc = silc_argument_get_arg_num(cmd->args); if (argc < 7 || argc > 14) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "Cannot join channel: Bad reply packet"); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "Cannot join channel: Bad reply packet"); COMMAND_REPLY_ERROR; goto out; } @@ -989,26 +948,24 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) /* Get channel name */ tmp = silc_argument_get_arg_type(cmd->args, 2, NULL); if (!tmp) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "Cannot join channel: Bad reply packet"); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "Cannot join channel: Bad reply packet"); COMMAND_REPLY_ERROR; goto out; } - channel_name = strdup(tmp); + channel_name = tmp; /* Get Channel ID */ tmp = silc_argument_get_arg_type(cmd->args, 3, &len); if (!tmp) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "Cannot join channel: Bad reply packet"); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "Cannot join channel: Bad reply packet"); COMMAND_REPLY_ERROR; - silc_free(channel_name); goto out; } - idp = silc_id_payload_parse(tmp, len); - if (!idp) { + channel_id = silc_id_payload_parse_id(tmp, len); + if (!channel_id) { COMMAND_REPLY_ERROR; - silc_free(channel_name); goto out; } @@ -1016,8 +973,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) tmp = silc_argument_get_arg_type(cmd->args, 5, NULL); if (tmp) SILC_GET32_MSB(mode, tmp); - else - mode = 0; /* Get channel key */ tmp = silc_argument_get_arg_type(cmd->args, 7, &len); @@ -1030,15 +985,16 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) /* Get topic */ topic = silc_argument_get_arg_type(cmd->args, 10, NULL); - /* If we have the channel entry, remove it and create a new one */ + /* Check whether we have this channel entry already. */ channel = silc_client_get_channel(cmd->client, conn, channel_name); - if (channel) - silc_client_del_channel(cmd->client, conn, channel); - - /* Save received Channel ID. This actually creates the channel */ - channel = silc_client_new_channel_id(cmd->client, cmd->sock, channel_name, - mode, idp); - silc_id_payload_free(idp); + if (channel) { + if (!SILC_ID_CHANNEL_COMPARE(channel->id, channel_id)) + silc_client_replace_channel_id(cmd->client, conn, channel, channel_id); + } else { + /* Create new channel entry */ + channel = silc_client_add_channel(cmd->client, conn, channel_name, + mode, channel_id); + } conn->current_channel = channel; @@ -1046,11 +1002,9 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) hmac = silc_argument_get_arg_type(cmd->args, 11, NULL); if (hmac) { if (!silc_hmac_alloc(hmac, NULL, &channel->hmac)) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "Cannot join channel: Unsupported HMAC `%s'", - hmac); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "Cannot join channel: Unsupported HMAC `%s'", hmac); COMMAND_REPLY_ERROR; - silc_free(channel_name); goto out; } } @@ -1097,27 +1051,23 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) SILC_GET32_MSB(mode, client_mode_list->data); /* Check if we have this client cached already. */ - if (!silc_idcache_find_by_id_one_ext(conn->client_cache, - (void *)client_id, - NULL, NULL, - silc_hash_client_id_compare, NULL, - &id_cache)) { + client_entry = silc_client_get_client_by_id(cmd->client, conn, client_id); + if (!client_entry) { /* No, we don't have it, add entry for it. */ client_entry = silc_client_add_client(cmd->client, conn, NULL, NULL, NULL, silc_id_dup(client_id, SILC_ID_CLIENT), 0); - } else { - /* Yes, we have it already */ - client_entry = (SilcClientEntry)id_cache->context; } - /* Join the client to the channel */ + /* Join client to the channel */ chu = silc_calloc(1, sizeof(*chu)); chu->client = client_entry; + chu->channel = channel; chu->mode = mode; - silc_list_add(channel->clients, chu); - silc_free(client_id); + silc_hash_table_add(channel->user_list, client_entry, chu); + silc_hash_table_add(client_entry->channels, channel, chu); + silc_free(client_id); silc_buffer_pull(client_id_list, idp_len); silc_buffer_pull(client_mode_list, 4); } @@ -1127,11 +1077,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) client_mode_list->head); /* Save channel key */ - if (!(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) - silc_client_save_channel_key(conn, keyp, channel); - - /* Client is now joined to the channel */ - channel->on_channel = TRUE; + if (keyp && !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) + silc_client_save_channel_key(cmd->client, conn, keyp, channel); /* Notify application */ COMMAND_REPLY((ARGS, channel_name, channel, mode, 0, @@ -1141,7 +1088,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(join) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_JOIN); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_JOIN); silc_client_command_reply_free(cmd); if (keyp) @@ -1166,8 +1112,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(motd) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; return; } @@ -1196,8 +1142,7 @@ SILC_CLIENT_CMD_REPLY_FUNC(motd) if (i == 2) line[0] = ' '; - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, - "%s", line); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_INFO, "%s", line); if (!strlen(cp)) break; @@ -1211,7 +1156,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(motd) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_MOTD); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_MOTD); silc_client_command_reply_free(cmd); } @@ -1228,8 +1172,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(umode) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1248,7 +1192,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(umode) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_UMODE); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_UMODE); silc_client_command_reply_free(cmd); } @@ -1261,15 +1204,14 @@ SILC_CLIENT_CMD_REPLY_FUNC(cmode) SilcCommandStatus status; unsigned char *tmp; uint32 mode; - SilcIDCacheEntry id_cache; SilcChannelID *channel_id; SilcChannelEntry channel; uint32 len; SILC_GET16_MSB(status, silc_argument_get_arg_type(cmd->args, 1, NULL)); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1283,15 +1225,13 @@ SILC_CLIENT_CMD_REPLY_FUNC(cmode) goto out; /* Get the channel entry */ - if (!silc_idcache_find_by_id_one(conn->channel_cache, (void *)channel_id, - &id_cache)) { + channel = silc_client_get_channel_by_id(cmd->client, conn, channel_id); + if (!channel) { silc_free(channel_id); COMMAND_REPLY_ERROR; goto out; } - channel = (SilcChannelEntry)id_cache->context; - /* Get channel mode */ tmp = silc_argument_get_arg_type(cmd->args, 3, NULL); if (!tmp) { @@ -1311,7 +1251,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(cmode) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_CMODE); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_CMODE); silc_client_command_reply_free(cmd); } @@ -1322,7 +1261,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(cumode) SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context; SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; SilcCommandStatus status; - SilcIDCacheEntry id_cache = NULL; SilcClientID *client_id; SilcChannelID *channel_id; SilcClientEntry client_entry; @@ -1333,8 +1271,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(cumode) SILC_GET16_MSB(status, silc_argument_get_arg_type(cmd->args, 1, NULL)); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1355,15 +1293,13 @@ SILC_CLIENT_CMD_REPLY_FUNC(cumode) goto out; /* Get the channel entry */ - if (!silc_idcache_find_by_id_one(conn->channel_cache, (void *)channel_id, - &id_cache)) { + channel = silc_client_get_channel_by_id(cmd->client, conn, channel_id); + if (!channel) { silc_free(channel_id); COMMAND_REPLY_ERROR; goto out; } - channel = (SilcChannelEntry)id_cache->context; - /* Get Client ID */ id = silc_argument_get_arg_type(cmd->args, 4, &len); if (!id) { @@ -1379,27 +1315,19 @@ SILC_CLIENT_CMD_REPLY_FUNC(cumode) } /* Get client entry */ - if (!silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)client_id, - NULL, NULL, - silc_hash_client_id_compare, NULL, - &id_cache)) { + client_entry = silc_client_get_client_by_id(cmd->client, conn, client_id); + if (!client_entry) { silc_free(channel_id); silc_free(client_id); COMMAND_REPLY_ERROR; goto out; } - client_entry = (SilcClientEntry)id_cache->context; - /* Save the mode */ SILC_GET32_MSB(mode, modev); - silc_list_start(channel->clients); - while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { - if (chu->client == client_entry) { - chu->mode = mode; - break; - } - } + chu = silc_client_on_channel(channel, client_entry); + if (chu) + chu->mode = mode; /* Notify application */ COMMAND_REPLY((ARGS, mode, channel, client_entry)); @@ -1408,7 +1336,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(cumode) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_CUMODE); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_CUMODE); silc_client_command_reply_free(cmd); } @@ -1422,9 +1349,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(kick) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1434,7 +1360,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(kick) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_KICK); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_KICK); silc_client_command_reply_free(cmd); } @@ -1448,9 +1373,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(silcoper) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1460,7 +1384,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(silcoper) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_SILCOPER); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_SILCOPER); silc_client_command_reply_free(cmd); } @@ -1474,10 +1397,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(oper) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, - SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1487,7 +1408,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(oper) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_OPER); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_OPER); silc_client_command_reply_free(cmd); } @@ -1501,9 +1421,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(connect) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1513,7 +1432,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(connect) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_CONNECT); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_CONNECT); silc_client_command_reply_free(cmd); } @@ -1522,7 +1440,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(ban) SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context; SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; SilcCommandStatus status; - SilcIDCacheEntry id_cache = NULL; SilcChannelEntry channel; SilcChannelID *channel_id; unsigned char *tmp; @@ -1531,9 +1448,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(ban) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1548,15 +1464,13 @@ SILC_CLIENT_CMD_REPLY_FUNC(ban) goto out; /* Get the channel entry */ - if (!silc_idcache_find_by_id_one(conn->channel_cache, (void *)channel_id, - &id_cache)) { + channel = silc_client_get_channel_by_id(cmd->client, conn, channel_id); + if (!channel) { silc_free(channel_id); COMMAND_REPLY_ERROR; goto out; } - channel = (SilcChannelEntry)id_cache->context; - /* Get the ban list */ tmp = silc_argument_get_arg_type(cmd->args, 3, &len); @@ -1565,7 +1479,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(ban) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_BAN); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_BAN); silc_client_command_reply_free(cmd); } @@ -1579,9 +1492,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(close) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1591,7 +1503,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(close) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_CLOSE); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_CLOSE); silc_client_command_reply_free(cmd); } @@ -1605,9 +1516,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(shutdown) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1617,7 +1527,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(shutdown) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_SHUTDOWN); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_SHUTDOWN); silc_client_command_reply_free(cmd); } @@ -1633,9 +1542,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(leave) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1645,10 +1553,33 @@ SILC_CLIENT_CMD_REPLY_FUNC(leave) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_LEAVE); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_LEAVE); silc_client_command_reply_free(cmd); } +/* Channel resolving callback for USERS command reply. */ + +static void silc_client_command_reply_users_cb(SilcClient client, + SilcClientConnection conn, + SilcChannelEntry *channels, + uint32 channels_count, + void *context) +{ + if (!channels_count) { + SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context; + SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; + SilcCommandStatus status = SILC_STATUS_ERR_NO_SUCH_CHANNEL; + + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); + COMMAND_REPLY_ERROR; + SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_USERS); + silc_client_command_reply_free(cmd); + return; + } + + silc_client_command_reply_users(context, NULL); +} + /* Reply to USERS command. Received list of client ID's and theirs modes on the channel we requested. */ @@ -1657,8 +1588,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(users) SilcClientCommandReplyContext cmd = (SilcClientCommandReplyContext)context; SilcClientConnection conn = (SilcClientConnection)cmd->sock->user_data; SilcCommandStatus status; - SilcIDCacheEntry id_cache = NULL; SilcChannelEntry channel; + SilcClientEntry client_entry; SilcChannelUser chu; SilcChannelID *channel_id = NULL; SilcBuffer client_id_list = NULL; @@ -1674,9 +1605,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(users) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say( - cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1724,26 +1654,18 @@ SILC_CLIENT_CMD_REPLY_FUNC(users) silc_buffer_put(client_mode_list, tmp, tmp_len); /* Get channel entry */ - if (!silc_idcache_find_by_id_one(conn->channel_cache, (void *)channel_id, - &id_cache)) { + channel = silc_client_get_channel_by_id(cmd->client, conn, channel_id); + if (!channel) { /* Resolve the channel from server */ - silc_idlist_get_channel_by_id(cmd->client, conn, channel_id, TRUE); - - /* Register pending command callback. After we've received the channel - information we will reprocess this command reply by re-calling this - USERS command reply callback. */ - silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, conn->cmd_ident, - NULL, silc_client_command_reply_users, cmd); + silc_client_get_channel_by_id_resolve(cmd->client, conn, channel_id, + silc_client_command_reply_users_cb, + cmd); + silc_free(channel_id); + if (client_id_list) + silc_buffer_free(client_id_list); + if (client_mode_list) + silc_buffer_free(client_mode_list); return; - } else { - channel = (SilcChannelEntry)id_cache->context; - } - - /* Remove old client list from channel. */ - silc_list_start(channel->clients); - while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { - silc_list_del(channel->clients, chu); - silc_free(chu); } /* Cache the received Client ID's and modes. */ @@ -1751,7 +1673,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(users) uint16 idp_len; uint32 mode; SilcClientID *client_id; - SilcClientEntry client; /* Client ID */ SILC_GET16_MSB(idp_len, client_id_list->data + 2); @@ -1764,18 +1685,9 @@ SILC_CLIENT_CMD_REPLY_FUNC(users) SILC_GET32_MSB(mode, client_mode_list->data); /* Check if we have this client cached already. */ - id_cache = NULL; - silc_idcache_find_by_id_one_ext(conn->client_cache, - (void *)client_id, - NULL, NULL, - silc_hash_client_id_compare, NULL, - &id_cache); - - if (!id_cache || !((SilcClientEntry)id_cache->context)->username || - !((SilcClientEntry)id_cache->context)->realname) { - - if (id_cache && id_cache->context) { - SilcClientEntry client_entry = (SilcClientEntry)id_cache->context; + client_entry = silc_client_get_client_by_id(cmd->client, conn, client_id); + if (!client_entry || !client_entry->username || !client_entry->realname) { + if (client_entry) { if (client_entry->status & SILC_CLIENT_STATUS_RESOLVING) { silc_buffer_pull(client_id_list, idp_len); silc_buffer_pull(client_mode_list, 4); @@ -1798,17 +1710,16 @@ SILC_CLIENT_CMD_REPLY_FUNC(users) res_argv_types[res_argc] = res_argc + 3; res_argc++; } else { - /* Found the client, join it to the channel */ - client = (SilcClientEntry)id_cache->context; - chu = silc_calloc(1, sizeof(*chu)); - chu->client = client; - chu->mode = mode; - silc_list_add(channel->clients, chu); - - silc_free(client_id); - id_cache = NULL; + if (!silc_client_on_channel(channel, client_entry)) { + chu = silc_calloc(1, sizeof(*chu)); + chu->client = client_entry; + chu->channel = channel; + silc_hash_table_add(channel->user_list, client_entry, chu); + silc_hash_table_add(client_entry->channels, channel, chu); + } } + silc_free(client_id); silc_buffer_pull(client_id_list, idp_len); silc_buffer_pull(client_mode_list, 4); } @@ -1833,24 +1744,30 @@ SILC_CLIENT_CMD_REPLY_FUNC(users) command reply we will reprocess this command reply by re-calling this USERS command reply callback. */ silc_client_command_pending(conn, SILC_COMMAND_WHOIS, conn->cmd_ident, - NULL, silc_client_command_reply_users, cmd); + silc_client_command_reply_users, cmd); silc_buffer_free(res_cmd); - if (channel_id) - silc_free(channel_id); - + silc_free(channel_id); silc_free(res_argv); silc_free(res_argv_lens); silc_free(res_argv_types); + if (client_id_list) + silc_buffer_free(client_id_list); + if (client_mode_list) + silc_buffer_free(client_mode_list); return; } + + silc_buffer_push(client_id_list, (client_id_list->data - + client_id_list->head)); + silc_buffer_push(client_mode_list, (client_mode_list->data - + client_mode_list->head)); /* Notify application */ COMMAND_REPLY((ARGS, channel, list_count, client_id_list, client_mode_list)); out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_USERS); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_USERS); silc_client_command_reply_free(cmd); silc_free(channel_id); if (client_id_list) @@ -1885,8 +1802,8 @@ SILC_CLIENT_CMD_REPLY_FUNC(getkey) tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); SILC_GET16_MSB(status, tmp); if (status != SILC_STATUS_OK) { - cmd->client->internal->ops->say(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, - "%s", silc_client_command_status_message(status)); + SAY(cmd->client, conn, SILC_CLIENT_MESSAGE_ERROR, + "%s", silc_client_command_status_message(status)); COMMAND_REPLY_ERROR; goto out; } @@ -1910,32 +1827,21 @@ SILC_CLIENT_CMD_REPLY_FUNC(getkey) SILC_GET16_MSB(type, tmp + 2); pk = tmp + 4; - if (type != SILC_SKE_PK_TYPE_SILC) { - COMMAND_REPLY_ERROR; - goto out; - } - - if (!silc_pkcs_public_key_decode(pk, pk_len, &public_key)) { - COMMAND_REPLY_ERROR; - goto out; - } + if (type == SILC_SKE_PK_TYPE_SILC) + if (!silc_pkcs_public_key_decode(pk, pk_len, &public_key)) + public_key = NULL; } id_type = silc_id_payload_get_type(idp); if (id_type == SILC_ID_CLIENT) { /* Received client's public key */ client_id = silc_id_payload_get_id(idp); - if (!silc_idcache_find_by_id_one_ext(conn->client_cache, - (void *)client_id, - NULL, NULL, - silc_hash_client_id_compare, NULL, - &id_cache)) { + client_entry = silc_client_get_client_by_id(cmd->client, conn, client_id); + if (!client_entry) { COMMAND_REPLY_ERROR; goto out; } - client_entry = (SilcClientEntry)id_cache->context; - /* Notify application */ COMMAND_REPLY((ARGS, id_type, client_entry, public_key)); } else if (id_type == SILC_ID_SERVER) { @@ -1955,7 +1861,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(getkey) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_GETKEY); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_GETKEY); if (idp) silc_id_payload_free(idp); if (public_key) @@ -2004,7 +1909,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(whois_i) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_WHOIS); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_WHOIS); /* If we received notify for invalid ID we'll remove the ID if we have it cached. */ @@ -2061,7 +1965,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(identify_i) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_IDENTIFY); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_IDENTIFY); /* If we received notify for invalid ID we'll remove the ID if we have it cached. */ @@ -2145,7 +2048,6 @@ SILC_CLIENT_CMD_REPLY_FUNC(info_i) out: SILC_CLIENT_PENDING_EXEC(cmd, SILC_COMMAND_INFO); - SILC_CLIENT_PENDING_DESTRUCTOR(cmd, SILC_COMMAND_INFO); silc_free(server_id); silc_client_command_reply_free(cmd); }