updates.
[silc.git] / lib / doc / command_reply_args.html
1 <big><b>Command Reply Arguments</b></big>
2
3 <br />&nbsp;<br />
4 The SILC Client Library 'command_reply client operation (which is part of the
5 <a href="silcclient-SilcClientOperations.html">
6 SilcClientOperation</a> callback functions) returns command replies
7 from the SILC Server for commands that the client has earlier sent to the
8 server.  The 'command_reply' client operation implementation has a variable
9 argument list to deliver <a href="silccommand-SilcCommand.html">SilcCommand</a>
10 specific arguments to the application.  This document describes these
11 arguments for all command replies to help SILC client software developers
12 to process them.
13
14 <br />&nbsp;<br />
15 <b>NOTE: </b>The following list of command reply arguments are sent when
16 the command was executed successfully.  If an error occurred, the
17 `command_reply' client operation's 'success' argument is FALSE, and the
18 'status' argument includes the error status.  In this case the arguments
19 returned are dependent of the 'status' argument.  See all
20 <a href="silcstatus_args.html">SilcStatus error arguments</a> for these
21 arguments.
22
23 <br />&nbsp;<br />&nbsp;<br />
24 <b>command_reply Client Library operation</b>
25
26 <br />&nbsp;<br />
27 The 'command_reply' client operation callback function prototype is as follows:
28
29 <br />&nbsp;<br />
30 <tt>
31 &nbsp;&nbsp;
32 void (*command_reply)(SilcClient client, SilcClientConnection conn,<br />
33 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
34 SilcCommandPayload cmd_payload, bool success, SilcCommand command,<br />
35 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
36 SilcStatus status, ...);
37 </tt>
38
39 <br />&nbsp;<br />
40 The first argument 'client' is the SILC Client Library context, the 'conn'
41 is the context for the connection to the remote server, the 'cmd_payload'
42 is the raw SilcCommandPayload and application usually ignores it, the
43 'success' boolean value indicates whether the earlier command was a success
44 or not, the 'command' is the command reply enumeration, and the 'status'
45 indicates the status of the command reply.  If 'success' is FALSE then
46 'status' includes error status (see <a href="silcstatus_args.html">SilcStatus
47 error arguments</a>).
48
49 <br />&nbsp;<br />
50 Rest of the arguments are 'command' specific and implementation should
51 handle them by the SilcCommand for example in a <tt>switch</tt> statement.
52 The commands are defined in lib/silccore/silccomand.h header file.  A short
53 example:
54
55 <br />&nbsp;<br />
56 <tt>
57 &nbsp;&nbsp;switch(type)<br />
58 &nbsp;&nbsp;&nbsp;&nbsp;{<br />
59 &nbsp;&nbsp;&nbsp;&nbsp;case SILC_COMMAND_WHOIS:<br />
60 &nbsp;&nbsp;&nbsp;&nbsp;...<br />
61 &nbsp;&nbsp;&nbsp;&nbsp;break;<br />
62 &nbsp;&nbsp;&nbsp;&nbsp;case SILC_COMMAND_WHOWAS:<br />
63 &nbsp;&nbsp;&nbsp;&nbsp;...<br />
64 &nbsp;&nbsp;&nbsp;&nbsp;break;<br />
65 &nbsp;&nbsp;&nbsp;&nbsp;case SILC_COMMAND_NICK:<br />
66 &nbsp;&nbsp;&nbsp;&nbsp;...<br />
67 &nbsp;&nbsp;&nbsp;&nbsp;break;<br />
68 &nbsp;&nbsp;&nbsp;&nbsp;...<br />
69 &nbsp;&nbsp;&nbsp;&nbsp;}
70 </tt>
71
72 <br />&nbsp;<br />&nbsp;<br />
73 <b>Arguments</b>
74
75 <br />&nbsp;<br />
76 The following table describes all commands and arguments that the client
77 library sends in the 'command_reply' client operation to the application.
78 By default all arguments that the library sends to application are valid
79 pointers.  However, it is possible that some pointers may be NULL.  If
80 this is the case it is separately mentioned that the argument may be NULL.
81 In this case application must ignore that argument.
82
83 <br />&nbsp;<br />
84 The 'command_reply' arguments for successful SilcCommand replies are as
85 follows:
86
87 <br />&nbsp;<br />
88 <table border="1" width="100%" cellpadding="3" cellspacing="0">
89
90 <tr>
91 <td><small>Name</td>
92 <td><small>Description</td>
93 <td width="50%"><small>Variable Arguments</td>
94 </tr>
95
96 <tr>
97 <td><small>SILC_COMMAND_WHOIS</td>
98 <td><small>
99 Returns information about user. The following pointers may be NULL: 'channels',
100 'fingerprint', 'channel_usermodes' and 'attrs'.  If 'fingerprint' is valid its
101 length is 20 bytes. If 'channels' is valid each entry in the list is
102 SilcChannelPayload.  If the `channel_usermodes' is valid then the table
103 has as many entries as there are entries in the `channels' list, and the
104 first entry in the table is the user mode on the first channel in the
105 `channels' list.  The `channel_usermodes' is the table of the user's modes
106 no the joined channels.  The 'attr' is the Requested Attributes that may
107 have been returned by the client and it can be parsed by traversing the
108 SilcDList and using silc_attribute_get_attribute function.  Each entry in
109 the list is SilcAttribute.
110 </td>
111 <td width="50%"><small>SilcClientEntry client_entry, char *nickname,
112 char *username, char *realname, SilcDList channels, SilcUInt32 usermode,
113 SilcUInt32 idletime, unsigned char *fingerprint, SilcUInt32 *channel_usermodes,
114 SilcDList attrs
115 </td>
116 </tr>
117
118 <tr>
119 <td><small>SILC_COMMAND_WHOWAS</td>
120 <td><small>
121 Returns history information about user. The 'client_entry' and 'realname'
122 may be NULL.
123 </td>
124 <td width="50%"><small>SilcClientEntry client_entry, char *nickname,
125 char *username, char *realname
126 </td>
127 </tr>
128
129 <tr>
130 <td><small>SILC_COMMAND_IDENTIFY</td>
131 <td><small>
132 Returns information about user, channel or server.  This is similar to
133 WHOIS command but does not return so much information and can be used to
134 get information about channels and servers too.  Application should ignore
135 this command reply.  The 'name' and 'info' may be NULL.
136 </td>
137 <td width="50%"><small>void *entry, char *name, char *info
138 </td>
139 </tr>
140
141 <tr>
142 <td><small>SILC_COMMAND_NICK</td>
143 <td><small>
144 Returns the new Client ID and new nickname inside the SilcClientEntry.
145 The `old_client_id' is the old Client ID used by the client before the
146 nickname was changed.  The `nickname' is the new nickname.
147 </td>
148 <td width="50%"><small>SilcClientEntry local_entry, char *nickname,
149 const SilcClientID *old_client_id
150 </td>
151 </tr>
152
153 <tr>
154 <td><small>SILC_COMMAND_LIST</td>
155 <td><small>
156 Returns the list of channel in the SILC network. Each call of command reply
157 returns one channel. This means that the command reply is called multiple
158 times to return list of channels.  The 'channel', 'channel_name' and
159 'channel_topic' may be NULL.  However, the 'channel' and 'channel_name'
160 are NULL only if there are no channels in the network.  In this case
161 this reply is called once with all arguments set to NULL.  Application
162 must be able to handle this situation correctly.
163 </td>
164 <td width="50%"><small>SilcChannelEntry channel, char *channel_name,
165 char *channel_topic, SilcUInt32 user_count
166 </td>
167 </tr>
168
169 <tr>
170 <td><small>SILC_COMMAND_TOPIC</td>
171 <td><small>
172 Returns the topic of the channel.
173 </td>
174 <td width="50%"><small>SilcChannelEntry channel, char *topic
175 </td>
176 </tr>
177
178 <tr>
179 <td><small>SILC_COMMAND_INVITE</td>
180 <td><small>
181 Returns the invite list of the channel.  Called also even if invite list
182 was not modified but SILC_COMMAND_INVITE command was used to invite a user
183 into a channel.  In this case the invite list is not returned by the
184 server and 'invite_list' is NULL.  The 'invite_list' is SilcArgumenPayload
185 which contains one or more arguments, each is one invite list entry.  The
186 entries can be retrieved with silc_argument_get_first_arg,
187 silc_argument_get_next_arg, silc_argument_get_arg_type and
188 silc_argument_get_decoded functions.
189 </td>
190 <td width="50%"><small>SilcChannelEntry channel,
191 SilcArgumentPayload invite_list
192 </td>
193 </tr>
194
195 <tr>
196 <td><small>SILC_COMMAND_KILL</td>
197 <td><small>
198 Called after killing a client.  Returns the client that was killed.
199 The `client_entry' may be NULL.  The `client_entry' will become invalid
200 after the command reply has returned from application.
201 </td>
202 <td width="50%"><small>SilcClientEntry client_entry
203 </td>
204 </tr>
205
206 <tr>
207 <td><small>SILC_COMMAND_INFO</td>
208 <td><small>
209 Returns information about the server user is connected to.
210 </td>
211 <td width="50%"><small>SilcServerEntry server, char *server_name,
212 char *server_info
213 </td>
214 </tr>
215
216 <tr>
217 <td><small>SILC_COMMAND_STATS</td>
218 <td><small>
219 Returns network statistics from the server.  The `stats' structure contains
220 the statistics returned by the server.
221 </td>
222 <td width="50%"><small>SilcClientStats *stats
223 </td>
224 </tr>
225
226 <tr>
227 <td><small>SILC_COMMAND_PING</td>
228 <td><small>
229 Returns reply to earlier ping.  There is no arguments to this reply.
230 </td>
231 <td width="50%"><small>none
232 </td>
233 </tr>
234
235 <tr>
236 <td><small>SILC_COMMAND_OPER</td>
237 <td><small>
238 Returns reply to earlier SILC_COMMAND_OPER command.  There is no arguments
239 to this reply.
240 </td>
241 <td width="50%"><small>none
242 </td>
243 </tr>
244
245 <tr>
246 <td><small>SILC_COMMAND_JOIN</td>
247 <td><small>
248 Reply received when user joined a channel.  The `channel_mode' contains
249 the current channel mode.  The `user_list' is the user list on the channel
250 and may be traversed with silc_hash_table_get function.  Each entry in the
251 `user_list' is SilcChannelUser structure, which contains the SilcClientEntry
252 and the client's mode on the channel.  The library will free the list.
253 The `topic' is the current topic on channel or NULL if no topic is set.
254 The `cipher' is the encryption algorithm used on channel or NULL if it is
255 not available.  The `hmac' is the HMAC algorithm used on channel or NULL if
256 it is not available.  The `founder_key' is the channel founder's public key
257 or NULL if founder public key has not been set.  The `channel_pubkeys' is
258 a list of channel public keys (for authentication on joining) or NULL if
259 they have not been set.  Each entry in the list is SilcArgumentDecodedList
260 each containing one channel public key.  The library will free the list.
261 </td>
262 <td width="50%"><small>char *channel_name, SilcChannelEntry channel,
263 SilcUInt32 channel_mode, SilcHashTableList *user_list, char *topic,
264 char *cipher, char *hmac, SilcPublicKey founder_key,
265 SilcDList channel_pubkeys, SilcUint32 user_limit
266 </td>
267 </tr>
268
269 <tr>
270 <td><small>SILC_COMMAND_MOTD</td>
271 <td><small>
272 Returns the Message of the Day from the server.  The 'motd' may be NULL.
273 </td>
274 <td width="50%"><small>char *motd
275 </td>
276 </tr>
277
278 <tr>
279 <td><small>SILC_COMMAND_UMODE</td>
280 <td><small>
281 Returns the user mode after changing it.
282 </td>
283 <td width="50%"><small>SilcUInt32 user_mode
284 </td>
285 </tr>
286
287 <tr>
288 <td><small>SILC_COMMAND_CMODE</td>
289 <td><small>
290 Returns channel's mode after changing it.  Optionally may also return
291 founder's public key when it was set.  It may also return the channel
292 public key list when the list was altered.  The 'founder_key' and
293 'channel_pubkeys' arguments may be NULL.  The 'channel_pubkeys' is a list
294 of SilcArgumentDecodedList contexts which each contain one channel public
295 key.  The library will automatically free the list.
296 </td>
297 <td width="50%"><small>SilcChannelEntry channel, SilcUInt32 mode,
298 SilcPublicKey founder_key, SilcDList channel_pubkeys, SilcUint32 user_limit
299 </td>
300 </tr>
301
302 <tr>
303 <td><small>SILC_COMMAND_CUMODE</td>
304 <td><small>
305 Returns user's mode on channel after changing it.
306 </td>
307 <td width="50%"><small>SilcUInt32 mode, SilcChannelEntry channel,
308 SilcClientEntry target_client
309 </td>
310 </tr>
311
312 <tr>
313 <td><small>SILC_COMMAND_KICK</td>
314 <td><small>
315 Called after kicking a client.  Returns the client that was kicked from
316 the 'channel'.
317 </td>
318 <td width="50%"><small>SilcChannelEntry channel, SilcClientEntry client_entry
319 </td>
320 </tr>
321
322 <tr>
323 <td><small>SILC_COMMAND_BAN</td>
324 <td><small>
325 Returns channel's ban list.  The 'ban_list' may be NULL.  The construction
326 of that list is equivalent to invite list.  See description of
327 SILC_COMMAND_INVITE command reply.
328 </td>
329 <td width="50%"><small>SilcChannelEntry channel, SilcArgumentPayload ban_list
330 </td>
331 </tr>
332
333 <tr>
334 <td><small>SILC_COMMAND_DETACH</td>
335 <td><small>
336 Called after being detached from the SILC network.  The command reply delivers
337 the detachment data buffer `detach_data' that the application should save
338 for example into a file.  The data will be needed when resuming back to
339 the network.  When resuming the data is saved into SilcClientConnectionParams
340 structure and given as argument to silc_client_connect_to_server or
341 silc_client_key_exchange functions.
342 </td>
343 <td width="50%"><small>SilcBuffer detach_data
344 </td>
345 </tr>
346
347 <tr>
348 <td><small>SILC_COMMAND_WATCH</td>
349 <td><small>
350 Called after modifying the watch list in the server.  There is no arguments
351 to this reply.
352 </td>
353 <td width="50%"><small>none
354 </td>
355 </tr>
356
357 <tr>
358 <td><small>SILC_COMMAND_SILCOPER</td>
359 <td><small>
360 Returns reply to earlier SILC_COMMAND_SILCOPER command.  There is no
361 arguments to this reply.
362 </td>
363 <td width="50%"><small>none
364 </td>
365 </tr>
366
367 <tr>
368 <td><small>SILC_COMMAND_LEAVE</td>
369 <td><small>
370 Called after leaving the channel.  Note that the `channel' will become
371 invalid after command_reply client operation returns.
372 </td>
373 <td width="50%"><small>SilcChannelEntry channel
374 </td>
375 </tr>
376
377 <tr>
378 <td><small>SILC_COMMAND_USERS</td>
379 <td><small>
380 Returns list of users in channel.  The `user_list' may be traversed with
381 silc_hash_table_get function.  Each entry in the `user_list' is
382 SilcChannelUser structure, which contains the SilcClientEntry and the
383 client's mode on the channel.
384 </td>
385 <td width="50%"><small>SilcChannelEntry channel, SilcHashTableList *user_list
386 </td>
387 </tr>
388
389 <tr>
390 <td><small>SILC_COMMAND_GETKEY</td>
391 <td><small>
392 Returns public key of client or server.  The 'public_key' may be NULL.
393 The 'entry_type' is used to check what type of pointer the entry' is.  For
394 SILC_ID_CLIENT SilcClientEntry and for SILC_ID_SERVER SilcServerEntry.
395 </td>
396 <td width="50%"><small>SilcIdType entry_type, void *entry,
397 SilcPublicKey public_key
398 </td>
399 </tr>
400
401 <tr>
402 <td><small>SILC_COMMAND_SERVICE</td>
403 <td><small>
404 Returns the service list in the server, or information on the accepted
405 and authenticated service.  The 'service_list' maybe NULL if server does
406 not support any services.  It is NULL also when 'name' is not NULL.  The
407 'service_list' is a comma separated list of services the server supports.
408 The 'name' MAY be NULL also.  The 'name' is the requested service, and it is
409 non-NULL only if server accepted and authenticated client's request.
410 </td>
411 <td width="50%"><small>const char *server_list, const char *service_name
412 </td>
413 </tr>
414
415 </table>
416
417 <br />&nbsp;<br />
418 SILC protocol defines some additional commands but command replies to
419 those commands are not delivered to the application.  Only the command
420 replies listed above are delivered to application.