X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcserver%2Fserver_send.c;h=5f9a61abe0673b807c6d3995b6aa2a81a44ef954;hb=4d4425e57eb164ce87a0b87ba9e991cbaa9d9baf;hp=9ec759d106af6cf1a12a5b21de627c15c59f511d;hpb=3a4359b248742c4d08d00c06badcb346d4a19528;p=silc.git diff --git a/lib/silcserver/server_send.c b/lib/silcserver/server_send.c index 9ec759d1..5f9a61ab 100644 --- a/lib/silcserver/server_send.c +++ b/lib/silcserver/server_send.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2005 Pekka Riikonen + Copyright (C) 1997 - 2006 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 @@ -85,6 +85,80 @@ SilcBool silc_server_send_new_id(SilcPacketStream stream, } +/****************************** Command packets *****************************/ + +/* Generic function to send any command. The arguments must be sent already + encoded into correct form in correct order, and they must as follows: + { argument type, argument data, argument length }. */ + +SilcBool silc_server_send_command(SilcServer server, + SilcPacketStream stream, + SilcCommand command, + SilcUInt16 ident, + SilcUInt32 argc, ...) +{ + SilcBuffer packet; + va_list ap; + SilcBool ret = FALSE; + + /* Statistics */ + server->stat.commands_sent++; + + va_start(ap, argc); + + packet = silc_command_payload_encode_vap(command, ident, argc, ap); + if (!packet) { + va_end(ap); + return ret; + } + + ret = silc_packet_send(stream, SILC_PACKET_COMMAND, 0, + packet->data, silc_buffer_len(packet)); + + silc_buffer_free(packet); + va_end(ap); + + return ret; +} + +/* Generic function to send a command reply. The arguments must be sent + already encoded into correct form in correct order, and they must be + { argument type, argument data, argument length }. */ + +SilcBool silc_server_send_command_reply(SilcServer server, + SilcPacketStream stream, + SilcCommand command, + SilcStatus status, + SilcStatus error, + SilcUInt16 ident, + SilcUInt32 argc, ...) +{ + SilcBuffer packet; + va_list ap; + SilcBool ret = FALSE; + + /* Statistics */ + server->stat.commands_sent++; + + va_start(ap, argc); + + packet = silc_command_reply_payload_encode_vap(command, status, error, + ident, argc, ap); + if (!packet) { + va_end(ap); + return ret; + } + + ret = silc_packet_send(stream, SILC_PACKET_COMMAND_REPLY, 0, + packet->data, silc_buffer_len(packet)); + + silc_buffer_free(packet); + va_end(ap); + + return ret; +} + + /****************************** Notify packets ******************************/ /* Sends notify packet. Each variable argument format in the argument list