5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 2000 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
23 * Revision 1.3 2000/07/05 06:14:01 priikone
24 * Global costemic changes.
26 * Revision 1.2 2000/07/03 05:52:22 priikone
27 * Implemented LEAVE command.
29 * Revision 1.1.1.1 2000/06/27 11:36:56 priikone
30 * Imported from internal CVS/Added Log headers.
35 #include "serverincludes.h"
36 #include "server_internal.h"
37 #include "command_reply.h"
39 /* Server command reply list. Not all commands have reply function as
40 they are never sent by server. More maybe added later if need appears. */
41 SilcServerCommandReply silc_command_reply_list[] =
43 SILC_SERVER_CMD_REPLY(join, JOIN),
48 /* Process received command reply. */
50 void silc_server_command_reply_process(SilcServer server,
51 SilcSocketConnection sock,
54 SilcServerCommandReplyContext ctx;
55 SilcCommandPayload payload;
57 /* Get command reply payload from packet */
58 payload = silc_command_parse_payload(buffer);
60 /* Silently ignore bad reply packet */
61 SILC_LOG_DEBUG(("Bad command reply packet"));
65 /* Allocate command reply context. This must be free'd by the
66 command reply routine receiving it. */
67 ctx = silc_calloc(1, sizeof(*ctx));
70 ctx->payload = payload;
72 /* Check for pending commands and mark to be exeucted */
73 SILC_SERVER_COMMAND_CHECK_PENDING(ctx);
75 /* Execute command reply */
76 SILC_SERVER_COMMAND_REPLY_EXEC(ctx);
79 /* Free command reply context and its internals. */
81 void silc_server_command_reply_free(SilcServerCommandReplyContext cmd)
84 silc_command_free_payload(cmd->payload);
89 /* Received reply for forwarded JOIN command. Router has created or joined
90 the client to the channel. We save some channel information locally
93 SILC_SERVER_CMD_REPLY_FUNC(join)
95 SilcServerCommandReplyContext cmd = (SilcServerCommandReplyContext)context;
96 SilcServer server = cmd->server;
97 SilcCommandStatus status;
99 SilcChannelList *entry;
100 unsigned char *id_string;
101 char *channel_name, *tmp;
103 #define LCC(x) server->local_list->channel_cache[(x) - 32]
104 #define LCCC(x) server->local_list->channel_cache_count[(x) - 32]
106 SILC_LOG_DEBUG(("Start"));
108 tmp = silc_command_get_arg_type(cmd->payload, 1, NULL);
109 SILC_GET16_MSB(status, tmp);
110 if (status != SILC_STATUS_OK)
113 /* Get channel name */
114 tmp = silc_command_get_arg_type(cmd->payload, 2, NULL);
119 id_string = silc_command_get_arg_type(cmd->payload, 3, NULL);
123 channel_name = strdup(tmp);
125 /* Add the channel to our local list. */
126 id = silc_id_str2id(id_string, SILC_ID_CHANNEL);
127 silc_idlist_add_channel(&server->local_list->channels, channel_name,
128 SILC_CHANNEL_MODE_NONE, id,
129 server->id_entry->router, NULL, &entry);
130 LCCC(channel_name[0]) = silc_idcache_add(&LCC(channel_name[0]),
131 LCCC(channel_name[0]),
132 channel_name, SILC_ID_CHANNEL,
133 (void *)id, (void *)entry);
134 entry->global_users = TRUE;
136 /* Execute pending JOIN command so that the client who originally
137 wanted to join the channel will be joined after all. */
138 SILC_SERVER_COMMAND_EXEC_PENDING(cmd, SILC_COMMAND_JOIN);
141 silc_server_command_reply_free(cmd);