X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fcommand_reply.c;h=61e4d73a082dea7df0a86f0d6791a9576612b313;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=dd68d9ced409c98d23b3a67a913ea0b13d559237;hpb=a28fdf02ef9af875606aedd528699a5de955b043;p=silc.git diff --git a/lib/silcclient/command_reply.c b/lib/silcclient/command_reply.c index dd68d9ce..61e4d73a 100644 --- a/lib/silcclient/command_reply.c +++ b/lib/silcclient/command_reply.c @@ -127,7 +127,7 @@ static void silc_client_command_process_error(SilcClientCommandContext cmd, if (cmd->error == SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID) { SilcChannelEntry channel; - /* Remove unknown client entry from cache */ + /* Remove unknown channel entry from cache */ if (!silc_argument_get_decoded(args, 2, SILC_ARGUMENT_ID, &id, NULL)) return; @@ -143,7 +143,7 @@ static void silc_client_command_process_error(SilcClientCommandContext cmd, if (cmd->error == SILC_STATUS_ERR_NO_SUCH_SERVER_ID) { SilcServerEntry server_entry; - /* Remove unknown client entry from cache */ + /* Remove unknown server entry from cache */ if (!silc_argument_get_decoded(args, 2, SILC_ARGUMENT_ID, &id, NULL)) return; @@ -221,7 +221,7 @@ SILC_FSM_STATE(silc_client_command_reply_wait) /** Wait for command reply */ silc_fsm_set_state_context(fsm, NULL); silc_fsm_next_later(fsm, silc_client_command_reply_timeout, - cmd->cmd != SILC_COMMAND_PING ? 25 : 60, 0); + cmd->cmd != SILC_COMMAND_PING ? 40 : 60, 0); return SILC_FSM_WAIT; } @@ -677,7 +677,8 @@ SILC_FSM_STATE(silc_client_command_reply_identify) } /* Notify application */ - silc_client_command_callback(cmd, channel_entry, name, info); + silc_client_command_callback(cmd, channel_entry, + channel_entry->channel_name, info); silc_client_unref_channel(client, conn, channel_entry); break; } @@ -732,6 +733,7 @@ SILC_FSM_STATE(silc_client_command_reply_nick) if (!silc_client_change_nickname(client, conn, conn->local_entry, nick, &id.u.client_id, idp, idp_len)) { ERROR_CALLBACK(SILC_STATUS_ERR_BAD_NICKNAME); + silc_rwlock_unlock(conn->local_entry->internal.lock); goto out; } @@ -800,7 +802,8 @@ SILC_FSM_STATE(silc_client_command_reply_list) } /* Notify application */ - silc_client_command_callback(cmd, channel_entry, name, topic, usercount); + silc_client_command_callback(cmd, channel_entry, channel_entry->channel_name, + topic, usercount); out: silc_client_unref_channel(client, conn, channel_entry); @@ -1290,7 +1293,7 @@ SILC_FSM_STATE(silc_client_command_reply_join) /* Get channel public key list */ tmp = silc_argument_get_arg_type(args, 16, &len); if (tmp) - silc_client_channel_save_public_keys(channel, tmp, len); + silc_client_channel_save_public_keys(channel, tmp, len, FALSE); /* Set current channel */ conn->current_channel = channel; @@ -1302,7 +1305,7 @@ SILC_FSM_STATE(silc_client_command_reply_join) silc_hash_table_list(channel->user_list, &htl); /* Notify application */ - silc_client_command_callback(cmd, channel_name, channel, mode, &htl, + silc_client_command_callback(cmd, channel->channel_name, channel, mode, &htl, topic, cipher, hmac, channel->founder_key, channel->channel_pubkeys, channel->user_limit); @@ -1420,7 +1423,6 @@ SILC_FSM_STATE(silc_client_command_reply_cmode) SilcChannelEntry channel; SilcUInt32 len; SilcPublicKey public_key = NULL; - SilcDList channel_pubkeys = NULL; SilcID id; /* Sanity checks */ @@ -1451,13 +1453,10 @@ SILC_FSM_STATE(silc_client_command_reply_cmode) ERROR_CALLBACK(SILC_STATUS_ERR_NOT_ENOUGH_PARAMS); goto out; } + SILC_GET32_MSB(mode, tmp); silc_rwlock_wrlock(channel->internal.lock); - /* Save the mode */ - SILC_GET32_MSB(mode, tmp); - channel->mode = mode; - /* Get user limit */ tmp = silc_argument_get_arg_type(args, 6, &len); if (tmp && len == 4) @@ -1468,15 +1467,18 @@ SILC_FSM_STATE(silc_client_command_reply_cmode) /* Get channel public key(s) */ tmp = silc_argument_get_arg_type(args, 5, &len); if (tmp) - silc_client_channel_save_public_keys(channel, tmp, len); + silc_client_channel_save_public_keys(channel, tmp, len, FALSE); + else if (channel->mode & SILC_CHANNEL_MODE_CHANNEL_AUTH) + silc_client_channel_save_public_keys(channel, NULL, 0, TRUE); + + /* Save the mode */ + channel->mode = mode; silc_rwlock_unlock(channel->internal.lock); /* Notify application */ silc_client_command_callback(cmd, channel, mode, public_key, - channel_pubkeys, channel->user_limit); - - silc_argument_list_free(channel_pubkeys, SILC_ARGUMENT_PUBLIC_KEY); + channel->channel_pubkeys, channel->user_limit); out: if (public_key) @@ -1946,6 +1948,8 @@ SILC_FSM_STATE(silc_client_command_reply_users) } } + silc_rwlock_unlock(channel->internal.lock); + /* Notify application */ silc_hash_table_list(channel->user_list, &htl); silc_client_command_callback(cmd, channel, &htl);