X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fcommand.h;h=cd317f79e285c968bc042d6d09db49b4e19e0d27;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=1ced0891082df4ea576fa14e50edf7a0a3154f43;hpb=bb1973faaa81ead23b3d5e05b45cddd8a47d51f7;p=silc.git diff --git a/apps/silcd/command.h b/apps/silcd/command.h index 1ced0891..cd317f79 100644 --- a/apps/silcd/command.h +++ b/apps/silcd/command.h @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2000 Pekka Riikonen + Copyright (C) 1997 - 2001 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 @@ -54,24 +54,22 @@ typedef struct { SilcCommandPayload payload; SilcArgumentPayload args; SilcPacketContext *packet; - int pending; + int pending; /* Command is being re-processed when TRUE */ + int users; /* Reference counter */ } *SilcServerCommandContext; /* Structure holding pending commands. If command is pending it will be - executed after command reply has been received and executed. - Pending commands are used in cases where the original command request - had to be forwarded to router. After router replies the pending - command is re-executed. */ + executed after command reply has been received and executed. */ typedef struct SilcServerCommandPendingStruct { + SilcServer server; SilcCommand reply_cmd; - void *context; SilcCommandCb callback; - + void *context; + SilcUInt16 ident; struct SilcServerCommandPendingStruct *next; } SilcServerCommandPending; -/* List of pending commands */ -extern SilcServerCommandPending *silc_command_pending; +#include "command_reply.h" /* Macros */ @@ -79,45 +77,48 @@ extern SilcServerCommandPending *silc_command_pending; #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) - -/* Checks for pending commands */ -#define SILC_SERVER_COMMAND_CHECK_PENDING(ctx) \ -do { \ - if (silc_command_pending) { \ - SilcServerCommandPending *r; \ - SilcCommand cmd; \ - \ - cmd = silc_command_get(payload); \ - for (r = silc_command_pending; r; r = r->next) { \ - if (r->reply_cmd == cmd) { \ - ctx->context = r->context; \ - ctx->callback = r->callback; \ - break; \ - } \ - } \ - } \ -} while(0) - -/* Executed pending command */ -#define SILC_SERVER_COMMAND_EXEC_PENDING(ctx, cmd) \ -do { \ - if (ctx->callback) { \ - (*ctx->callback)(ctx->context); \ - silc_server_command_pending_del(cmd); \ - } \ +void silc_server_command_##func(void *context, void *context2) + +/* 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 { \ + 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); \ } while(0) /* Prototypes */ void silc_server_command_process(SilcServer server, SilcSocketConnection sock, SilcPacketContext *packet); -void silc_server_command_pending(SilcCommand reply_cmd, +SilcServerCommandContext silc_server_command_alloc(); +void silc_server_command_free(SilcServerCommandContext ctx); +SilcServerCommandContext +silc_server_command_dup(SilcServerCommandContext ctx); +bool silc_server_command_pending(SilcServer server, + SilcCommand reply_cmd, + SilcUInt16 ident, SilcCommandCb callback, void *context); -void silc_server_command_pending_del(SilcCommand reply_cmd); +void silc_server_command_pending_del(SilcServer server, + SilcCommand reply_cmd, + SilcUInt16 ident); +SilcServerCommandPendingCallbacks +silc_server_command_pending_check(SilcServer server, + SilcServerCommandReplyContext ctx, + SilcCommand command, + SilcUInt16 ident, + SilcUInt32 *callbacks_count); SILC_SERVER_CMD_FUNC(whois); SILC_SERVER_CMD_FUNC(whowas); SILC_SERVER_CMD_FUNC(identify); @@ -141,11 +142,12 @@ SILC_SERVER_CMD_FUNC(cmode); SILC_SERVER_CMD_FUNC(cumode); SILC_SERVER_CMD_FUNC(kick); SILC_SERVER_CMD_FUNC(ignore); -SILC_SERVER_CMD_FUNC(restart); +SILC_SERVER_CMD_FUNC(ban); SILC_SERVER_CMD_FUNC(close); -SILC_SERVER_CMD_FUNC(die); +SILC_SERVER_CMD_FUNC(shutdown); SILC_SERVER_CMD_FUNC(silcoper); SILC_SERVER_CMD_FUNC(leave); -SILC_SERVER_CMD_FUNC(names); +SILC_SERVER_CMD_FUNC(users); +SILC_SERVER_CMD_FUNC(getkey); #endif