From: Pekka Riikonen Date: Sun, 5 Nov 2000 18:16:43 +0000 (+0000) Subject: Changed channel->clients to SilcList. X-Git-Tag: SILC.0.1~329 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=66dc2106d8870af33de62148d586635c693a0145 Changed channel->clients to SilcList. --- diff --git a/CHANGES b/CHANGES index e455029b..d338e348 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +Sun Nov 5 22:28:44 EET 2000 Pekka Riikonen + + * Changed client librarys channel->clients table to SilcList and + changed code accordingly. + Thu Nov 2 16:28:01 EET 2000 Pekka Riikonen * Changed client's channel table to SilcList and changed code diff --git a/apps/silc/client_ops.c b/apps/silc/client_ops.c index a127140c..3a2342db 100644 --- a/apps/silc/client_ops.c +++ b/apps/silc/client_ops.c @@ -284,8 +284,8 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, SilcCommand command, SilcCommandStatus status, ...) { SilcClientInternal app = (SilcClientInternal)client->application; + SilcChannelUser chu; va_list vp; - int i; if (!success) return; @@ -319,16 +319,19 @@ void silc_command_reply(SilcClient client, SilcClientConnection conn, break; case SILC_COMMAND_NAMES: - for (i = 0; i < conn->current_channel->clients_count; i++) - if (conn->current_channel->clients[i].client == conn->local_entry) { + silc_list_start(conn->current_channel->clients); + while ((chu = silc_list_get(conn->current_channel->clients)) + != SILC_LIST_END) { + if (chu->client == conn->local_entry) { if (app->screen->bottom_line->mode) silc_free(app->screen->bottom_line->mode); app->screen->bottom_line->mode = - silc_client_chumode_char(conn->current_channel->clients[i].mode); + silc_client_chumode_char(chu->mode); silc_screen_print_bottom_line(app->screen, 0); break; } break; + } } } diff --git a/lib/silcclient/client.c b/lib/silcclient/client.c index 9737ceff..4ba45528 100644 --- a/lib/silcclient/client.c +++ b/lib/silcclient/client.c @@ -1294,6 +1294,7 @@ void silc_client_notify_by_server(SilcClient client, SilcClientEntry client_entry; SilcClientEntry client_entry2; SilcChannelEntry channel; + SilcChannelUser chu; SilcIDCacheEntry id_cache = NULL; unsigned char *tmp; unsigned int tmp_len, mode; @@ -1390,22 +1391,9 @@ void silc_client_notify_by_server(SilcClient client, channel = (SilcChannelEntry)id_cache->context; /* Add client to channel */ - for (i = 0; i < channel->clients_count; i++) { - if (channel->clients[i].client == NULL) { - channel->clients[channel->clients_count].client = client_entry; - channel->clients_count++; - break; - } - } - - if (i == channel->clients_count) { - channel->clients = silc_realloc(channel->clients, - sizeof(*channel->clients) * - (channel->clients_count + 1)); - channel->clients[channel->clients_count].client = client_entry; - channel->clients[channel->clients_count].mode = 0; - channel->clients_count++; - } + chu = silc_calloc(1, sizeof(*chu)); + chu->client = client_entry; + silc_list_add(channel->clients, chu); /* XXX add support for multiple same nicks on same channel. Check for them here */ @@ -1444,10 +1432,11 @@ void silc_client_notify_by_server(SilcClient client, channel = (SilcChannelEntry)id_cache->context; /* Remove client from channel */ - for (i = 0; i < channel->clients_count; i++) { - if (channel->clients[i].client == client_entry) { - channel->clients[i].client = NULL; - channel->clients_count--; + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + if (chu->client == client_entry) { + silc_list_del(channel->clients, chu); + silc_free(chu); break; } } @@ -1694,9 +1683,10 @@ void silc_client_notify_by_server(SilcClient client, channel = (SilcChannelEntry)id_cache->context; /* Save the mode */ - for (i = 0; i < channel->clients_count; i++) { - if (channel->clients[i].client == client_entry2) { - channel->clients[i].mode = mode; + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + if (chu->client == client_entry) { + chu->mode = mode; break; } } @@ -1792,6 +1782,8 @@ void silc_client_new_channel_id(SilcClient client, channel->channel_name = channel_name; channel->id = silc_id_payload_get_id(idp); channel->mode = mode; + silc_list_init(channel->clients, struct SilcChannelUserStruct, next); + conn->current_channel = channel; /* Put it to the ID cache */ @@ -1873,6 +1865,7 @@ void silc_client_channel_message(SilcClient client, SilcChannelPayload payload = NULL; SilcChannelID *id = NULL; SilcChannelEntry channel; + SilcChannelUser chu; SilcIDCacheEntry id_cache = NULL; SilcClientID *client_id = NULL; int i; @@ -1907,10 +1900,12 @@ void silc_client_channel_message(SilcClient client, /* Find nickname */ nickname = "[unknown]"; - for (i = 0; i < channel->clients_count; i++) { - if (channel->clients[i].client && - !SILC_ID_CLIENT_COMPARE(channel->clients[i].client->id, client_id)) - nickname = channel->clients[i].client->nickname; + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + if (!SILC_ID_CLIENT_COMPARE(chu->client->id, client_id)) { + nickname = chu->client->nickname; + break; + } } /* Pass the message to application */ @@ -2011,6 +2006,7 @@ void silc_client_remove_from_channels(SilcClient client, SilcIDCacheEntry id_cache; SilcIDCacheList list; SilcChannelEntry channel; + SilcChannelUser chu; int i; if (!silc_idcache_find_by_id(conn->channel_cache, SILC_ID_CACHE_ANY, @@ -2023,10 +2019,11 @@ void silc_client_remove_from_channels(SilcClient client, while (channel) { /* Remove client from channel */ - for (i = 0; i < channel->clients_count; i++) { - if (channel->clients[i].client == client_entry) { - channel->clients[i].client = NULL; - channel->clients_count--; + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + if (chu->client == client_entry) { + silc_list_del(channel->clients, chu); + silc_free(chu); break; } } @@ -2053,6 +2050,7 @@ void silc_client_replace_from_channels(SilcClient client, SilcIDCacheEntry id_cache; SilcIDCacheList list; SilcChannelEntry channel; + SilcChannelUser chu; int i; if (!silc_idcache_find_by_id(conn->channel_cache, SILC_ID_CACHE_ANY, @@ -2064,10 +2062,11 @@ void silc_client_replace_from_channels(SilcClient client, while (channel) { - /* Remove client from channel */ - for (i = 0; i < channel->clients_count; i++) { - if (channel->clients[i].client == old) { - channel->clients[i].client = new; + /* Replace client entry */ + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + if (chu->client == old) { + chu->client = new; break; } } diff --git a/lib/silcclient/command.c b/lib/silcclient/command.c index b19b8bec..0f706c35 100644 --- a/lib/silcclient/command.c +++ b/lib/silcclient/command.c @@ -928,6 +928,7 @@ SILC_CLIENT_CMD_FUNC(cumode) SilcClientCommandContext cmd = (SilcClientCommandContext)context; SilcClientConnection conn = cmd->conn; SilcChannelEntry channel; + SilcChannelUser chu; SilcClientEntry client_entry; SilcBuffer buffer, clidp, chidp; unsigned char *name, *cp, modebuf[4]; @@ -986,11 +987,12 @@ SILC_CLIENT_CMD_FUNC(cumode) return; } - for (i = 0; i < channel->clients_count; i++) - if (channel->clients[i].client == client_entry) { - mode = channel->clients[i].mode; + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + if (chu->client == client_entry) { + chu->mode = mode; break; } + } /* Are we adding or removing mode */ if (cmd->argv[2][0] == '-') diff --git a/lib/silcclient/command_reply.c b/lib/silcclient/command_reply.c index 91562fdb..80cee3ba 100644 --- a/lib/silcclient/command_reply.c +++ b/lib/silcclient/command_reply.c @@ -955,6 +955,7 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) SilcCommandStatus status; SilcIDCacheEntry id_cache = NULL; SilcChannelEntry channel; + SilcChannelUser chu; SilcChannelID *channel_id = NULL; SilcBuffer client_id_list; SilcBuffer client_mode_list; @@ -1035,16 +1036,13 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) } list_count++; - /* Remove old client list from channel, if exists */ - if (channel->clients) { - silc_free(channel->clients); - channel->clients = NULL; - channel->clients_count = 0; + /* Remove old client list from channel. */ + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + silc_list_del(channel->clients, chu); + silc_free(chu); } - /* Allocate room for clients in the channel */ - channel->clients = silc_calloc(list_count, sizeof(*channel->clients)); - /* Cache the received name list, client ID's and modes. This cache expires whenever server sends notify message to channel. It means two things; some user has joined or leaved the channel. */ @@ -1085,24 +1083,25 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) id_cache = NULL; } - channel->clients[channel->clients_count].client = client; - channel->clients[channel->clients_count].mode = mode; - channel->clients_count++; + chu = silc_calloc(1, sizeof(*chu)); + chu->client = client; + chu->mode = mode; + silc_list_add(channel->clients, chu); name_list += nick_len + 1; } name_list = cp; for (i = 0; i < list_count; i++) { - int c; + int c = 0; int nick_len = strcspn(name_list, " "); char *nickname = silc_calloc(nick_len + 1, sizeof(*nickname)); memcpy(nickname, name_list, nick_len); - for (c = 0, k = 0; k < channel->clients_count; k++) { - if (channel->clients[k].client && - !strncmp(channel->clients[k].client->nickname, - nickname, strlen(channel->clients[k].client->nickname))) { + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + if (!strncmp(chu->client->nickname, nickname, + strlen(chu->client->nickname))) { char t[8]; if (!c) { @@ -1111,13 +1110,10 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) } memset(t, 0, sizeof(t)); - channel->clients[k].client->nickname = - silc_calloc(strlen(nickname) + 8, sizeof(*channel->clients[k]. - client->nickname)); + chu->client->nickname = silc_calloc(strlen(nickname) + 8, 1); snprintf(t, sizeof(t), "[%d]", c++); - strncat(channel->clients[k].client->nickname, t, strlen(t)); - strncat(channel->clients[k].client->nickname, nickname, - strlen(nickname)); + strncat(chu->client->nickname, t, strlen(t)); + strncat(chu->client->nickname, nickname, strlen(nickname)); } } @@ -1131,13 +1127,14 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) cmd->client->ops->say(cmd->client, conn, "Users on %s", channel->channel_name); - for (k = 0; k < channel->clients_count; k++) { - SilcClientEntry e = channel->clients[k].client; + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + SilcClientEntry e = chu->client; char *m, tmp[80], line[80]; memset(line, 0, sizeof(line)); memset(tmp, 0, sizeof(tmp)); - m = silc_client_chumode_char(channel->clients[k].mode); + m = silc_client_chumode_char(chu->mode); strcat(line, " "); strcat(line, e->nickname); @@ -1175,14 +1172,17 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) } else { name_list = NULL; len1 = 0; - for (k = 0; k < channel->clients_count; k++) { - char *m, *n = channel->clients[k].client->nickname; + k = 0; + + silc_list_start(channel->clients); + while ((chu = silc_list_get(channel->clients)) != SILC_LIST_END) { + char *m, *n = chu->client->nickname; len2 = strlen(n); len1 += len2; name_list = silc_realloc(name_list, sizeof(*name_list) * (len1 + 3)); - m = silc_client_chumode_char(channel->clients[k].mode); + m = silc_client_chumode_char(chu->mode); if (m) { memcpy(name_list + (len1 - len2), m, strlen(m)); len1 += strlen(m); @@ -1191,15 +1191,16 @@ SILC_CLIENT_CMD_REPLY_FUNC(names) memcpy(name_list + (len1 - len2), n, len2); name_list[len1] = 0; - - if (k == channel->clients_count - 1) + + if (k == silc_list_count(channel->clients) - 1) break; memcpy(name_list + len1, " ", 1); len1++; + k++; } - cmd->client->ops->say(cmd->client, conn, - "Users on %s: %s", channel->channel_name, name_list); + cmd->client->ops->say(cmd->client, conn, "Users on %s: %s", + channel->channel_name, name_list); silc_free(name_list); } diff --git a/lib/silcclient/idlist.h b/lib/silcclient/idlist.h index f5c5abf0..4d1c8b1b 100644 --- a/lib/silcclient/idlist.h +++ b/lib/silcclient/idlist.h @@ -37,15 +37,14 @@ typedef struct SilcClientEntryStruct { with the remote client. */ SilcCipher send_key; SilcCipher receive_key; -} SilcClientEntryObject; - -typedef SilcClientEntryObject *SilcClientEntry; +} *SilcClientEntry; /* Client and its mode on a channel */ -typedef struct { +typedef struct SilcChannelUserStruct { SilcClientEntry client; unsigned int mode; -} SilcChannelUsers; + struct SilcChannelUserStruct *next; +} *SilcChannelUser; /* Channel entry context. This is allocate for every channel client has joined to. This includes for example the channel specific keys */ @@ -57,17 +56,15 @@ typedef struct SilcChannelEntryStruct { unsigned int mode; int on_channel; - SilcChannelUsers *clients; - unsigned int clients_count; + /* Joined clients */ + SilcList clients; /* Channel keys */ SilcCipher channel_key; unsigned char *key; unsigned int key_len; unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]; -} SilcChannelEntryObject; - -typedef SilcChannelEntryObject *SilcChannelEntry; +} *SilcChannelEntry; /* Prototypes */