X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fpacket_send.c;h=a5366eab918d410f404ad3b595fa7224f9e9d390;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=f1b0c9d2ae10eecc013bcc8e02db54dbf326ee2e;hpb=175fba2982fdab677e93f1e424fe2405eae9eddb;p=silc.git diff --git a/apps/silcd/packet_send.c b/apps/silcd/packet_send.c index f1b0c9d2..a5366eab 100644 --- a/apps/silcd/packet_send.c +++ b/apps/silcd/packet_send.c @@ -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; @@ -534,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; @@ -544,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; @@ -657,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); @@ -683,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') @@ -729,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; @@ -738,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; @@ -870,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 && @@ -939,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); @@ -956,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; @@ -977,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. @@ -989,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; @@ -1029,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; @@ -1073,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; @@ -1103,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; @@ -1203,7 +1210,7 @@ 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 *passphrase) @@ -1233,7 +1240,7 @@ 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) { @@ -1309,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 @@ -1349,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]; @@ -1420,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; @@ -1448,7 +1460,7 @@ void silc_server_send_notify_to_channel(SilcServer server, SilcChannelEntry channel, bool route_notify, SilcNotifyType type, - uint32 argc, ...) + SilcUInt32 argc, ...) { va_list ap; SilcBuffer packet; @@ -1474,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; @@ -1604,8 +1616,10 @@ 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); @@ -1623,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; @@ -1645,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")); @@ -1677,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); @@ -1702,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) @@ -1731,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; @@ -1753,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; @@ -1778,8 +1792,8 @@ void silc_server_send_dest_command_reply(SilcServer server, SilcIdType dst_id_type, SilcCommand command, SilcCommandStatus status, - uint16 ident, - uint32 argc, ...) + SilcUInt16 ident, + SilcUInt32 argc, ...) { SilcBuffer packet; va_list ap; @@ -1811,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) { @@ -1836,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;