ctx->packet = packet; /* Save original packet */
/* Parse the command payload in the packet */
- ctx->payload = silc_command_parse_payload(packet->buffer);
+ ctx->payload = silc_command_payload_parse(packet->buffer);
if (!ctx->payload) {
SILC_LOG_ERROR(("Bad command payload, packet dropped"));
silc_buffer_free(packet->buffer);
silc_free(ctx);
return;
}
+ ctx->args = silc_command_get_args(ctx->payload);
/* Execute command. If this fails the packet is dropped. */
for (cmd = silc_command_list; cmd->cb; cmd++)
SILC_LOG_DEBUG(("Sending command status %d", status));
- buffer = silc_command_encode_reply_payload_va(command, status, 0);
+ buffer = silc_command_reply_payload_encode_va(command, status, 0, 0);
silc_server_packet_send(cmd->server, cmd->sock,
SILC_PACKET_COMMAND_REPLY, 0,
buffer->data, buffer->len, FALSE);
SILC_LOG_DEBUG(("Sending command status %d", status));
- buffer = silc_command_encode_reply_payload_va(command, status, 1,
+ buffer = silc_command_reply_payload_encode_va(command, status, 0, 1,
arg_type, arg, arg_len);
silc_server_packet_send(cmd->server, cmd->sock,
SILC_PACKET_COMMAND_REPLY, 0,
SILC_LOG_DEBUG(("Start"));
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_WHOIS,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get the nickname@server string and parse it. */
- tmp = silc_command_get_first_arg(cmd->payload, NULL);
+ tmp = silc_argument_get_first_arg(cmd->args, NULL);
if (tmp) {
if (strchr(tmp, '@')) {
len = strcspn(tmp, "@");
/* Get the max count of reply messages allowed */
if (argc == 2) {
- tmp = silc_command_get_next_arg(cmd->payload, NULL);
+ tmp = silc_argument_get_next_arg(cmd->args, NULL);
if (!tmp) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_WHOIS,
SILC_STATUS_ERR_TOO_MANY_PARAMS);
/* Send WHOIS reply */
id_string = silc_id_id2str(entry->id, SILC_ID_CLIENT);
- tmp = silc_command_get_first_arg(cmd->payload, NULL);
+ tmp = silc_argument_get_first_arg(cmd->args, NULL);
/* XXX */
if (cmd->sock->type == SILC_SOCKET_TYPE_CLIENT) {
/* XXX */
if (entry->userinfo)
packet =
- silc_command_encode_reply_payload_va(SILC_COMMAND_WHOIS,
- status, 5,
+ silc_command_reply_payload_encode_va(SILC_COMMAND_WHOIS,
+ status, 0, 5,
2, id_string, SILC_ID_CLIENT_LEN,
3, nh, strlen(nh),
4, uh, strlen(uh),
7, idle, 4);
else
packet =
- silc_command_encode_reply_payload_va(SILC_COMMAND_WHOIS,
- status, 4,
+ silc_command_reply_payload_encode_va(SILC_COMMAND_WHOIS,
+ status, 0, 4,
2, id_string, SILC_ID_CLIENT_LEN,
3, nh, strlen(nh),
4, uh, strlen(uh),
} else {
/* XXX */
packet =
- silc_command_encode_reply_payload_va(SILC_COMMAND_WHOIS,
- status, 3,
+ silc_command_reply_payload_encode_va(SILC_COMMAND_WHOIS,
+ status, 0, 3,
2, id_string, SILC_ID_CLIENT_LEN,
3, entry->nickname,
strlen(entry->nickname),
SILC_LOG_DEBUG(("Start"));
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_IDENTIFY,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get the nickname@server string and parse it. */
- tmp = silc_command_get_first_arg(cmd->payload, NULL);
+ tmp = silc_argument_get_first_arg(cmd->args, NULL);
if (tmp) {
if (strchr(tmp, '@')) {
len = strcspn(tmp, "@");
/* Get the max count of reply messages allowed */
if (argc == 2) {
- tmp = silc_command_get_next_arg(cmd->payload, NULL);
+ tmp = silc_argument_get_next_arg(cmd->args, NULL);
if (!tmp) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_IDENTIFY,
SILC_STATUS_ERR_TOO_MANY_PARAMS);
/* Send IDENTIFY reply */
id_string = silc_id_id2str(entry->id, SILC_ID_CLIENT);
- tmp = silc_command_get_first_arg(cmd->payload, NULL);
- packet = silc_command_encode_reply_payload_va(SILC_COMMAND_IDENTIFY,
- SILC_STATUS_OK, 2,
+ tmp = silc_argument_get_first_arg(cmd->args, NULL);
+ packet = silc_command_reply_payload_encode_va(SILC_COMMAND_IDENTIFY,
+ SILC_STATUS_OK, 0, 2,
2, id_string,
SILC_ID_CLIENT_LEN,
3, nick, strlen(nick));
SILC_LOG_DEBUG(("Start"));
/* Check number of arguments */
- if (silc_command_get_arg_num(cmd->payload) < 1) {
+ if (silc_argument_get_arg_num(cmd->args) < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_NICK,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
goto out;
}
/* Check nickname */
- nick = silc_command_get_arg_type(cmd->payload, 1, NULL);
+ nick = silc_argument_get_arg_type(cmd->args, 1, NULL);
if (silc_server_command_bad_chars(nick) == TRUE) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_NICK,
SILC_STATUS_ERR_BAD_NICKNAME);
/* Send the new Client ID as reply command back to client */
id_string = silc_id_id2str(id_entry->id, SILC_ID_CLIENT);
- packet = silc_command_encode_reply_payload_va(SILC_COMMAND_NICK,
- SILC_STATUS_OK, 1,
+ packet = silc_command_reply_payload_encode_va(SILC_COMMAND_NICK,
+ SILC_STATUS_OK, 0, 1,
2, id_string,
SILC_ID_CLIENT_LEN);
silc_server_packet_send(cmd->server, cmd->sock, SILC_PACKET_COMMAND_REPLY,
SilcChannelID *channel_id;
SilcChannelEntry channel;
SilcBuffer packet;
+ SilcBuffer id_payload;
unsigned char *tmp, *id_string;
unsigned int argc;
/* Check number of arguments */
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_TOPIC,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get Channel ID */
- tmp = silc_command_get_arg_type(cmd->payload, 1, NULL);
+ tmp = silc_argument_get_arg_type(cmd->args, 1, NULL);
if (!tmp) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_TOPIC,
SILC_STATUS_ERR_NO_CHANNEL_ID);
if (argc > 1) {
/* Get the topic */
- tmp = silc_command_get_arg_type(cmd->payload, 2, NULL);
+ tmp = silc_argument_get_arg_type(cmd->args, 2, NULL);
if (!tmp) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_TOPIC,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
silc_free(channel->topic);
channel->topic = strdup(tmp);
+ id_payload = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL_LEN,
+ SILC_ID_CHANNEL);
+
/* Send notify about topic change to all clients on the channel */
silc_server_send_notify_to_channel(server, channel,
- SILC_NOTIFY_TYPE_TOPIC_SET,
+ SILC_NOTIFY_TYPE_TOPIC_SET, 4, FALSE,
"%s@%s set topic: %s",
+ id_payload->data, id_payload->len,
+ tmp, strlen(tmp),
client->nickname,
- cmd->sock->hostname ?
- cmd->sock->hostname : cmd->sock->ip,
- tmp);
+ strlen(client->nickname),
+ cmd->sock->hostname,
+ strlen(cmd->sock->hostname));
+ silc_buffer_free(id_payload);
}
/* Send the topic to client as reply packet */
id_string = silc_id_id2str(channel_id, SILC_ID_CHANNEL);
if (channel->topic)
- packet = silc_command_encode_reply_payload_va(SILC_COMMAND_TOPIC,
- SILC_STATUS_OK, 2,
+ packet = silc_command_reply_payload_encode_va(SILC_COMMAND_TOPIC,
+ SILC_STATUS_OK, 0, 2,
2, id_string,
SILC_ID_CHANNEL_LEN,
3, channel->topic,
strlen(channel->topic));
else
- packet = silc_command_encode_reply_payload_va(SILC_COMMAND_TOPIC,
- SILC_STATUS_OK, 1,
+ packet = silc_command_reply_payload_encode_va(SILC_COMMAND_TOPIC,
+ SILC_STATUS_OK, 0, 1,
2, id_string,
SILC_ID_CHANNEL_LEN);
silc_server_packet_send(cmd->server, cmd->sock, SILC_PACKET_COMMAND_REPLY,
unsigned char *id_string;
/* Check number of arguments */
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_INVITE,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get destination ID */
- id_string = silc_command_get_arg_type(cmd->payload, 1, &len);
+ id_string = silc_argument_get_arg_type(cmd->args, 1, &len);
if (!id_string) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_INVITE,
SILC_STATUS_ERR_NO_CLIENT_ID);
dest_id = silc_id_str2id(id_string, SILC_ID_CLIENT);
/* Get Channel ID */
- id_string = silc_command_get_arg_type(cmd->payload, 2, &len);
+ id_string = silc_argument_get_arg_type(cmd->args, 2, &len);
if (!id_string) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_INVITE,
SILC_STATUS_ERR_NO_CHANNEL_ID);
/* Send notify to the client that is invited to the channel */
silc_server_send_notify_dest(server, dest_sock, dest_id, SILC_ID_CLIENT,
- SILC_NOTIFY_TYPE_INVITE,
+ SILC_NOTIFY_TYPE_INVITE, 2, FALSE,
"%s invites you to channel %s",
- sender->nickname, channel->channel_name);
+ sender->nickname, strlen(sender->nickname),
+ channel->channel_name,
+ strlen(channel->channel_name));
/* Send command reply */
silc_server_command_send_status_reply(cmd, SILC_COMMAND_INVITE,
unsigned char *id_string;
char info_string[256], *dest_server;
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_INFO,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get server name */
- dest_server = silc_command_get_arg_type(cmd->payload, 1, NULL);
+ dest_server = silc_argument_get_arg_type(cmd->args, 1, NULL);
if (!dest_server) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_INFO,
SILC_STATUS_ERR_NO_SUCH_SERVER);
id_string = silc_id_id2str(server->id, SILC_ID_SERVER);
packet =
- silc_command_encode_reply_payload_va(SILC_COMMAND_INFO,
- SILC_STATUS_OK, 2,
+ silc_command_reply_payload_encode_va(SILC_COMMAND_INFO,
+ SILC_STATUS_OK, 0, 2,
2, id_string, SILC_ID_SERVER_LEN,
3, info_string,
strlen(info_string));
unsigned int argc;
unsigned char *id_string;
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_PING,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get Server ID */
- id_string = silc_command_get_arg_type(cmd->payload, 1, NULL);
+ id_string = silc_argument_get_arg_type(cmd->args, 1, NULL);
if (!id_string) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_PING,
SILC_STATUS_ERR_NO_SERVER_ID);
char *hostname;
SilcChannelEntry channel;
SilcServer server;
+ SilcClientEntry client;
} JoinInternalContext;
SILC_TASK_CALLBACK(silc_server_command_join_notify)
JoinInternalContext *ctx = (JoinInternalContext *)context;
if (ctx->channel->key && ctx->channel->key_len) {
+ SilcBuffer channel_idp, client_idp;
+
+ channel_idp = silc_id_payload_encode(ctx->channel->id, SILC_ID_CHANNEL_LEN,
+ SILC_ID_CHANNEL);
+ client_idp = silc_id_payload_encode(ctx->client->id, SILC_ID_CLIENT_LEN,
+ SILC_ID_CLIENT);
+
silc_server_send_notify_to_channel(ctx->server, ctx->channel,
- SILC_NOTIFY_TYPE_JOIN,
+ SILC_NOTIFY_TYPE_JOIN, 6, FALSE,
"%s (%s@%s) has joined channel %s",
- ctx->nickname, ctx->username,
- ctx->hostname, ctx->channel_name);
+ client_idp->data, client_idp->len,
+ ctx->nickname, strlen(ctx->nickname),
+ ctx->username, strlen(ctx->username),
+ ctx->hostname, strlen(ctx->hostname),
+ channel_idp->data, channel_idp->len,
+ ctx->channel_name,
+ strlen(ctx->channel_name));
+
+ silc_buffer_free(client_idp);
+ silc_buffer_free(channel_idp);
silc_free(ctx);
} else {
silc_task_register(ctx->server->timeout_queue, fd,
unsigned char *id_string;
id_string = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
- buffer = silc_command_encode_payload_va(SILC_COMMAND_NAMES, 1,
+ buffer = silc_command_payload_encode_va(SILC_COMMAND_NAMES, 0, 1,
1, id_string, SILC_ID_CHANNEL_LEN);
cmd = silc_calloc(1, sizeof(*cmd));
- cmd->payload = silc_command_parse_payload(buffer);
+ cmd->payload = silc_command_payload_parse(buffer);
+ cmd->args = silc_command_get_args(cmd->payload);
cmd->server = server;
cmd->sock = sock;
cmd->pending = FALSE;
SILC_LOG_DEBUG(("Start"));
/* Check number of parameters */
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_JOIN,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get channel name */
- tmp = silc_command_get_arg_type(cmd->payload, 1, &tmp_len);
+ tmp = silc_argument_get_arg_type(cmd->args, 1, &tmp_len);
channel_name = silc_calloc(tmp_len + 1, sizeof(*channel_name));
memcpy(channel_name, tmp, tmp_len);
if (silc_server_command_bad_chars(tmp) == TRUE) {
}
/* Get passphrase */
- tmp = silc_command_get_arg_type(cmd->payload, 2, &tmp_len);
+ tmp = silc_argument_get_arg_type(cmd->args, 2, &tmp_len);
if (tmp) {
passphrase = silc_calloc(tmp_len, sizeof(*passphrase));
memcpy(passphrase, tmp, tmp_len);
}
/* Get cipher name */
- cipher = silc_command_get_arg_type(cmd->payload, 3, NULL);
+ cipher = silc_argument_get_arg_type(cmd->args, 3, NULL);
/* See if the channel exists */
channel =
if (!channel->topic)
packet =
- silc_command_encode_reply_payload_va(SILC_COMMAND_JOIN,
- SILC_STATUS_OK, 3,
+ silc_command_reply_payload_encode_va(SILC_COMMAND_JOIN,
+ SILC_STATUS_OK, 0, 3,
2, channel_name,
strlen(channel_name),
3, id_string, SILC_ID_CHANNEL_LEN,
4, mode, 4);
else
packet =
- silc_command_encode_reply_payload_va(SILC_COMMAND_JOIN,
- SILC_STATUS_OK, 4,
+ silc_command_reply_payload_encode_va(SILC_COMMAND_JOIN,
+ SILC_STATUS_OK, 0, 4,
2, channel_name,
strlen(channel_name),
3, id_string, SILC_ID_CHANNEL_LEN,
if (!cmd->pending) {
tmp_len = strlen(channel->channel_key->cipher->name);
packet =
- silc_channel_key_encode_payload(SILC_ID_CHANNEL_LEN,
+ silc_channel_key_payload_encode(SILC_ID_CHANNEL_LEN,
id_string, tmp_len,
channel->channel_key->cipher->name,
channel->key_len / 8, channel->key);
new user on the channel. */
if (!(cmd->packet->flags & SILC_PACKET_FLAG_FORWARDED)) {
if (!cmd->pending) {
+ SilcBuffer channel_idp, client_idp;
+
+ channel_idp = silc_id_payload_encode(channel->id,
+ SILC_ID_CHANNEL_LEN,
+ SILC_ID_CHANNEL);
+ client_idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT_LEN,
+ SILC_ID_CLIENT);
+
silc_server_send_notify_to_channel(server, channel,
- SILC_NOTIFY_TYPE_JOIN,
+ SILC_NOTIFY_TYPE_JOIN, 6, FALSE,
"%s (%s@%s) has joined channel %s",
- client->nickname, client->username,
- sock->hostname ? sock->hostname :
- sock->ip, channel_name);
+ client_idp->data, client_idp->len,
+ client->nickname,
+ strlen(client->nickname),
+ client->username,
+ strlen(client->username),
+ sock->hostname,
+ strlen(sock->hostname),
+ channel_idp->data, channel_idp->len,
+ channel_name,
+ strlen(channel_name));
+
+ silc_buffer_free(client_idp);
+ silc_buffer_free(channel_idp);
} else {
/* This is pending command request. Send the notify after we have
received the key for the channel from the router. */
ctx->hostname = sock->hostname ? sock->hostname : sock->ip;
ctx->channel = channel;
ctx->server = server;
+ ctx->client = client;
silc_task_register(server->timeout_queue, sock->sock,
silc_server_command_join_notify, ctx,
0, 10000, SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
SILC_LOG_DEBUG(("Start"));
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_LEAVE,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
SILC_LOG_DEBUG(("Start"));
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_LEAVE,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get Channel ID */
- tmp = silc_command_get_arg_type(cmd->payload, 1, NULL);
+ tmp = silc_argument_get_arg_type(cmd->args, 1, NULL);
if (!tmp) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_LEAVE,
SILC_STATUS_ERR_NO_CHANNEL_ID);
/* Encode channel key payload to be distributed on the channel */
packet =
- silc_channel_key_encode_payload(SILC_ID_CHANNEL_LEN, tmp,
+ silc_channel_key_payload_encode(SILC_ID_CHANNEL_LEN, tmp,
strlen(channel->channel_key->cipher->name),
channel->channel_key->cipher->name,
key_len, channel->key);
SILC_LOG_DEBUG(("Start"));
- argc = silc_command_get_arg_num(cmd->payload);
+ argc = silc_argument_get_arg_num(cmd->args);
if (argc < 1) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_NAMES,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS);
}
/* Get Channel ID */
- tmp = silc_command_get_arg_type(cmd->payload, 1, NULL);
+ tmp = silc_argument_get_arg_type(cmd->args, 1, NULL);
if (!tmp) {
silc_server_command_send_status_reply(cmd, SILC_COMMAND_LEAVE,
SILC_STATUS_ERR_NO_CHANNEL_ID);
client_id_list->data - client_id_list->head);
/* Send reply */
- packet = silc_command_encode_reply_payload_va(SILC_COMMAND_NAMES,
- SILC_STATUS_OK, 3,
+ packet = silc_command_reply_payload_encode_va(SILC_COMMAND_NAMES,
+ SILC_STATUS_OK, 0, 3,
2, tmp, SILC_ID_CHANNEL_LEN,
3, name_list,
strlen(name_list),
{
int i, k;
SilcChannelEntry channel;
+ SilcBuffer id_payload;
+
+ id_payload = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL_LEN,
+ SILC_ID_CHANNEL);
/* Remove the client from all channels. The client is removed from
the channels' user list. */
notify that this client has left the channel. */
if (channel->global_users)
silc_server_send_notify_to_channel(server, channel,
- SILC_NOTIFY_TYPE_SIGNOFF,
+ SILC_NOTIFY_TYPE_SIGNOFF, 3,
+ FALSE,
"Signoff: %s@%s",
client->nickname,
- sock->hostname ?
- sock->hostname : sock->ip);
+ strlen(client->nickname),
+ sock->hostname,
+ strlen(sock->hostname),
+ id_payload->data,
+ id_payload->len);
silc_idlist_del_channel(server->local_list, channel);
break;
/* Send notify to channel about client leaving SILC and thus
the entire channel. */
silc_server_send_notify_to_channel(server, channel,
- SILC_NOTIFY_TYPE_SIGNOFF,
+ SILC_NOTIFY_TYPE_SIGNOFF, 3,
+ FALSE,
"Signoff: %s@%s",
- client->nickname,
- sock->hostname ?
- sock->hostname : sock->ip);
+ client->nickname,
+ strlen(client->nickname),
+ sock->hostname,
+ strlen(sock->hostname),
+ id_payload->data,
+ id_payload->len);
}
}
}
if (client->channel_count)
silc_free(client->channel);
client->channel = NULL;
+ silc_buffer_free(id_payload);
}
/* Removes client from one channel. This is used for example when client
{
int i, k;
SilcChannelEntry ch;
+ SilcBuffer id_payload;
+
+ id_payload = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL_LEN,
+ SILC_ID_CHANNEL);
/* Remove the client from the channel. The client is removed from
the channel's user list. */
ie. the channel is not created locally. */
if (notify && channel->global_users)
silc_server_send_notify_to_channel(server, channel,
- SILC_NOTIFY_TYPE_LEAVE,
+ SILC_NOTIFY_TYPE_LEAVE, 4,
+ FALSE,
"%s@%s has left channel %s",
- client->nickname,
- sock->hostname ?
- sock->hostname : sock->ip,
- channel->channel_name);
+ client->nickname,
+ strlen(client->nickname),
+ sock->hostname,
+ strlen(sock->hostname),
+ id_payload->data,
+ id_payload->len,
+ channel->channel_name,
+ strlen(channel->channel_name));
silc_idlist_del_channel(server->local_list, channel);
+ silc_buffer_free(id_payload);
return FALSE;
}
/* Send notify to channel about client leaving the channel */
if (notify)
silc_server_send_notify_to_channel(server, channel,
- SILC_NOTIFY_TYPE_LEAVE,
+ SILC_NOTIFY_TYPE_LEAVE, 4,
+ FALSE,
"%s@%s has left channel %s",
- client->nickname, sock->hostname ?
- sock->hostname : sock->ip,
- channel->channel_name);
+ client->nickname,
+ strlen(client->nickname),
+ sock->hostname,
+ strlen(sock->hostname),
+ id_payload->data,
+ id_payload->len,
+ channel->channel_name,
+ strlen(channel->channel_name));
}
}
}
+ silc_buffer_free(id_payload);
return TRUE;
}
goto out;
/* Decode channel key payload */
- payload = silc_channel_key_parse_payload(buffer);
+ payload = silc_channel_key_payload_parse(buffer);
if (!payload) {
SILC_LOG_ERROR(("Bad channel key payload, dropped"));
goto out;
if (id)
silc_free(id);
if (payload)
- silc_channel_key_free_payload(payload);
+ silc_channel_key_payload_free(payload);
silc_buffer_free(buffer);
}
strncat(line, cp, i - 1);
cp += i;
- if (i == 2)
+ if (i == 1)
line[0] = ' ';
- silc_server_send_notify(server, sock, SILC_NOTIFY_TYPE_NONE, line);
+ silc_server_send_notify(server, sock, SILC_NOTIFY_TYPE_NONE,
+ 0, FALSE, line);
if (!strlen(cp))
break;
buf, strlen(buf), FALSE);
}
-/* Sends notify message */
+/* Sends notify message. If `format' is TRUE then the message and the
+ arguments sent are formatted and that message is sent to the other
+ end, if FALSE then arguments are encoded into argument payloads and
+ the message is sent as is. */
void silc_server_send_notify(SilcServer server,
SilcSocketConnection sock,
SilcNotifyType type,
+ unsigned int argc,
+ unsigned int format,
const char *fmt, ...)
{
va_list ap;
+ char *cp;
unsigned char buf[4096];
SilcBuffer packet;
- memset(buf, 0, sizeof(buf));
- va_start(ap, fmt);
- vsprintf(buf, fmt, ap);
- va_end(ap);
+ cp = (char *)fmt;
- packet = silc_buffer_alloc(2 + strlen(buf));
- silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
- silc_buffer_format(packet,
- SILC_STR_UI_SHORT(type),
- SILC_STR_UI16_STRING(buf),
- SILC_STR_END);
+ if (argc)
+ va_start(ap, fmt);
+ if (format && argc) {
+ memset(buf, 0, sizeof(buf));
+ vsprintf(buf, fmt, ap);
+ va_end(ap);
+ argc = 0;
+ cp = buf;
+ }
+
+ packet = silc_notify_payload_encode(type, cp, argc, ap);
silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY, 0,
packet->data, packet->len, FALSE);
silc_buffer_free(packet);
void *dest_id,
SilcIdType dest_id_type,
SilcNotifyType type,
+ unsigned int argc,
+ unsigned int format,
const char *fmt, ...)
{
va_list ap;
unsigned char buf[4096];
SilcBuffer packet;
- memset(buf, 0, sizeof(buf));
- va_start(ap, fmt);
- vsprintf(buf, fmt, ap);
- va_end(ap);
+ if (argc)
+ va_start(ap, fmt);
- packet = silc_buffer_alloc(2 + strlen(buf));
- silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
- silc_buffer_format(packet,
- SILC_STR_UI_SHORT(type),
- SILC_STR_UI16_STRING(buf),
- SILC_STR_END);
+ if (format && argc) {
+ memset(buf, 0, sizeof(buf));
+ vsprintf(buf, fmt, ap);
+ va_end(ap);
+ argc = 0;
+ }
+ packet = silc_notify_payload_encode(type, (char *)fmt, argc, ap);
silc_server_packet_send_dest(server, sock, SILC_PACKET_NOTIFY, 0,
dest_id, dest_id_type,
packet->data, packet->len, FALSE);
void silc_server_send_notify_to_channel(SilcServer server,
SilcChannelEntry channel,
SilcNotifyType type,
+ unsigned int argc,
+ unsigned int format,
const char *fmt, ...)
{
va_list ap;
unsigned char buf[4096];
SilcBuffer packet;
- memset(buf, 0, sizeof(buf));
- va_start(ap, fmt);
- vsprintf(buf, fmt, ap);
- va_end(ap);
+ if (argc)
+ va_start(ap, fmt);
- packet = silc_buffer_alloc(2 + strlen(buf));
- silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
- silc_buffer_format(packet,
- SILC_STR_UI_SHORT(type),
- SILC_STR_UI16_STRING(buf),
- SILC_STR_END);
+ if (format && argc) {
+ memset(buf, 0, sizeof(buf));
+ vsprintf(buf, fmt, ap);
+ va_end(ap);
+ argc = 0;
+ }
+ packet = silc_notify_payload_encode(type, (char *)fmt, argc, ap);
silc_server_packet_send_to_channel(server, channel,
SILC_PACKET_NOTIFY,
packet->data, packet->len, FALSE);
/* Send some nice info to the client */
silc_server_send_notify(server, sock,
- SILC_NOTIFY_TYPE_NONE,
+ SILC_NOTIFY_TYPE_NONE, 2, TRUE,
"Welcome to the SILC Network %s@%s",
- username,
- sock->hostname ? sock->hostname : sock->ip);
+ username, sock->hostname);
silc_server_send_notify(server, sock,
- SILC_NOTIFY_TYPE_NONE,
+ SILC_NOTIFY_TYPE_NONE, 2, TRUE,
"Your host is %s, running version %s",
server->config->server_info->server_name,
server_version);
silc_server_send_notify(server, sock,
- SILC_NOTIFY_TYPE_NONE,
+ SILC_NOTIFY_TYPE_NONE, 2, TRUE,
"Your connection is secured with %s cipher, "
"key length %d bits",
client->send_key->cipher->name,
client->send_key->cipher->key_len);
silc_server_send_notify(server, sock,
- SILC_NOTIFY_TYPE_NONE,
+ SILC_NOTIFY_TYPE_NONE, 1, TRUE,
"Your current nickname is %s",
client->nickname);