From 7e7842d287d8a969e76a3fe4ee2e9e8c0a22db13 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Sun, 27 Oct 2002 09:34:18 +0000 Subject: [PATCH] Attach to existing client resolvings in CUMODE and CMODE notifys. --- lib/silcclient/client_notify.c | 48 ++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/lib/silcclient/client_notify.c b/lib/silcclient/client_notify.c index 48eec411..9c7b0bde 100644 --- a/lib/silcclient/client_notify.c +++ b/lib/silcclient/client_notify.c @@ -717,7 +717,29 @@ void silc_client_notify_by_server(SilcClient client, /* Find Client entry */ client_id = id; client_entry = silc_client_get_client_by_id(client, conn, client_id); - if (!client_entry || !client_entry->nickname) { + 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; + } + + if (!client_entry->nickname) { + if (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, @@ -841,7 +863,29 @@ void silc_client_notify_by_server(SilcClient client, /* Find Client entry */ client_id = id; client_entry = silc_client_get_client_by_id(client, conn, client_id); - if (!client_entry || !client_entry->nickname) { + 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; + } + + if (!client_entry->nickname) { + if (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, -- 2.43.0