X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilccore%2Fsilccommand.h;h=059797e5bc5d03c95beb5dc299490f94d19b6b66;hp=e1051e141d81d0321c22ad3ba6fef55f8c103127;hb=HEAD;hpb=2dc218143c7859f7529396dc121ae08e2fd78da0 diff --git a/lib/silccore/silccommand.h b/lib/silccore/silccommand.h index e1051e14..059797e5 100644 --- a/lib/silccore/silccommand.h +++ b/lib/silccore/silccommand.h @@ -1,16 +1,15 @@ /* - + silccommand.h - + Author: Pekka Riikonen - - Copyright (C) 1997 - 2001 Pekka Riikonen - + + Copyright (C) 1997 - 2008 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - + the Free Software Foundation; version 2 of the License. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -18,7 +17,7 @@ */ -/****h* silccore/SilcCommandAPI +/****h* silccore/SILC Command Interface * * DESCRIPTION * @@ -31,27 +30,10 @@ #ifndef SILCCOMMAND_H #define SILCCOMMAND_H -/****f* silccore/SilcCommandAPI/SilcCommandCb - * - * SYNOPSIS - * - * typedef void (*SilcCommandCb)(void *context, void *context2); - * - * DESCRIPTION - * - * Command function callback. The actual command function pointer. - * This is generic command callback that the application may choose to - * use with its command routines. However, none of the generic - * routines depend on this callback so application may freely define - * their own command callback if desired. - * - ***/ -typedef void (*SilcCommandCb)(void *context, void *context2); - /****s* silccore/SilcCommandAPI/SilcCommandPayload * * NAME - * + * * typedef struct SilcCommandPayloadStruct *SilcCommandPayload; * * DESCRIPTION @@ -67,7 +49,7 @@ typedef struct SilcCommandPayloadStruct *SilcCommandPayload; /****d* silccore/SilcCommandAPI/SilcCommandFlags * * NAME - * + * * typedef enum { ... } SilcCommandFlags; * * DESCRIPTION @@ -98,7 +80,7 @@ typedef enum { /* Command is available only for server operators */ SILC_CF_OPER = (1L << 4), - /* Command is available only for SILC (router) operators. If this + /* Command is available only for SILC (router) operators. If this is set SILC_CF_OPER is not necessary to be set. */ SILC_CF_SILC_OPER = (1L << 5), @@ -108,8 +90,8 @@ typedef enum { /****d* silccore/SilcCommandAPI/SilcCommand * * NAME - * - * typedef unsigned char SilcCommand; + * + * typedef SilcUInt8 SilcCommand; * * DESCRIPTION * @@ -119,7 +101,7 @@ typedef enum { * * SOURCE */ -typedef unsigned char SilcCommand; +typedef SilcUInt8 SilcCommand; /* All SILC commands. These are commands that have client and server counterparts. */ @@ -134,7 +116,7 @@ typedef unsigned char SilcCommand; #define SILC_COMMAND_QUIT 8 #define SILC_COMMAND_KILL 9 #define SILC_COMMAND_INFO 10 -#define SILC_COMMAND_CONNECT 11 +#define SILC_COMMAND_STATS 11 #define SILC_COMMAND_PING 12 #define SILC_COMMAND_OPER 13 #define SILC_COMMAND_JOIN 14 @@ -144,85 +126,33 @@ typedef unsigned char SilcCommand; #define SILC_COMMAND_CUMODE 18 #define SILC_COMMAND_KICK 19 #define SILC_COMMAND_BAN 20 -#define SILC_COMMAND_CLOSE 21 -#define SILC_COMMAND_SHUTDOWN 22 +#define SILC_COMMAND_DETACH 21 +#define SILC_COMMAND_WATCH 22 #define SILC_COMMAND_SILCOPER 23 #define SILC_COMMAND_LEAVE 24 #define SILC_COMMAND_USERS 25 #define SILC_COMMAND_GETKEY 26 +#define SILC_COMMAND_SERVICE 27 + +/* Private range start */ +#define SILC_COMMAND_PRIVATE 200 +#define SILC_COMMAND_PRIV_CONNECT 200 +#define SILC_COMMAND_PRIV_CLOSE 201 +#define SILC_COMMAND_PRIV_SHUTDOWN 202 /* Reserved */ #define SILC_COMMAND_RESERVED 255 /***/ -/****d* silccore/SilcCommandAPI/SilcCommandStatus - * - * NAME - * - * typedef uint16 SilcCommandStatus; - * - * DESCRIPTION - * - * The SilcCommandStatus type definition and the status defines. - * The server returns a status in each Command Payload indicating - * the status of the command. - * - * SOURCE - */ -typedef uint16 SilcCommandStatus; - -/* Command Status messages */ -#define SILC_STATUS_OK 0 -#define SILC_STATUS_LIST_START 1 -#define SILC_STATUS_LIST_ITEM 2 -#define SILC_STATUS_LIST_END 3 -#define SILC_STATUS_ERR_NO_SUCH_NICK 10 -#define SILC_STATUS_ERR_NO_SUCH_CHANNEL 11 -#define SILC_STATUS_ERR_NO_SUCH_SERVER 12 -#define SILC_STATUS_ERR_TOO_MANY_TARGETS 13 -#define SILC_STATUS_ERR_NO_RECIPIENT 14 -#define SILC_STATUS_ERR_UNKNOWN_COMMAND 15 -#define SILC_STATUS_ERR_WILDCARDS 16 -#define SILC_STATUS_ERR_NO_CLIENT_ID 17 -#define SILC_STATUS_ERR_NO_CHANNEL_ID 18 -#define SILC_STATUS_ERR_NO_SERVER_ID 19 -#define SILC_STATUS_ERR_BAD_CLIENT_ID 20 -#define SILC_STATUS_ERR_BAD_CHANNEL_ID 21 -#define SILC_STATUS_ERR_NO_SUCH_CLIENT_ID 22 -#define SILC_STATUS_ERR_NO_SUCH_CHANNEL_ID 23 -#define SILC_STATUS_ERR_NICKNAME_IN_USE 24 -#define SILC_STATUS_ERR_NOT_ON_CHANNEL 25 -#define SILC_STATUS_ERR_USER_NOT_ON_CHANNEL 26 -#define SILC_STATUS_ERR_USER_ON_CHANNEL 27 -#define SILC_STATUS_ERR_NOT_REGISTERED 28 -#define SILC_STATUS_ERR_NOT_ENOUGH_PARAMS 29 -#define SILC_STATUS_ERR_TOO_MANY_PARAMS 30 -#define SILC_STATUS_ERR_PERM_DENIED 31 -#define SILC_STATUS_ERR_BANNED_FROM_SERVER 32 -#define SILC_STATUS_ERR_BAD_PASSWORD 33 -#define SILC_STATUS_ERR_CHANNEL_IS_FULL 34 -#define SILC_STATUS_ERR_NOT_INVITED 35 -#define SILC_STATUS_ERR_BANNED_FROM_CHANNEL 36 -#define SILC_STATUS_ERR_UNKNOWN_MODE 37 -#define SILC_STATUS_ERR_NOT_YOU 38 -#define SILC_STATUS_ERR_NO_CHANNEL_PRIV 39 -#define SILC_STATUS_ERR_NO_CHANNEL_FOPRIV 40 -#define SILC_STATUS_ERR_NO_SERVER_PRIV 41 -#define SILC_STATUS_ERR_NO_ROUTER_PRIV 42 -#define SILC_STATUS_ERR_BAD_NICKNAME 43 -#define SILC_STATUS_ERR_BAD_CHANNEL 44 -#define SILC_STATUS_ERR_AUTH_FAILED 45 -#define SILC_STATUS_ERR_UNKNOWN_ALGORITHM 46 -#define SILC_STATUS_ERR_NO_SUCH_SERVER_ID 47 -/***/ - /* Prototypes */ /****f* silccore/SilcCommandAPI/silc_command_payload_parse * * SYNOPSIS * - * SilcCommandPayload silc_command_payload_parse(SilcBuffer buffer); + * SilcCommandPayload + * silc_command_payload_parse(const unsigned char *payload, + * SilcUInt32 payload_len); * * DESCRIPTION * @@ -230,18 +160,19 @@ typedef uint16 SilcCommandStatus; * `buffer' is the raw payload. * ***/ -SilcCommandPayload silc_command_payload_parse(SilcBuffer buffer); +SilcCommandPayload silc_command_payload_parse(const unsigned char *payload, + SilcUInt32 payload_len); /****f* silccore/SilcCommandAPI/silc_command_payload_encode * * SYNOPSIS * * SilcBuffer silc_command_payload_encode(SilcCommand cmd, - * uint32 argc, + * SilcUInt32 argc, * unsigned char **argv, - * uint32 *argv_lens, - * uint32 *argv_types, - * uint16 ident); + * SilcUInt32 *argv_lens, + * SilcUInt32 *argv_types, + * SilcUInt16 ident); * * DESCRIPTION * @@ -249,17 +180,17 @@ SilcCommandPayload silc_command_payload_parse(SilcBuffer buffer); * ***/ SilcBuffer silc_command_payload_encode(SilcCommand cmd, - uint32 argc, + SilcUInt32 argc, unsigned char **argv, - uint32 *argv_lens, - uint32 *argv_types, - uint16 ident); + SilcUInt32 *argv_lens, + SilcUInt32 *argv_types, + SilcUInt16 ident); /****f* silccore/SilcCommandAPI/silc_command_payload_encode_payload * * SYNOPSIS * - * SilcBuffer + * SilcBuffer * silc_command_payload_encode_payload(SilcCommandPayload payload); * * DESCRIPTION @@ -274,32 +205,32 @@ SilcBuffer silc_command_payload_encode_payload(SilcCommandPayload payload); * * SYNOPSIS * - * SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, - * uint16 ident, - * uint32 argc, ...); + * SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, + * SilcUInt16 ident, + * SilcUInt32 argc, ...); * * DESCRIPTION * * Encodes Command payload with variable argument list. The arguments - * must be: uint32, unsigned char *, unsigned int, ... One - * {uint32, unsigned char * and unsigned int} forms one argument, - * thus `argc' in case when sending one {uint32, unsigned char * - * and uint32} equals one (1) and when sending two of those it + * must be: SilcUInt32, unsigned char *, unsigned int, ... One + * {SilcUInt32, unsigned char * and unsigned int} forms one argument, + * thus `argc' in case when sending one {SilcUInt32, unsigned char * + * and SilcUInt32} equals one (1) and when sending two of those it * equals two (2), and so on. This has to be preserved or bad things * will happen. The variable arguments is: {type, data, data_len}. * ***/ -SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, - uint16 ident, - uint32 argc, ...); +SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, + SilcUInt16 ident, + SilcUInt32 argc, ...); /****f* silccore/SilcCommandAPI/silc_command_payload_encode_vap * * SYNOPSIS * - * SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, - * uint16 ident, - * uint32 argc, va_list ap); + * SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, + * SilcUInt16 ident, + * SilcUInt32 argc, va_list ap); * * DESCRIPTION * @@ -307,33 +238,72 @@ SilcBuffer silc_command_payload_encode_va(SilcCommand cmd, * takes the va_list as argument. * ***/ -SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, - uint16 ident, - uint32 argc, va_list ap); +SilcBuffer silc_command_payload_encode_vap(SilcCommand cmd, + SilcUInt16 ident, + SilcUInt32 argc, va_list ap); /****f* silccore/SilcCommandAPI/silc_command_reply_payload_encode_va * * SYNOPSIS * - * SilcBuffer - * silc_command_reply_payload_encode_va(SilcCommand cmd, - * SilcCommandStatus status, - * uint16 ident, - * uint32 argc, ...); + * SilcBuffer + * silc_command_reply_payload_encode_va(SilcCommand cmd, + * SilcStatus status, + * SilcStatus error, + * SilcUInt16 ident, + * SilcUInt32 argc, ...); + * + * DESCRIPTION + * + * Same as silc_command_payload_encode_va except that this is used to + * encode strictly command reply packets. The `argc' must not count + * `status' and `error' as arguments. The `status' includes the + * command reply status. If single reply will be sent then it includes + * SILC_STATUS_OK if error did not occur. It includes an error value + * if error did occur. In this case `error' field is ignored. If + * there will be multiple successful command replies then the `status' + * includes a list value and `error' is ignored. If there will + * multiple error replies the `status' includes a list value, and + * the `error' includes an error value. Thus, the `error' value is + * specified only if there will be list of errors. + * + * NOTES + * + * Protocol defines that it is possible to send both list of successful + * and list of error replies at the same time, as long as the error + * replies are sent after the successful replies. + * + ***/ +SilcBuffer +silc_command_reply_payload_encode_va(SilcCommand cmd, + SilcStatus status, + SilcStatus error, + SilcUInt16 ident, + SilcUInt32 argc, ...); + +/****f* silccore/SilcCommandAPI/silc_command_reply_payload_encode_vap + * + * SYNOPSIS + * + * SilcBuffer + * silc_command_reply_payload_encode_vap(SilcCommand cmd, + * SilcStatus status, + * SilcStatus error, + * SilcUInt16 ident, SilcUInt32 argc, + * va_list ap); * * DESCRIPTION * - * Same as silc_command_payload_encode_va except that this is used to - * encode strictly command reply packets. The command status message - * to be returned is sent as extra argument to this function. The `argc' - * must not count `status' as on argument. + * This is equivalent to the silc_command_reply_payload_encode_va except + * takes the va_list as argument. * ***/ -SilcBuffer -silc_command_reply_payload_encode_va(SilcCommand cmd, - SilcCommandStatus status, - uint16 ident, - uint32 argc, ...); +SilcBuffer +silc_command_reply_payload_encode_vap(SilcCommand cmd, + SilcStatus status, + SilcStatus error, + SilcUInt16 ident, SilcUInt32 argc, + va_list ap); /****f* silccore/SilcCommandAPI/silc_command_free * @@ -379,7 +349,7 @@ SilcArgumentPayload silc_command_get_args(SilcCommandPayload payload); * * SYNOPSIS * - * uint16 silc_command_get_ident(SilcCommandPayload payload); + * SilcUInt16 silc_command_get_ident(SilcCommandPayload payload); * * DESCRIPTION * @@ -389,28 +359,51 @@ SilcArgumentPayload silc_command_get_args(SilcCommandPayload payload); * the same identifier in the command reply. * ***/ -uint16 silc_command_get_ident(SilcCommandPayload payload); +SilcUInt16 silc_command_get_ident(SilcCommandPayload payload); + +/****f* silccore/SilcCommandAPI/silc_command_get_status + * + * SYNOPSIS + * + * SilcBool silc_command_get_status(SilcCommandPayload payload, + * SilcStatus *status, + * SilcStatus *error); + * + * DESCRIPTION + * + * This function returns the command reply status into `status' and + * error status, if error occurred into the `error'. The function + * returns TRUE if command reply status is not error, and FALSE if + * error occurred. In this case the `error' will include the actual + * error status. The `status' can be in this case some list value + * which indicates that there will be list of errors. + * + ***/ +SilcBool silc_command_get_status(SilcCommandPayload payload, + SilcStatus *status, + SilcStatus *error); /****f* silccore/SilcCommandAPI/silc_command_set_ident * * SYNOPSIS * - * void silc_command_set_ident(SilcCommandPayload payload, uint16 ident); + * void silc_command_set_ident(SilcCommandPayload payload, + * SilcUInt16 ident); * * DESCRIPTION * * Function to set identifier to already allocated Command Payload. Command * payloads are frequentlly resent in SILC and thusly this makes it easy - * to set the identifier without encoding new Command Payload. + * to set the identifier without encoding new Command Payload. * ***/ -void silc_command_set_ident(SilcCommandPayload payload, uint16 ident); +void silc_command_set_ident(SilcCommandPayload payload, SilcUInt16 ident); /****f* silccore/SilcCommandAPI/silc_command_set_command * * SYNOPSIS * - * void silc_command_set_command(SilcCommandPayload payload, + * void silc_command_set_command(SilcCommandPayload payload, * SilcCommand command); * * DESCRIPTION