+Sun Nov 18 01:34:41 EET 2001 Pekka Riikonen <priikone@silcnet.org>
+
+ * Fixed silc_client_channel_message to not try to decrypt
+ the message twice if it resolved the destination client
+ information. This could cause of dropping one channel
+ message. Affected file lib/silcclient/client_channel.c.
+
Wed Nov 14 23:44:56 EET 2001 Pekka Riikonen <priikone@silcnet.org>
* Added silc_client_run_one into lib/silcclient/silcapi.h and
return TRUE;
if (nick[i] <= 32) return TRUE;
if (nick[i] == ' ') return TRUE;
- if (nick[i] == '\\') return TRUE;
- if (nick[i] == '\"') return TRUE;
if (nick[i] == '*') return TRUE;
if (nick[i] == '?') return TRUE;
if (nick[i] == ',') return TRUE;
- if (nick[i] == '@') return TRUE;
- if (nick[i] == ':') return TRUE;
- if (nick[i] == '/') return TRUE;
- if (nick[i] == '[') return TRUE;
- if (nick[i] == '[') return TRUE;
- if (nick[i] == '(') return TRUE;
- if (nick[i] == ')') return TRUE;
- if (nick[i] == '{') return TRUE;
- if (nick[i] == '}') return TRUE;
- if (nick[i] == '<') return TRUE;
- if (nick[i] == '>') return TRUE;
}
return FALSE;
#endif
#ifndef bool
+#ifndef CXX
#define bool unsigned char
#endif
+#endif
/* Generic global SILC includes */
#include "bitmove.h"
silc_free(id_string);
}
+typedef struct {
+ SilcChannelMessagePayload payload;
+ SilcChannelID *channel_id;
+} *SilcChannelClientResolve;
+
static void silc_client_channel_message_cb(SilcClient client,
SilcClientConnection conn,
SilcClientEntry *clients,
uint32 clients_count,
void *context)
{
- SilcPacketContext *packet = (SilcPacketContext *)context;
+ SilcChannelClientResolve res = (SilcChannelClientResolve)context;
+
+ if (clients_count == 1) {
+ SilcIDCacheEntry id_cache = NULL;
+ SilcChannelEntry channel;
+ unsigned char *message;
- if (clients)
- silc_client_channel_message(client, conn->sock, packet);
- silc_packet_context_free(packet);
+ if (!silc_idcache_find_by_id_one(conn->channel_cache, res->channel_id,
+ &id_cache))
+ goto out;
+
+ channel = (SilcChannelEntry)id_cache->context;
+ message = silc_channel_message_get_data(res->payload, NULL);
+
+ /* Pass the message to application */
+ client->ops->channel_message(client, conn, clients[0], channel,
+ silc_channel_message_get_flags(res->payload),
+ message);
+ }
+
+ out:
+ silc_channel_message_payload_free(res->payload);
+ silc_free(res->channel_id);
+ silc_free(res);
}
/* Process received message to a channel (or from a channel, really). This
if (!found) {
/* Resolve the client info */
+ SilcChannelClientResolve res = silc_calloc(1, sizeof(*res));
+ res->payload = payload;
+ res->channel_id = id;
silc_client_get_client_by_id_resolve(client, conn, client_id,
silc_client_channel_message_cb,
- silc_packet_context_dup(packet));
+ res);
+ payload = NULL;
+ id = NULL;
goto out;
}
unsigned char *old_data = sb->data;
#ifdef SILC_DEBUG
- assert(len <= (sb->tail - sb->data));
+ assert(len <= (uint32)(sb->tail - sb->data));
#endif
sb->data += len;
unsigned char *old_tail = sb->tail;
#ifdef SILC_DEBUG
- assert((sb->end - sb->tail) >= len);
+ assert((uint32)(sb->end - sb->tail) >= len);
#endif
sb->tail += len;
uint32 len)
{
#ifdef SILC_DEBUG
- assert((sb->data - sb->head) >= len);
+ assert((uint32)(sb->data - sb->head) >= len);
#endif
return (unsigned char *)memcpy(sb->head, data, len);
}
uint32 len)
{
#ifdef SILC_DEBUG
- assert((sb->tail - sb->data) >= len);
+ assert((uint32)(sb->tail - sb->data) >= len);
#endif
return (unsigned char *)memcpy(sb->data, data, len);
}
uint32 len)
{
#ifdef SILC_DEBUG
- assert((sb->end - sb->tail) >= len);
+ assert((uint32)(sb->end - sb->tail) >= len);
#endif
return (unsigned char *)memcpy(sb->tail, data, len);
}