+Sat May 18 11:35:19 EEST 2002 Pekka Riikonen <priikone@silcnet.org>
+
+ * Allow multiple identical pending commands to be registered
+ in client library. Affected file is lib/silcclient/command.c.
+
+ * Call the completion for resolving client information only
+ after all resolvers has finished. This fixes a crash in
+ the client. Added support for checking when the resolvers
+ are finished. Affected file is lib/silcclient/idlist.c.
+
Fri May 17 17:23:45 EEST 2002 Pekka Riikonen <priikone@silcnet.org>
* Check the watcher list before sending signoff notifys
void servers_reconnect_init(void)
{
- settings_add_int("server", "server_reconnect_time", 300);
+ settings_add_int("server", "server_reconnect_time", 3000);
reconnects = NULL;
last_reconnect_tag = 0;
{
SilcClientCommandPending *reply;
- /* Check whether identical pending already exists for same command,
- ident, callback and callback context. If it does then it would be
- error to register it again. */
- silc_dlist_start(conn->pending_commands);
- while ((reply = silc_dlist_get(conn->pending_commands)) != SILC_LIST_END) {
- if (reply->reply_cmd == reply_cmd && reply->ident == ident &&
- reply->callback == callback && reply->context == context)
- return;
- }
-
reply = silc_calloc(1, sizeof(*reply));
reply->reply_cmd = reply_cmd;
reply->ident = ident;
SilcBuffer client_id_list;
SilcGetClientCallback completion;
void *context;
+ int res_count;
} *GetClientsByListInternal;
SILC_CLIENT_CMD_FUNC(get_clients_list_callback)
SILC_LOG_DEBUG(("Start"));
+ if (i->res_count) {
+ i->res_count--;
+ if (i->res_count)
+ return;
+ }
+
+ SILC_LOG_DEBUG(("Resolved all clients"));
+
for (c = 0; c < i->list_count; c++) {
SilcUInt16 idp_len;
SilcClientID *client_id;
silc_client_command_get_clients_list_callback,
(void *)in);
wait_res = TRUE;
+ in->res_count++;
silc_free(client_id);
silc_buffer_pull(client_id_list, idp_len);
}
/* No we don't have it, query it from the server. Assemble argument
- table that will be sent fr the IDENTIFY command later. */
+ table that will be sent for the IDENTIFY command later. */
res_argv = silc_realloc(res_argv, sizeof(*res_argv) *
(res_argc + 1));
res_argv_lens = silc_realloc(res_argv_lens, sizeof(*res_argv_lens) *
silc_client_command_pending(conn, SILC_COMMAND_IDENTIFY, conn->cmd_ident,
silc_client_command_get_clients_list_callback,
(void *)in);
+ in->res_count++;
silc_buffer_free(res_cmd);
silc_free(res_argv);