From: Pekka Riikonen Date: Sun, 19 May 2002 21:07:07 +0000 (+0000) Subject: updates. X-Git-Tag: silc.server.0.9.1~1 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=2a7c9ce661a9d263c6486827533ac7dee3d65278 updates. --- diff --git a/CHANGES b/CHANGES index 8cb8887d..2f58a848 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,9 @@ Sun May 19 18:59:00 EEST 2002 Pekka Riikonen * Fixed CUMODE_CHANGE notify handling in server. Affected file silcd/packet_receive.c. + * Fixed USERS command to support empty channels. Affected + file silcd/command.c. + Sat May 18 11:35:19 EEST 2002 Pekka Riikonen * Allow multiple identical pending commands to be registered diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 4c8b900b..be933055 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -187,6 +187,8 @@ void silc_server_command_process(SilcServer server, SilcServerCommand *cmd; SilcCommand command; + SILC_LOG_DEBUG(("Start")); + /* Allocate command context. This must be free'd by the command routine receiving it. */ ctx = silc_server_command_alloc(); @@ -5472,7 +5474,8 @@ SILC_SERVER_CMD_FUNC(users) channel = silc_idlist_find_channel_by_name(server->local_list, channel_name, NULL); - if (!channel || channel->disabled || !channel->users_resolved) { + if (!channel || (!server->standalone && (channel->disabled || + !channel->users_resolved))) { if (server->server_type != SILC_ROUTER && !server->standalone && !cmd->pending) { SilcBuffer tmpbuf; @@ -5525,8 +5528,12 @@ SILC_SERVER_CMD_FUNC(users) } /* Get the users list */ - silc_server_get_users_on_channel(server, channel, &client_id_list, - &client_mode_list, &list_count); + if (!silc_server_get_users_on_channel(server, channel, &client_id_list, + &client_mode_list, &list_count)) { + list_count = 0; + client_id_list = NULL; + client_mode_list = NULL; + } /* List count */ SILC_PUT32_MSB(list_count, lc); @@ -5537,17 +5544,23 @@ SILC_SERVER_CMD_FUNC(users) SILC_STATUS_OK, 0, ident, 4, 2, idp->data, idp->len, 3, lc, 4, - 4, client_id_list->data, - client_id_list->len, - 5, client_mode_list->data, - client_mode_list->len); + 4, client_id_list ? + client_id_list->data : NULL, + client_id_list ? + client_id_list->len : 0, + 5, client_mode_list ? + client_mode_list->data : NULL, + client_mode_list ? + client_mode_list->len : 0); silc_server_packet_send(server, cmd->sock, SILC_PACKET_COMMAND_REPLY, 0, packet->data, packet->len, FALSE); silc_buffer_free(idp); silc_buffer_free(packet); - silc_buffer_free(client_id_list); - silc_buffer_free(client_mode_list); + if (client_id_list) + silc_buffer_free(client_id_list); + if (client_mode_list) + silc_buffer_free(client_mode_list); silc_free(id); out: diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 32b81b54..1fca355b 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -3891,7 +3891,7 @@ SILC_TASK_CALLBACK(silc_server_failure_callback) /* Assembles user list and users mode list from the `channel'. */ -void silc_server_get_users_on_channel(SilcServer server, +bool silc_server_get_users_on_channel(SilcServer server, SilcChannelEntry channel, SilcBuffer *user_list, SilcBuffer *mode_list, @@ -3904,6 +3904,9 @@ void silc_server_get_users_on_channel(SilcServer server, SilcBuffer idp; SilcUInt32 list_count = 0, len = 0; + if (!silc_hash_table_count(channel->user_list)) + return FALSE; + silc_hash_table_list(channel->user_list, &htl); while (silc_hash_table_get(&htl, NULL, (void *)&chl)) len += (silc_id_get_len(chl->client->id, SILC_ID_CLIENT) + 4); @@ -3938,6 +3941,7 @@ void silc_server_get_users_on_channel(SilcServer server, *user_list = client_id_list; *mode_list = client_mode_list; *user_count = list_count; + return TRUE; } /* Saves users and their modes to the `channel'. */ diff --git a/apps/silcd/server.h b/apps/silcd/server.h index d4341f4d..d318233e 100644 --- a/apps/silcd/server.h +++ b/apps/silcd/server.h @@ -198,7 +198,7 @@ void silc_server_announce_clients(SilcServer server, void silc_server_announce_channels(SilcServer server, unsigned long creation_time, SilcSocketConnection remote); -void silc_server_get_users_on_channel(SilcServer server, +bool silc_server_get_users_on_channel(SilcServer server, SilcChannelEntry channel, SilcBuffer *user_list, SilcBuffer *mode_list,