X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fcommand.h;h=ba7fd2ce2d9383105a580b9de52890fac712f866;hb=d1e71f42379e8b5cd0748a7aeae8561b02cfe53d;hp=4134ee2e9450d2405c95f99364d1a98f3471dcea;hpb=ab7251f985a453b36972bb1286f3439847b844aa;p=silc.git diff --git a/apps/silcd/command.h b/apps/silcd/command.h index 4134ee2e..ba7fd2ce 100644 --- a/apps/silcd/command.h +++ b/apps/silcd/command.h @@ -2,15 +2,14 @@ servercommand.h - Author: Pekka Riikonen + Author: Pekka Riikonen - Copyright (C) 1997 - 2001 Pekka Riikonen + Copyright (C) 1997 - 2005 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 @@ -21,8 +20,8 @@ #ifndef COMMAND_H #define COMMAND_H -/* - Structure holding one command and pointer to its function. +/* + Structure holding one command and pointer to its function. SilcCommandCb cb @@ -35,7 +34,7 @@ SilcCommandFlag flags Flags for the command. These set how command behaves on different - situations. + situations. */ typedef struct { @@ -58,22 +57,15 @@ typedef struct { int users; /* Reference counter */ } *SilcServerCommandContext; -/* Pending Command callback destructor. This is called after calling the - pending callback or if error occurs while processing the pending command. - If error occurs then the callback won't be called at all, and only this - destructor is called. The `context' is the context given for the function - silc_server_command_pending. */ -typedef void (*SilcServerPendingDestructor)(void *context); - /* Structure holding pending commands. If command is pending it will be executed after command reply has been received and executed. */ typedef struct SilcServerCommandPendingStruct { - SilcServer server; SilcCommand reply_cmd; + SilcUInt16 ident; + unsigned int reply_check : 8; SilcCommandCb callback; - SilcServerPendingDestructor destructor; void *context; - uint16 ident; + SilcTask timeout; struct SilcServerCommandPendingStruct *next; } SilcServerCommandPending; @@ -85,23 +77,24 @@ typedef struct SilcServerCommandPendingStruct { #define SILC_SERVER_CMD(func, cmd, flags) \ { silc_server_command_##func, SILC_COMMAND_##cmd, flags } -/* Macro used to declare command functions */ +/* Macro used to declare command functions. The `context' will be the + SilcServerCommandContext and the `context2' is the + SilcServerCommandReplyContext if this function is called from the + command reply as pending command callback. Otherwise `context2' + is NULL. */ #define SILC_SERVER_CMD_FUNC(func) \ -void silc_server_command_##func(void *context) +void silc_server_command_##func(void *context, void *context2) -/* Executed pending command */ +/* Executed pending command. The first argument to the callback function + is the user specified context. The second argument is always the + SilcServerCommandReply context. */ #define SILC_SERVER_PENDING_EXEC(ctx, cmd) \ do { \ - if (ctx->callback) \ - (*ctx->callback)(ctx->context); \ -} while(0) - -/* Execute destructor for pending command */ -#define SILC_SERVER_PENDING_DESTRUCTOR(ctx, cmd) \ -do { \ + int _i; \ + for (_i = 0; _i < ctx->callbacks_count; _i++) \ + if (ctx->callbacks[_i].callback) \ + (*ctx->callbacks[_i].callback)(ctx->callbacks[_i].context, ctx); \ silc_server_command_pending_del(ctx->server, cmd, ctx->ident); \ - if (ctx->destructor) \ - (*ctx->destructor)(ctx->context); \ } while(0) /* Prototypes */ @@ -110,21 +103,27 @@ void silc_server_command_process(SilcServer server, SilcPacketContext *packet); SilcServerCommandContext silc_server_command_alloc(); void silc_server_command_free(SilcServerCommandContext ctx); -SilcServerCommandContext +SilcServerCommandContext silc_server_command_dup(SilcServerCommandContext ctx); -void silc_server_command_pending(SilcServer server, +bool silc_server_command_pending(SilcServer server, SilcCommand reply_cmd, - uint16 ident, - SilcServerPendingDestructor destructor, + SilcUInt16 ident, SilcCommandCb callback, void *context); +bool silc_server_command_pending_timed(SilcServer server, + SilcCommand reply_cmd, + SilcUInt16 ident, + SilcCommandCb callback, + void *context, + SilcUInt16 timeout); void silc_server_command_pending_del(SilcServer server, SilcCommand reply_cmd, - uint16 ident); -int silc_server_command_pending_check(SilcServer server, - SilcServerCommandReplyContext ctx, - SilcCommand command, - uint16 ident); + SilcUInt16 ident); +SilcServerCommandPendingCallbacks +silc_server_command_pending_check(SilcServer server, + SilcCommand command, + SilcUInt16 ident, + SilcUInt32 *callbacks_count); SILC_SERVER_CMD_FUNC(whois); SILC_SERVER_CMD_FUNC(whowas); SILC_SERVER_CMD_FUNC(identify); @@ -136,24 +135,26 @@ SILC_SERVER_CMD_FUNC(invite); SILC_SERVER_CMD_FUNC(quit); SILC_SERVER_CMD_FUNC(kill); SILC_SERVER_CMD_FUNC(info); -SILC_SERVER_CMD_FUNC(connect); +SILC_SERVER_CMD_FUNC(stats); SILC_SERVER_CMD_FUNC(ping); SILC_SERVER_CMD_FUNC(oper); -SILC_SERVER_CMD_FUNC(pass); -SILC_SERVER_CMD_FUNC(admin); SILC_SERVER_CMD_FUNC(join); SILC_SERVER_CMD_FUNC(motd); SILC_SERVER_CMD_FUNC(umode); SILC_SERVER_CMD_FUNC(cmode); SILC_SERVER_CMD_FUNC(cumode); SILC_SERVER_CMD_FUNC(kick); -SILC_SERVER_CMD_FUNC(ignore); SILC_SERVER_CMD_FUNC(ban); -SILC_SERVER_CMD_FUNC(close); -SILC_SERVER_CMD_FUNC(shutdown); +SILC_SERVER_CMD_FUNC(detach); +SILC_SERVER_CMD_FUNC(watch); SILC_SERVER_CMD_FUNC(silcoper); SILC_SERVER_CMD_FUNC(leave); SILC_SERVER_CMD_FUNC(users); SILC_SERVER_CMD_FUNC(getkey); +SILC_SERVER_CMD_FUNC(service); + +SILC_SERVER_CMD_FUNC(connect); +SILC_SERVER_CMD_FUNC(close); +SILC_SERVER_CMD_FUNC(shutdown); #endif