Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2007 Pekka Riikonen
+ Copyright (C) 1997 - 2009 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
routed = silc_calloc(silc_hash_table_count(channel->user_list),
sizeof(*routed));
+ if (!routed)
+ goto out;
/* Send the message to clients on the channel's client list. */
silc_hash_table_list(channel->user_list, &htl);
}
}
+ if (!silc_hash_table_count(channel->user_list)) {
+ SILC_LOG_DEBUG(("Channel %s is empty", channel->channel_name));
+ return;
+ }
+
routed = silc_calloc(silc_hash_table_count(channel->user_list),
sizeof(*routed));
+ if (!routed)
+ return;
/* Assure we won't route the message back to the sender's way. */
if (sender_entry->router)
va_start(ap, argc);
packet = silc_notify_payload_encode(type, argc, ap);
+ if (!packet) {
+ va_end(ap);
+ return;
+ }
silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY,
broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
packet->data, silc_buffer_len(packet));
SilcBuffer packet;
packet = silc_notify_payload_encode_args(type, argc, args);
- silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY,
- broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
- packet->data, silc_buffer_len(packet));
+ if (packet)
+ silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY,
+ broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
+ packet->data, silc_buffer_len(packet));
silc_buffer_free(packet);
}
idp1 = silc_id_payload_encode((void *)old_id, SILC_ID_CHANNEL);
idp2 = silc_id_payload_encode((void *)new_id, SILC_ID_CHANNEL);
- silc_server_send_notify(server, sock, broadcast,
- SILC_NOTIFY_TYPE_CHANNEL_CHANGE,
- 2, idp1->data, silc_buffer_len(idp1),
- idp2->data, silc_buffer_len(idp2));
+ if (idp1 && idp2)
+ silc_server_send_notify(server, sock, broadcast,
+ SILC_NOTIFY_TYPE_CHANNEL_CHANGE,
+ 2, idp1->data, silc_buffer_len(idp1),
+ idp2->data, silc_buffer_len(idp2));
silc_buffer_free(idp1);
silc_buffer_free(idp2);
}
idp1 = silc_id_payload_encode((void *)old_id, SILC_ID_CLIENT);
idp2 = silc_id_payload_encode((void *)new_id, SILC_ID_CLIENT);
- silc_server_send_notify(server, sock, broadcast,
- SILC_NOTIFY_TYPE_NICK_CHANGE,
- 3, idp1->data, silc_buffer_len(idp1),
- idp2->data, silc_buffer_len(idp2),
- nickname, nickname ? strlen(nickname) : 0);
+ if (idp1 && idp2)
+ silc_server_send_notify(server, sock, broadcast,
+ SILC_NOTIFY_TYPE_NICK_CHANGE,
+ 3, idp1->data, silc_buffer_len(idp1),
+ idp2->data, silc_buffer_len(idp2),
+ nickname, nickname ? strlen(nickname) : 0);
silc_buffer_free(idp1);
silc_buffer_free(idp2);
}
idp1 = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
idp2 = silc_id_payload_encode((void *)channel->id, SILC_ID_CHANNEL);
- silc_server_send_notify(server, sock, broadcast, SILC_NOTIFY_TYPE_JOIN,
- 2, idp1->data, silc_buffer_len(idp1),
- idp2->data, silc_buffer_len(idp2));
+
+ if (idp1 && idp2)
+ silc_server_send_notify(server, sock, broadcast, SILC_NOTIFY_TYPE_JOIN,
+ 2, idp1->data, silc_buffer_len(idp1),
+ idp2->data, silc_buffer_len(idp2));
silc_buffer_free(idp1);
silc_buffer_free(idp2);
}
SilcBuffer idp;
idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
- silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id,
- SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_LEAVE,
- 1, idp->data, silc_buffer_len(idp));
+ if (idp)
+ silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id,
+ SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_LEAVE,
+ 1, idp->data, silc_buffer_len(idp));
silc_buffer_free(idp);
}
unsigned char mode[4], ulimit[4];
idp = silc_id_payload_encode((void *)id, id_type);
+ if (!idp)
+ return;
SILC_PUT32_MSB(mode_mask, mode);
if (founder_key)
fkey = silc_public_key_payload_encode(founder_key);
idp1 = silc_id_payload_encode((void *)id, id_type);
idp2 = silc_id_payload_encode((void *)target, SILC_ID_CLIENT);
+ if (!idp1 || !idp2)
+ return;
SILC_PUT32_MSB(mode_mask, mode);
if (founder_key)
fkey = silc_public_key_payload_encode(founder_key);
SilcBuffer idp;
idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
- silc_server_send_notify(server, sock, broadcast,
- SILC_NOTIFY_TYPE_SIGNOFF,
- message ? 2 : 1, idp->data, silc_buffer_len(idp),
- message, message ? strlen(message): 0);
+ if (idp)
+ silc_server_send_notify(server, sock, broadcast,
+ SILC_NOTIFY_TYPE_SIGNOFF,
+ message ? 2 : 1, idp->data, silc_buffer_len(idp),
+ message, message ? strlen(message): 0);
silc_buffer_free(idp);
}
SilcBuffer idp;
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, silc_buffer_len(idp),
- topic, topic ? strlen(topic) : 0);
+ if (idp)
+ silc_server_send_notify_dest(server, sock, broadcast,
+ (void *)channel->id, SILC_ID_CHANNEL,
+ SILC_NOTIFY_TYPE_TOPIC_SET,
+ topic ? 2 : 1,
+ idp->data, silc_buffer_len(idp),
+ topic, topic ? strlen(topic) : 0);
silc_buffer_free(idp);
}
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, 3,
- idp1->data, silc_buffer_len(idp1),
- comment, comment ? strlen(comment) : 0,
- idp2->data, silc_buffer_len(idp2));
+
+ if (idp1 && idp2)
+ silc_server_send_notify_dest(server, sock, broadcast, (void *)channel->id,
+ SILC_ID_CHANNEL, SILC_NOTIFY_TYPE_KICKED, 3,
+ idp1->data, silc_buffer_len(idp1),
+ comment, comment ? strlen(comment) : 0,
+ idp2->data, silc_buffer_len(idp2));
silc_buffer_free(idp1);
silc_buffer_free(idp2);
}
idp1 = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
idp2 = silc_id_payload_encode(killer, killer_type);
- silc_server_send_notify_dest(server, sock, broadcast, (void *)client_id,
- SILC_ID_CLIENT, SILC_NOTIFY_TYPE_KILLED,
- 3, idp1->data, silc_buffer_len(idp1),
- comment, comment ? strlen(comment) : 0,
- idp2->data, silc_buffer_len(idp2));
+
+ if (idp1 && idp2)
+ silc_server_send_notify_dest(server, sock, broadcast, (void *)client_id,
+ SILC_ID_CLIENT, SILC_NOTIFY_TYPE_KILLED,
+ 3, idp1->data, silc_buffer_len(idp1),
+ comment, comment ? strlen(comment) : 0,
+ idp2->data, silc_buffer_len(idp2));
silc_buffer_free(idp1);
silc_buffer_free(idp2);
}
idp = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
SILC_PUT32_MSB(mode_mask, mode);
- silc_server_send_notify(server, sock, broadcast,
- SILC_NOTIFY_TYPE_UMODE_CHANGE, 2,
- idp->data, silc_buffer_len(idp),
- mode, 4);
+ if (idp)
+ silc_server_send_notify(server, sock, broadcast,
+ SILC_NOTIFY_TYPE_UMODE_CHANGE, 2,
+ idp->data, silc_buffer_len(idp),
+ mode, 4);
silc_buffer_free(idp);
}
SilcBuffer idp;
idp = silc_id_payload_encode((void *)channel->id, SILC_ID_CHANNEL);
- silc_server_send_notify(server, sock, broadcast,
- SILC_NOTIFY_TYPE_BAN, 3,
- idp->data, silc_buffer_len(idp),
- action ? action : NULL, action ? 1 : 0,
- list ? list->data : NULL,
- list ? silc_buffer_len(list) : 0);
+
+ if (idp)
+ silc_server_send_notify(server, sock, broadcast,
+ SILC_NOTIFY_TYPE_BAN, 3,
+ idp->data, silc_buffer_len(idp),
+ action ? action : NULL, action ? 1 : 0,
+ list ? list->data : NULL,
+ list ? silc_buffer_len(list) : 0);
silc_buffer_free(idp);
}
idp = silc_id_payload_encode((void *)channel->id, SILC_ID_CHANNEL);
idp2 = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
- silc_server_send_notify(server, sock, broadcast,
- SILC_NOTIFY_TYPE_INVITE, 5,
- idp->data, silc_buffer_len(idp),
- channel->channel_name, strlen(channel->channel_name),
- idp2->data, silc_buffer_len(idp2),
- action ? action : NULL, action ? 1 : 0,
- list ? list->data : NULL,
- list ? silc_buffer_len(list) : 0);
+
+ if (idp && idp2)
+ silc_server_send_notify(server, sock, broadcast,
+ SILC_NOTIFY_TYPE_INVITE, 5,
+ idp->data, silc_buffer_len(idp),
+ channel->channel_name,
+ strlen(channel->channel_name),
+ idp2->data, silc_buffer_len(idp2),
+ action ? action : NULL, action ? 1 : 0,
+ list ? list->data : NULL,
+ list ? silc_buffer_len(list) : 0);
silc_buffer_free(idp);
silc_buffer_free(idp2);
}
unsigned char mode[4], n[2];
idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
+ if (!idp)
+ return;
SILC_PUT16_MSB(type, n);
SILC_PUT32_MSB(client->mode, mode);
if (public_key)
va_start(ap, argc);
packet = silc_notify_payload_encode(type, argc, ap);
+ if (!packet) {
+ va_end(ap);
+ return;
+ }
silc_server_packet_send_dest(server, sock, SILC_PACKET_NOTIFY,
broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
dest_id, dest_id_type,
va_start(ap, argc);
packet = silc_notify_payload_encode(type, argc, ap);
- silc_server_packet_send_to_channel(server, sender, channel,
- SILC_PACKET_NOTIFY, route_notify,
- send_to_clients,
- packet->data, silc_buffer_len(packet));
+ if (packet)
+ silc_server_packet_send_to_channel(server, sender, channel,
+ SILC_PACKET_NOTIFY, route_notify,
+ send_to_clients,
+ packet->data, silc_buffer_len(packet));
silc_buffer_free(packet);
va_end(ap);
}
va_start(ap, argc);
packet = silc_notify_payload_encode(type, argc, ap);
+ if (!packet) {
+ va_end(ap);
+ return;
+ }
data = packet->data;
data_len = silc_buffer_len(packet);
SILC_LOG_DEBUG(("Sending new ID"));
idp = silc_id_payload_encode(id, id_type);
- silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID,
- broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
- idp->data, silc_buffer_len(idp));
+ if (idp)
+ silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID,
+ broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
+ idp->data, silc_buffer_len(idp));
silc_buffer_free(idp);
}
/* Encode the channel payload */
packet = silc_channel_payload_encode(channel_name, name_len,
cid, channel_id_len, mode);
-
- silc_server_packet_send(server, sock, SILC_PACKET_NEW_CHANNEL,
- broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
- packet->data, silc_buffer_len(packet));
+ if (packet)
+ silc_server_packet_send(server, sock, SILC_PACKET_NEW_CHANNEL,
+ broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
+ packet->data, silc_buffer_len(packet));
silc_buffer_free(packet);
}
va_start(ap, argc);
packet = silc_command_payload_encode_vap(command, ident, argc, ap);
- silc_server_packet_send(server, sock, SILC_PACKET_COMMAND, 0,
- packet->data, silc_buffer_len(packet));
+ if (packet)
+ silc_server_packet_send(server, sock, SILC_PACKET_COMMAND, 0,
+ packet->data, silc_buffer_len(packet));
silc_buffer_free(packet);
va_end(ap);
}
packet = silc_command_reply_payload_encode_vap(command, status, error,
ident, argc, ap);
- silc_server_packet_send(server, sock, SILC_PACKET_COMMAND_REPLY, 0,
- packet->data, silc_buffer_len(packet));
+ if (packet)
+ silc_server_packet_send(server, sock, SILC_PACKET_COMMAND_REPLY, 0,
+ packet->data, silc_buffer_len(packet));
silc_buffer_free(packet);
va_end(ap);
}
packet = silc_command_reply_payload_encode_vap(command, status, error,
ident, argc, ap);
- silc_server_packet_send_dest(server, sock, SILC_PACKET_COMMAND_REPLY, 0,
- dst_id, dst_id_type, packet->data,
- silc_buffer_len(packet));
+ if (packet)
+ silc_server_packet_send_dest(server, sock, SILC_PACKET_COMMAND_REPLY, 0,
+ dst_id, dst_id_type, packet->data,
+ silc_buffer_len(packet));
silc_buffer_free(packet);
va_end(ap);
}
+/* Send the heartbeat packet. */
+
+void silc_server_send_heartbeat(SilcServer server,
+ SilcPacketStream sock)
+{
+ silc_server_packet_send(server, sock, SILC_PACKET_HEARTBEAT, 0,
+ NULL, 0);
+}
+
/* Routine used to send the connection authentication packet. */
void silc_server_send_connection_auth_request(SilcServer server,
SilcBuffer packet;
packet = silc_buffer_alloc(4);
+ if (!packet)
+ return;
+
silc_buffer_pull_tail(packet, silc_buffer_truelen(packet));
silc_buffer_format(packet,
SILC_STR_UI_SHORT(conn_type),
va_start(ap, argc);
packet = silc_notify_payload_encode(type, argc, ap);
- silc_server_send_opers(server, SILC_PACKET_NOTIFY, 0,
- route, local, packet->data, silc_buffer_len(packet));
+ if (packet)
+ silc_server_send_opers(server, SILC_PACKET_NOTIFY, 0,
+ route, local, packet->data, silc_buffer_len(packet));
silc_buffer_free(packet);
va_end(ap);
}