Integer type name change.
[silc.git] / apps / silcd / packet_send.c
index 0956bdbdaa56a1e20e0f7a446cb3738f3361df4d..a5366eab918d410f404ad3b595fa7224f9e9d390 100644 (file)
@@ -78,7 +78,7 @@ void silc_server_packet_send(SilcServer server,
                             SilcPacketType type, 
                             SilcPacketFlags flags,
                             unsigned char *data, 
-                            uint32 data_len,
+                            SilcUInt32 data_len,
                             bool force_send)
 {
   void *dst_id = NULL;
@@ -133,16 +133,16 @@ void silc_server_packet_send_dest(SilcServer server,
                                  void *dst_id,
                                  SilcIdType dst_id_type,
                                  unsigned char *data, 
-                                 uint32 data_len,
+                                 SilcUInt32 data_len,
                                  bool force_send)
 {
   SilcPacketContext packetdata;
   SilcIDListData idata = (SilcIDListData)sock->user_data;
   SilcCipher cipher = NULL;
   SilcHmac hmac = NULL;
-  uint32 sequence = 0;
+  SilcUInt32 sequence = 0;
   unsigned char *dst_id_data = NULL;
-  uint32 dst_id_len = 0;
+  SilcUInt32 dst_id_len = 0;
   int block_len = 0;
 
   /* If disconnecting, ignore the data */
@@ -232,18 +232,18 @@ void silc_server_packet_send_srcdest(SilcServer server,
                                     void *dst_id,
                                     SilcIdType dst_id_type,
                                     unsigned char *data, 
-                                    uint32 data_len,
+                                    SilcUInt32 data_len,
                                     bool force_send)
 {
   SilcPacketContext packetdata;
   SilcIDListData idata;
   SilcCipher cipher = NULL;
   SilcHmac hmac = NULL;
-  uint32 sequence = 0;
+  SilcUInt32 sequence = 0;
   unsigned char *dst_id_data = NULL;
-  uint32 dst_id_len = 0;
+  SilcUInt32 dst_id_len = 0;
   unsigned char *src_id_data = NULL;
-  uint32 src_id_len = 0;
+  SilcUInt32 src_id_len = 0;
   int block_len = 0;
 
   SILC_LOG_DEBUG(("Sending packet, type %d", type));
@@ -392,18 +392,18 @@ void silc_server_packet_route(SilcServer server,
 
 void silc_server_packet_send_clients(SilcServer server,
                                     SilcClientEntry *clients,
-                                    uint32 clients_count,
+                                    SilcUInt32 clients_count,
                                     SilcPacketType type, 
                                     SilcPacketFlags flags,
                                     bool route,
                                     unsigned char *data, 
-                                    uint32 data_len,
+                                    SilcUInt32 data_len,
                                     bool force_send)
 {
   SilcSocketConnection sock = NULL;
   SilcClientEntry client = NULL;
   SilcServerEntry *routed = NULL;
-  uint32 routed_count = 0;
+  SilcUInt32 routed_count = 0;
   bool gone = FALSE;
   int i, k;
 
@@ -469,13 +469,17 @@ silc_server_packet_send_to_channel_real(SilcServer server,
                                        SilcPacketContext *packet,
                                        SilcCipher cipher,
                                        SilcHmac hmac,
-                                       uint32 sequence,
+                                       SilcUInt32 sequence,
                                        unsigned char *data,
-                                       uint32 data_len,
+                                       SilcUInt32 data_len,
                                        bool channel_message,
                                        bool force_send)
 {
   int block_len;
+
+  if (!sock)
+    return;
+
   packet->truelen = data_len + SILC_PACKET_HEADER_LEN + 
     packet->src_id_len + packet->dst_id_len;
 
@@ -525,7 +529,8 @@ silc_server_packet_send_to_channel_real(SilcServer server,
    If `route' is FALSE then the packet is sent only locally and will not
    be routed anywhere (for router locally means cell wide). If `sender'
    is provided then the packet is not sent to that connection since it
-   originally came from it. */
+   originally came from it. If `send_to_clients' is FALSE then the
+   packet is not sent clients, only servers. */
 
 void silc_server_packet_send_to_channel(SilcServer server,
                                        SilcSocketConnection sender,
@@ -533,7 +538,7 @@ void silc_server_packet_send_to_channel(SilcServer server,
                                        SilcPacketType type,
                                        bool route,
                                        unsigned char *data,
-                                       uint32 data_len,
+                                       SilcUInt32 data_len,
                                        bool force_send)
 {
   SilcSocketConnection sock = NULL;
@@ -543,7 +548,7 @@ void silc_server_packet_send_to_channel(SilcServer server,
   SilcChannelClientEntry chl;
   SilcHashTableList htl;
   SilcIDListData idata;
-  uint32 routed_count = 0;
+  SilcUInt32 routed_count = 0;
   bool gone = FALSE;
   int k;
 
@@ -574,7 +579,7 @@ void silc_server_packet_send_to_channel(SilcServer server,
     idata = (SilcIDListData)router;
     
     if (sock != sender) {
-      SILC_LOG_DEBUG(("Sending channel message to router for routing"));
+      SILC_LOG_DEBUG(("Sending packet to router for routing"));
       
       silc_server_packet_send_to_channel_real(server, sock, &packetdata,
                                              idata->send_key, 
@@ -656,6 +661,7 @@ void silc_server_packet_send_to_channel(SilcServer server,
                                            force_send);
   }
 
+  silc_hash_table_list_reset(&htl);
   silc_free(routed);
   silc_free(packetdata.src_id);
   silc_free(packetdata.dst_id);
@@ -682,8 +688,8 @@ silc_server_packet_relay_to_channel_encrypt(SilcServer server,
       !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY) &&
       channel->channel_key) {
     SilcBuffer chp;
-    uint32 iv_len, i;
-    uint16 dlen, flags;
+    SilcUInt32 iv_len, i;
+    SilcUInt16 dlen, flags;
 
     iv_len = silc_cipher_get_block_len(channel->channel_key);
     if (channel->iv[0] == '\0')
@@ -728,7 +734,7 @@ void silc_server_packet_relay_to_channel(SilcServer server,
                                         SilcIdType sender_type,
                                         void *sender_entry,
                                         unsigned char *data,
-                                        uint32 data_len,
+                                        SilcUInt32 data_len,
                                         bool force_send)
 {
   bool found = FALSE;
@@ -737,7 +743,7 @@ void silc_server_packet_relay_to_channel(SilcServer server,
   SilcClientEntry client = NULL;
   SilcServerEntry *routed = NULL;
   SilcChannelClientEntry chl;
-  uint32 routed_count = 0;
+  SilcUInt32 routed_count = 0;
   SilcIDListData idata;
   SilcHashTableList htl;
   bool gone = FALSE;
@@ -869,8 +875,7 @@ void silc_server_packet_relay_to_channel(SilcServer server,
        /* If private key mode is not set then decrypt the packet
           and re-encrypt it */
        if (!(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
-         unsigned char *tmp = silc_calloc(data_len, sizeof(*data));
-         memcpy(tmp, data, data_len);
+         unsigned char *tmp = silc_memdup(data, data_len);
 
          /* Decrypt the channel message (we don't check the MAC) */
          if (channel->channel_key &&
@@ -938,6 +943,7 @@ void silc_server_packet_relay_to_channel(SilcServer server,
                                            force_send);
   }
 
+  silc_hash_table_list_reset(&htl);
   silc_free(routed);
   silc_free(packetdata.src_id);
   silc_free(packetdata.dst_id);
@@ -955,7 +961,7 @@ void silc_server_packet_send_local_channel(SilcServer server,
                                           SilcPacketType type,
                                           SilcPacketFlags flags,
                                           unsigned char *data,
-                                          uint32 data_len,
+                                          SilcUInt32 data_len,
                                           bool force_send)
 {
   SilcChannelClientEntry chl;
@@ -976,6 +982,7 @@ void silc_server_packet_send_local_channel(SilcServer server,
                                   force_send);
     }
   }
+  silc_hash_table_list_reset(&htl);
 }
 
 /* Routine used to send (relay, route) private messages to some destination.
@@ -988,7 +995,7 @@ void silc_server_send_private_message(SilcServer server,
                                      SilcSocketConnection dst_sock,
                                      SilcCipher cipher,
                                      SilcHmac hmac,
-                                     uint32 sequence,
+                                     SilcUInt32 sequence,
                                      SilcPacketContext *packet)
 {
   SilcBuffer buffer = packet->buffer;
@@ -1028,13 +1035,14 @@ void silc_server_send_private_message(SilcServer server,
 void silc_server_send_motd(SilcServer server,
                           SilcSocketConnection sock)
 {
-  char *motd;
-  uint32 motd_len;
+  char *motd, *motd_file = NULL;
+  SilcUInt32 motd_len;
 
-  if (server->config && server->config->motd && 
-      server->config->motd->motd_file) {
+  if (server->config)
+    motd_file = server->config->server_info->motd_file;
 
-    motd = silc_file_readfile(server->config->motd->motd_file, &motd_len);
+  if (motd_file) {
+    motd = silc_file_readfile(motd_file, &motd_len);
     if (!motd)
       return;
 
@@ -1072,7 +1080,7 @@ void silc_server_send_notify(SilcServer server,
                             SilcSocketConnection sock,
                             bool broadcast,
                             SilcNotifyType type,
-                            uint32 argc, ...)
+                            SilcUInt32 argc, ...)
 {
   va_list ap;
   SilcBuffer packet;
@@ -1102,7 +1110,7 @@ void silc_server_send_notify_args(SilcServer server,
                                  SilcSocketConnection sock,
                                  bool broadcast,
                                  SilcNotifyType type,
-                                 uint32 argc,
+                                 SilcUInt32 argc,
                                  SilcBuffer args)
 {
   SilcBuffer packet;
@@ -1202,9 +1210,10 @@ void silc_server_send_notify_cmode(SilcServer server,
                                   SilcSocketConnection sock,
                                   bool broadcast,
                                   SilcChannelEntry channel,
-                                  uint32 mode_mask,
+                                  SilcUInt32 mode_mask,
                                   void *id, SilcIdType id_type,
-                                  char *cipher, char *hmac)
+                                  char *cipher, char *hmac,
+                                  char *passphrase)
 {
   SilcBuffer idp;
   unsigned char mode[4];
@@ -1214,22 +1223,24 @@ void silc_server_send_notify_cmode(SilcServer server,
 
   silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id,
                               SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_CMODE_CHANGE,
-                              4, idp->data, idp->len,
+                              5, idp->data, idp->len,
                               mode, 4,
                               cipher, cipher ? strlen(cipher) : 0,
-                              hmac, hmac ? strlen(hmac) : 0);
+                              hmac, hmac ? strlen(hmac) : 0,
+                              passphrase, passphrase ? 
+                              strlen(passphrase) : 0);
   silc_buffer_free(idp);
 }
 
 /* Sends CUMODE_CHANGE notify type. This tells that `client_id' changed the
-   `target' client's mode on `channel'. The Notify packet is always
+   `target' client's mode on `channel'. The notify packet is always
    destined to the channel. */
 
 void silc_server_send_notify_cumode(SilcServer server,
                                    SilcSocketConnection sock,
                                    bool broadcast,
                                    SilcChannelEntry channel,
-                                   uint32 mode_mask,
+                                   SilcUInt32 mode_mask,
                                    void *id, SilcIdType id_type,
                                    SilcClientID *target)
 {
@@ -1259,7 +1270,7 @@ void silc_server_send_notify_signoff(SilcServer server,
                                     SilcSocketConnection sock,
                                     bool broadcast,
                                     SilcClientID *client_id,
-                                    char *message)
+                                    const char *message)
 {
   SilcBuffer idp;
 
@@ -1271,7 +1282,7 @@ void silc_server_send_notify_signoff(SilcServer server,
   silc_buffer_free(idp);
 }
 
-/* Sends TOPIC_SET notify type. This tells that `client_id' changed
+/* Sends TOPIC_SET notify type. This tells that `id' changed
    the `channel's topic to `topic'. The Notify packet is always destined
    to the channel. This function is used to send the topic set notifies
    between routers. */
@@ -1280,17 +1291,18 @@ void silc_server_send_notify_topic_set(SilcServer server,
                                       SilcSocketConnection sock,
                                       bool broadcast,
                                       SilcChannelEntry channel,
-                                      SilcClientID *client_id,
+                                      void *id, SilcIdType id_type,
                                       char *topic)
 {
   SilcBuffer idp;
 
-  idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
-  silc_server_send_notify(server, sock, broadcast,
-                         SILC_NOTIFY_TYPE_TOPIC_SET,
-                         topic ? 2 : 1, 
-                         idp->data, idp->len, 
-                         topic, topic ? strlen(topic) : 0);
+  idp = silc_id_payload_encode(id, id_type);
+  silc_server_send_notify_dest(server, sock, broadcast,
+                              (void *)channel->id, SILC_ID_CHANNEL,
+                              SILC_NOTIFY_TYPE_TOPIC_SET,
+                              topic ? 2 : 1, 
+                              idp->data, idp->len, 
+                              topic, topic ? strlen(topic) : 0);
   silc_buffer_free(idp);
 }
 
@@ -1304,16 +1316,21 @@ void silc_server_send_notify_kicked(SilcServer server,
                                    bool broadcast,
                                    SilcChannelEntry channel,
                                    SilcClientID *client_id,
+                                   SilcClientID *kicker,
                                    char *comment)
 {
-  SilcBuffer idp;
+  SilcBuffer idp1;
+  SilcBuffer idp2;
 
-  idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
+  idp1 = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
+  idp2 = silc_id_payload_encode((void *)kicker, SILC_ID_CLIENT);
   silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id,
-                              SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_KICKED,
-                              comment ? 2 : 1, idp->data, idp->len,
-                              comment, comment ? strlen(comment) : 0);
-  silc_buffer_free(idp);
+                              SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_KICKED, 3,
+                              idp1->data, idp1->len,
+                              comment, comment ? strlen(comment) : 0,
+                              idp2->data, idp2->len);
+  silc_buffer_free(idp1);
+  silc_buffer_free(idp2);
 }
 
 /* Send KILLED notify type. This tells that the `client_id' client was
@@ -1344,7 +1361,7 @@ void silc_server_send_notify_umode(SilcServer server,
                                   SilcSocketConnection sock,
                                   bool broadcast,
                                   SilcClientID *client_id,
-                                  uint32 mode_mask)
+                                  SilcUInt32 mode_mask)
 {
   SilcBuffer idp;
   unsigned char mode[4];
@@ -1415,7 +1432,7 @@ void silc_server_send_notify_dest(SilcServer server,
                                  void *dest_id,
                                  SilcIdType dest_id_type,
                                  SilcNotifyType type,
-                                 uint32 argc, ...)
+                                 SilcUInt32 argc, ...)
 {
   va_list ap;
   SilcBuffer packet;
@@ -1441,9 +1458,9 @@ void silc_server_send_notify_dest(SilcServer server,
 void silc_server_send_notify_to_channel(SilcServer server,
                                        SilcSocketConnection sender,
                                        SilcChannelEntry channel,
-                                       unsigned char route_notify,
+                                       bool route_notify,
                                        SilcNotifyType type,
-                                       uint32 argc, ...)
+                                       SilcUInt32 argc, ...)
 {
   va_list ap;
   SilcBuffer packet;
@@ -1469,23 +1486,23 @@ void silc_server_send_notify_on_channels(SilcServer server,
                                         SilcClientEntry sender,
                                         SilcClientEntry client,
                                         SilcNotifyType type,
-                                        uint32 argc, ...)
+                                        SilcUInt32 argc, ...)
 {
   int k;
   SilcSocketConnection sock = NULL;
   SilcPacketContext packetdata;
   SilcClientEntry c;
   SilcClientEntry *sent_clients = NULL;
-  uint32 sent_clients_count = 0;
+  SilcUInt32 sent_clients_count = 0;
   SilcServerEntry *routed = NULL;
-  uint32 routed_count = 0;
+  SilcUInt32 routed_count = 0;
   SilcHashTableList htl, htl2;
   SilcChannelEntry channel;
   SilcChannelClientEntry chl, chl2;
   SilcIDListData idata;
   SilcBuffer packet;
   unsigned char *data;
-  uint32 data_len;
+  SilcUInt32 data_len;
   bool force_send = FALSE;
   va_list ap;
 
@@ -1599,11 +1616,14 @@ void silc_server_send_notify_on_channels(SilcServer server,
        sent_clients[sent_clients_count++] = c;
       }
     }
+    silc_hash_table_list_reset(&htl2);
   }
 
+  silc_hash_table_list_reset(&htl);
   silc_free(routed);
   silc_free(sent_clients);
   silc_free(packetdata.src_id);
+  silc_buffer_free(packet);
   va_end(ap);
 }
 
@@ -1617,7 +1637,7 @@ void silc_server_send_new_id(SilcServer server,
                             SilcSocketConnection sock,
                             bool broadcast,
                             void *id, SilcIdType id_type, 
-                            uint32 id_len)
+                            SilcUInt32 id_len)
 {
   SilcBuffer idp;
 
@@ -1639,21 +1659,20 @@ void silc_server_send_new_id(SilcServer server,
 }
 
 /* Send New Channel Payload to notify about newly created channel in the
-   SILC network. Normal server nevers sends this packet. Router uses this
-   to notify other routers in the network about new channel. This packet
-   is broadcasted. */
+   SILC network. Router uses this to notify other routers in the network 
+   about new channel. This packet is broadcasted by router. */
 
 void silc_server_send_new_channel(SilcServer server,
                                  SilcSocketConnection sock,
                                  bool broadcast,
                                  char *channel_name,
                                  void *channel_id, 
-                                 uint32 channel_id_len,
-                                 uint32 mode)
+                                 SilcUInt32 channel_id_len,
+                                 SilcUInt32 mode)
 {
   SilcBuffer packet;
   unsigned char *cid;
-  uint32 name_len = strlen(channel_name);
+  SilcUInt32 name_len = strlen(channel_name);
 
   SILC_LOG_DEBUG(("Start"));
 
@@ -1671,7 +1690,8 @@ void silc_server_send_new_channel(SilcServer server,
 
   /* Send to backup routers if this is being broadcasted to primary
      router. */
-  if (server->router && server->router->connection &&
+  if (server->server_type == SILC_ROUTER &&
+      server->router && server->router->connection &&
       sock == server->router->connection && broadcast)
     silc_server_backup_send(server, NULL, SILC_PACKET_NEW_CHANNEL, 0,
                            packet->data, packet->len, FALSE, TRUE);
@@ -1696,9 +1716,9 @@ void silc_server_send_channel_key(SilcServer server,
 {
   SilcBuffer packet;
   unsigned char *chid;
-  uint32 tmp_len;
+  SilcUInt32 tmp_len;
  
-  SILC_LOG_DEBUG(("Start"));
+  SILC_LOG_DEBUG(("Sending key to channel %s", channel->channel_name));
  
   chid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
   if (!chid)
@@ -1713,7 +1733,8 @@ void silc_server_send_channel_key(SilcServer server,
                                            channel->key_len / 8, channel->key);
   silc_server_packet_send_to_channel(server, sender, channel, 
                                     SILC_PACKET_CHANNEL_KEY,
-                                     route, packet->data, packet->len, FALSE);
+                                     route, packet->data, packet->len, 
+                                    FALSE);
   silc_buffer_free(packet);
   silc_free(chid);
 }
@@ -1724,8 +1745,8 @@ void silc_server_send_channel_key(SilcServer server,
 void silc_server_send_command(SilcServer server, 
                              SilcSocketConnection sock,
                              SilcCommand command, 
-                             uint16 ident,
-                             uint32 argc, ...)
+                             SilcUInt16 ident,
+                             SilcUInt32 argc, ...)
 {
   SilcBuffer packet;
   va_list ap;
@@ -1746,8 +1767,8 @@ void silc_server_send_command_reply(SilcServer server,
                                    SilcSocketConnection sock,
                                    SilcCommand command, 
                                    SilcCommandStatus status,
-                                   uint16 ident,
-                                   uint32 argc, ...)
+                                   SilcUInt16 ident,
+                                   SilcUInt32 argc, ...)
 {
   SilcBuffer packet;
   va_list ap;
@@ -1762,6 +1783,32 @@ void silc_server_send_command_reply(SilcServer server,
   va_end(ap);
 }
 
+/* Generic function to send any command reply. The arguments must be sent
+   already encoded into correct form in correct order. */
+
+void silc_server_send_dest_command_reply(SilcServer server, 
+                                        SilcSocketConnection sock,
+                                        void *dst_id,
+                                        SilcIdType dst_id_type,
+                                        SilcCommand command, 
+                                        SilcCommandStatus status,
+                                        SilcUInt16 ident,
+                                        SilcUInt32 argc, ...)
+{
+  SilcBuffer packet;
+  va_list ap;
+
+  va_start(ap, argc);
+
+  packet = silc_command_reply_payload_encode_vap(command, status, ident, 
+                                                argc, ap);
+  silc_server_packet_send_dest(server, sock, SILC_PACKET_COMMAND_REPLY, 0,
+                              dst_id, dst_id_type, packet->data, 
+                              packet->len, TRUE);
+  silc_buffer_free(packet);
+  va_end(ap);
+}
+
 /* Send the heartbeat packet. */
 
 void silc_server_send_heartbeat(SilcServer server,
@@ -1778,7 +1825,7 @@ void silc_server_relay_packet(SilcServer server,
                              SilcSocketConnection dst_sock,
                              SilcCipher cipher,
                              SilcHmac hmac,
-                             uint32 sequence,
+                             SilcUInt32 sequence,
                              SilcPacketContext *packet,
                              bool force_send)
 {
@@ -1803,7 +1850,7 @@ void silc_server_relay_packet(SilcServer server,
 
 void silc_server_send_connection_auth_request(SilcServer server,
                                              SilcSocketConnection sock,
-                                             uint16 conn_type,
+                                             SilcUInt16 conn_type,
                                              SilcAuthMethod auth_meth)
 {
   SilcBuffer packet;