From 750834b711cdbbec532860a7390a66f78e639255 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 16 Mar 2003 17:39:25 +0000 Subject: [PATCH] Handle RESOLVING flag correctly during JOIN notify. --- lib/silcclient/client_notify.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/silcclient/client_notify.c b/lib/silcclient/client_notify.c index b6df9915..9b57f415 100644 --- a/lib/silcclient/client_notify.c +++ b/lib/silcclient/client_notify.c @@ -291,6 +291,8 @@ void silc_client_notify_by_server(SilcClient client, /* Find Client entry and if not found query it */ client_entry = silc_client_get_client_by_id(client, conn, client_id); if (!client_entry) { + silc_client_channel_set_wait(client, conn, channel, + conn->cmd_ident + 1); silc_client_notify_by_server_resolve(client, conn, packet, SILC_ID_CLIENT, client_id); goto out; @@ -299,9 +301,21 @@ void silc_client_notify_by_server(SilcClient client, /* If nickname or username hasn't been resolved, do so */ if (!client_entry->nickname || !client_entry->username) { if (client_entry->status & SILC_CLIENT_STATUS_RESOLVING) { - client_entry->status &= ~SILC_CLIENT_STATUS_RESOLVING; + /* Attach to existing resolving */ + SilcClientNotifyResolve res = silc_calloc(1, sizeof(*res)); + res->packet = silc_packet_context_dup(packet); + res->context = client; + res->sock = silc_socket_dup(conn->sock); + silc_client_command_pending(conn, SILC_COMMAND_NONE, + client_entry->resolve_cmd_ident, + silc_client_notify_by_server_pending, + res); goto out; } + + /* Do new resolving */ + silc_client_channel_set_wait(client, conn, channel, + conn->cmd_ident + 1); silc_client_notify_by_server_resolve(client, conn, packet, SILC_ID_CLIENT, client_id); client_entry->status |= SILC_CLIENT_STATUS_RESOLVING; @@ -326,6 +340,12 @@ void silc_client_notify_by_server(SilcClient client, if (!channel) break; + /* If information is being resolved for this channel, wait for it */ + if (channel->resolve_cmd_ident) { + silc_client_channel_wait(client, conn, channel, packet); + goto out; + } + /* Join the client to channel */ if (!silc_client_on_channel(channel, client_entry)) { chu = silc_calloc(1, sizeof(*chu)); @@ -715,6 +735,8 @@ void silc_client_notify_by_server(SilcClient client, conn->cmd_ident + 1); silc_client_notify_by_server_resolve(client, conn, packet, SILC_ID_CLIENT, client_id); + client_entry->status |= SILC_CLIENT_STATUS_RESOLVING; + client_entry->resolve_cmd_ident = conn->cmd_ident; goto out; } } else if (id_type == SILC_ID_SERVER) { @@ -861,6 +883,8 @@ void silc_client_notify_by_server(SilcClient client, conn->cmd_ident + 1); silc_client_notify_by_server_resolve(client, conn, packet, SILC_ID_CLIENT, client_id); + client_entry->status |= SILC_CLIENT_STATUS_RESOLVING; + client_entry->resolve_cmd_ident = conn->cmd_ident; goto out; } } else if (id_type == SILC_ID_SERVER) { -- 2.24.0