Fixed TOPIC_SET, CMODE_CHANGE notifys and New Channel packet
[silc.git] / apps / silcd / packet_send.c
index 8e947fd70a90b12b56532c24efea6cb24ed5ab22..18c4011d78832fd33513f9b97a0c66556ccaba15 100644 (file)
@@ -85,11 +85,13 @@ void silc_server_packet_send(SilcServer server,
 {
   void *dst_id = NULL;
   SilcIdType dst_id_type = SILC_ID_NONE;
-  SilcIDListData idata = (SilcIDListData)sock->user_data;
+  SilcIDListData idata;
 
   if (!sock)
     return;
 
+  idata = (SilcIDListData)sock->user_data;
+
   /* If disconnecting, ignore the data */
   if (SILC_IS_DISCONNECTING(sock))
     return;
@@ -140,7 +142,7 @@ void silc_server_packet_send_dest(SilcServer server,
 {
   SilcPacketContext packetdata;
   const SilcBufferStruct packet;
-  SilcIDListData idata = (SilcIDListData)sock->user_data;
+  SilcIDListData idata;
   SilcCipher cipher = NULL;
   SilcHmac hmac = NULL;
   SilcUInt32 sequence = 0;
@@ -149,9 +151,11 @@ void silc_server_packet_send_dest(SilcServer server,
   int block_len = 0;
 
   /* If disconnecting, ignore the data */
-  if (SILC_IS_DISCONNECTING(sock))
+  if (!sock || SILC_IS_DISCONNECTING(sock))
     return;
 
+  idata = (SilcIDListData)sock->user_data;
+
   /* If entry is disabled do not sent anything. */
   if (idata && idata->status & SILC_IDLIST_STATUS_DISABLED)
     return;
@@ -243,6 +247,9 @@ void silc_server_packet_send_srcdest(SilcServer server,
 
   SILC_LOG_DEBUG(("Sending %s packet", silc_get_packet_name(type)));
 
+  if (!sock)
+    return;
+
   /* Get data used in the packet sending, keys and stuff */
   idata = (SilcIDListData)sock->user_data;
 
@@ -315,6 +322,9 @@ void silc_server_packet_broadcast(SilcServer server,
   SilcIDListData idata;
   void *id;
 
+  if (!sock)
+    return;
+
   SILC_LOG_DEBUG(("Broadcasting received broadcast packet"));
 
   /* If the packet is originated from our primary route we are
@@ -549,8 +559,6 @@ void silc_server_packet_send_to_channel(SilcServer server,
   /* This doesn't send channel message packets */
   assert(type != SILC_PACKET_CHANNEL_MESSAGE);
   
-  SILC_LOG_DEBUG(("Sending packet to channel"));
-
   /* Set the packet context pointers. */
   packetdata.flags = 0;
   packetdata.type = type;
@@ -574,7 +582,6 @@ void silc_server_packet_send_to_channel(SilcServer server,
     
     if (sock != sender) {
       SILC_LOG_DEBUG(("Sending packet to router for routing"));
-      
       silc_server_packet_send_to_channel_real(server, sock, &packetdata,
                                              idata->send_key, 
                                              idata->hmac_send, 
@@ -584,6 +591,13 @@ void silc_server_packet_send_to_channel(SilcServer server,
     }
   }
 
+  if (!silc_hash_table_count(channel->user_list)) {
+    SILC_LOG_DEBUG(("Channel %s is empty", channel->channel_name));
+    goto out;
+  }
+
+  SILC_LOG_DEBUG(("Sending packet to channel %s", channel->channel_name));
+
   routed = silc_calloc(silc_hash_table_count(channel->user_list), 
                       sizeof(*routed));
 
@@ -655,8 +669,9 @@ void silc_server_packet_send_to_channel(SilcServer server,
                                            data, data_len, FALSE, 
                                            force_send);
   }
-
   silc_hash_table_list_reset(&htl);
+
+ out:
   silc_free(routed);
   silc_free(packetdata.src_id);
   silc_free(packetdata.dst_id);
@@ -730,11 +745,11 @@ void silc_server_packet_relay_to_channel(SilcServer server,
   bool gone = FALSE;
   int k;
 
-  SILC_LOG_DEBUG(("Relaying packet to channel"));
-
   if (!silc_server_client_on_channel(sender_entry, channel, &chl_sender))
     return;
 
+  SILC_LOG_DEBUG(("Relaying packet to channel %s", channel->channel_name));
+
   /* This encrypts the packet, if needed. It will be encrypted if
      it came from the router thus it needs to be encrypted with the
      channel key. If the channel key does not exist, then we know we
@@ -935,7 +950,8 @@ void silc_server_packet_send_local_channel(SilcServer server,
   SilcHashTableList htl;
   SilcSocketConnection sock = NULL;
 
-  SILC_LOG_DEBUG(("Start"));
+  SILC_LOG_DEBUG(("Send packet to local clients on channel %s",
+                 channel->channel_name));
 
   /* Send the message to clients on the channel's client list. */
   silc_hash_table_list(channel->user_list, &htl);
@@ -1055,9 +1071,10 @@ void silc_server_send_notify(SilcServer server,
                          packet->data, packet->len, FALSE);
 
   /* Send to backup routers if this is being broadcasted to primary
-     router. */
-  if (server->router && server->router->connection &&
-      sock == server->router->connection && broadcast)
+     router.  The silc_server_backup_send checks further whether to
+     actually send it or not. */
+  if ((broadcast && sock && sock == SILC_PRIMARY_ROUTE(server)) ||
+      (broadcast && !sock && !SILC_PRIMARY_ROUTE(server)))
     silc_server_backup_send(server, NULL, SILC_PACKET_NOTIFY, 0,
                            packet->data, packet->len, FALSE, TRUE);
 
@@ -1513,10 +1530,12 @@ void silc_server_send_notify_on_channels(SilcServer server,
   bool force_send = FALSE;
   va_list ap;
 
-  SILC_LOG_DEBUG(("Start"));
-
-  if (!silc_hash_table_count(client->channels))
+  if (!silc_hash_table_count(client->channels)) {
+    SILC_LOG_DEBUG(("Client is not joined to any channels"));
     return;
+  }
+
+  SILC_LOG_DEBUG(("Sending notify to joined channels"));
 
   va_start(ap, argc);
   packet = silc_notify_payload_encode(type, argc, ap);