updates.
[silc.git] / apps / silcd / server.c
index 8eb36c88131fcdde59f684909bdbdbe099bb206d..1fca355bab1e7e09d2a66181482cf68e9847fb3e 100644 (file)
@@ -3547,7 +3547,7 @@ void silc_server_announce_get_channel_users(SilcServer server,
 {
   SilcChannelClientEntry chl;
   SilcHashTableList htl;
-  SilcBuffer chidp, clidp;
+  SilcBuffer chidp, clidp, csidp;
   SilcBuffer tmp;
   int len;
   unsigned char mode[4], *fkey = NULL;
@@ -3557,16 +3557,16 @@ void silc_server_announce_get_channel_users(SilcServer server,
   SILC_LOG_DEBUG(("Start"));
 
   chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
+  csidp = silc_id_payload_encode(server->id, SILC_ID_SERVER);
 
   /* CMODE notify */
-  clidp = silc_id_payload_encode(server->id, SILC_ID_SERVER);
   SILC_PUT32_MSB(channel->mode, mode);
   hmac = channel->hmac ? (char *)silc_hmac_get_name(channel->hmac) : NULL;
   if (channel->founder_key)
     fkey = silc_pkcs_public_key_encode(channel->founder_key, &fkey_len);
   tmp = 
     silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_CMODE_CHANGE,
-                                      6, clidp->data, clidp->len,
+                                      6, csidp->data, csidp->len,
                                       mode, sizeof(mode),
                                       NULL, 0,
                                       hmac, hmac ? strlen(hmac) : 0,
@@ -3585,7 +3585,6 @@ void silc_server_announce_get_channel_users(SilcServer server,
   silc_buffer_put(*channel_modes, tmp->data, tmp->len);
   silc_buffer_pull(*channel_modes, len);
   silc_buffer_free(tmp);
-  silc_buffer_free(clidp);
   silc_free(fkey);
 
   /* Now find all users on the channel */
@@ -3615,8 +3614,8 @@ void silc_server_announce_get_channel_users(SilcServer server,
     if (chl->mode & SILC_CHANNEL_UMODE_CHANFO && channel->founder_key)
       fkey = silc_pkcs_public_key_encode(channel->founder_key, &fkey_len);
     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_CUMODE_CHANGE,
-                                            4, clidp->data, clidp->len,
-                                            mode, 4,
+                                            4, csidp->data, csidp->len,
+                                            mode, sizeof(mode),
                                             clidp->data, clidp->len,
                                             fkey, fkey_len);
     len = tmp->len;
@@ -3636,6 +3635,7 @@ void silc_server_announce_get_channel_users(SilcServer server,
   }
   silc_hash_table_list_reset(&htl);
   silc_buffer_free(chidp);
+  silc_buffer_free(csidp);
 }
 
 /* Returns assembled packets for all channels and users on those channels
@@ -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'. */