Created SILC Crypto Toolkit git repository.
[crypto.git] / lib / silcclient / silcclient.h
diff --git a/lib/silcclient/silcclient.h b/lib/silcclient/silcclient.h
deleted file mode 100644 (file)
index 5e6c0d4..0000000
+++ /dev/null
@@ -1,2478 +0,0 @@
-/*
-
-  silcclient.h
-
-  Author: Pekka Riikonen <priikone@silcnet.org>
-
-  Copyright (C) 2000 - 2007 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; 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
-  GNU General Public License for more details.
-
-*/
-
-/****h* silcclient/Client Library Interface
- *
- * DESCRIPTION
- *
- * This interface defines the SILC Client Library API for the application.
- * The Client Library is a full featured SILC client without user interface.
- * A simple interface called SILC Client Operations (SilcClientOperations)
- * is provided for applications to implmeent the necessary functions to use
- * the client library.  The silcclient.h header file includes client library
- * API, such as command handling and message sending.  The silcclient_entry.h
- * header file includes entry handling, such as channel and user entry
- * handling.
- *
- * Practically all functions in the Client Library API accepts SilcClient
- * and SilcClientConnection as their first two argument.  The first argument
- * is the actual SilcClient context and the second is the SilcClientConnection
- * context of the connection in question.  Application may create and handle
- * multiple connections in one SilcClient.  Connections can be created to
- * servers and other clients.
- *
- * The Client Library support multiple threads and is threads safe if used
- * correctly.  Messages can be sent from multiple threads without any
- * locking.  Messages however are always received only in one thread unless
- * message waiting (see silc_client_private_message_wait as an example) is
- * used.  The threads can be turned on and off by giving a parameter to the
- * SilcClient.  When turned on, each new connection to remote host is always
- * executed in an own thread.  All tasks related to that connection are then
- * executed in that thread.  This means that client operation callbacks for
- * that connections may be called from threads and application will need to
- * employ concurrency control if the callbacks need to access shared data
- * in the application.  Messages are also received in that thread.
- *
- ***/
-
-#ifndef SILCCLIENT_H
-#define SILCCLIENT_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "client.h"
-#include "silcclient_entry.h"
-
-/* General definitions */
-
-/****d* silcclient/SilcClientAPI/SilcClientConnectionStatus
- *
- * NAME
- *
- *    typedef enum { ... } SilcClientConnectionStatus
- *
- * DESCRIPTION
- *
- *    This type is returned to the `connect' client operation to indicate
- *    the status of the created connection.  It can indicate if it was
- *    successful or whether an error occurred.
- *
- * SOURCE
- */
-typedef enum {
-  SILC_CLIENT_CONN_SUCCESS,           /* Successfully connected */
-  SILC_CLIENT_CONN_SUCCESS_RESUME,     /* Successfully connected and
-                                         resumed old detached session */
-  SILC_CLIENT_CONN_DISCONNECTED,       /* Remote host disconnected */
-  SILC_CLIENT_CONN_ERROR,             /* Error occurred during connecting */
-  SILC_CLIENT_CONN_ERROR_KE,          /* Key Exchange failed */
-  SILC_CLIENT_CONN_ERROR_AUTH,        /* Authentication failed */
-  SILC_CLIENT_CONN_ERROR_RESUME,       /* Resuming failed */
-  SILC_CLIENT_CONN_ERROR_TIMEOUT,      /* Timeout during connecting */
-} SilcClientConnectionStatus;
-/***/
-
-/****f* silcclient/SilcClientAPI/SilcClientRunning
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcClientRunning)(SilcClient client, void *context);
- *
- * DESCRIPTION
- *
- *    The callback given as argument to silc_client_init function.  Once
- *    this is called the client library is running and application may
- *    start using the Client library API.
- *
- ***/
-typedef void (*SilcClientRunning)(SilcClient client, void *context);
-
-/****f* silcclient/SilcClientAPI/SilcClientStopped
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcClientStopped)(SilcClient client, void *context);
- *
- * DESCRIPTION
- *
- *    The callback given as argument to silc_client_stop.  Once this is
- *    called the client library has stopped and can be freed by calling
- *    silc_client_free.  Note that this won't be called if there are
- *    active connections in the client.  Connections must first be closed
- *    by calling silc_client_close_connection or by sending QUIT command to
- *    the server connection.
- *
- ***/
-typedef void (*SilcClientStopped)(SilcClient client, void *context);
-
-/****f* silcclient/SilcClientAPI/SilcClientConnectCallback
- *
- * SYNOPSIS
- *
- *    void (*SilcClientConnectCallback)(SilcClient client,
- *                                      SilcClientConnection conn,
- *                                      SilcClientConnectionStatus status,
- *                                      SilcStatus error,
- *                                      const char *message,
- *                                      void *context);
- *
- * DESCRIPTION
- *
- *    Connect callbak given as argument to silc_client_connect_to_server,
- *    silc_client_connect_to_client and silc_client_key_exchange functions.
- *    It is called to indicate the status of the connection, indicated
- *    by the `status'.  It is called after the connection has been
- *    established to the remote host and when connection is disconnected
- *    by the remote host.  The `context' is the context given as argument
- *    to the connecting function.  If the `status' is an error the `error'
- *    may indicate more detailed error.  If `error' is SILC_STATUS_OK no
- *    detailed error message is available.
- *
- *    When the `status' is SILC_CLIENT_CONN_DISCONNECTED the `error' will
- *    indicate the reason for disconnection.  If the `message' is non-NULL
- *    it delivers error or disconnection message.
- *
- *    The `conn' is the connection to the remote host.  In case error
- *    occurred the `conn' may be NULL, however, in some cases a valid `conn'
- *    is returned even in error.  If `conn' is non-NULL the receiver is
- *    responsible of closing the connection with silc_client_close_connection
- *    function, except when SILC_CLINET_CONN_DISCONNECTED or some error
- *    was received.  In these cases the library will close the connection.
- *
- ***/
-typedef void (*SilcClientConnectCallback)(SilcClient client,
-                                         SilcClientConnection conn,
-                                         SilcClientConnectionStatus status,
-                                         SilcStatus error,
-                                         const char *message,
-                                         void *context);
-
-/****s* silcclient/SilcClientAPI/SilcClient
- *
- * NAME
- *
- *    typedef struct SilcClientStruct { ... } *SilcClient
- *
- * DESCRIPTION
- *
- *    This is the actual SILC Client structure which represents one
- *    SILC Client.  It is allocated with the silc_client_alloc function
- *    and given as argument to all SILC Client Library functions.  It
- *    is initialized with silc_client_init function, and freed with
- *    silc_client_free function.
- *
- *    This context represents the client.  Each connection to remote server
- *    is represented by SilcClientConnection context.
- *
- * SOURCE
- */
-struct SilcClientStruct {
-  char *username;               /* Username */
-  char *hostname;               /* hostname */
-  char *realname;               /* Real name */
-  SilcSchedule schedule;       /* Client scheduler */
-  SilcRng rng;                 /* Random number generator */
-  void *application;           /* Application specific context, set with
-                                  silc_client_alloc. */
-
-  /* Internal data for client library.  Application cannot access this. */
-  SilcClientInternal internal;
-};
-/***/
-
-/****s* silcclient/SilcClientAPI/SilcClientConnection
- *
- * NAME
- *
- *    typedef struct SilcClientConnectionStruct { ... }
- *                      *SilcClientConnection
- *
- * DESCRIPTION
- *
- *    This structure represents a connection.  It is allocated and freed by
- *    the library.  It is returned to application in SilcClientConnectCallback.
- *    It includes all the important data for the session such as local
- *    client entry (which includes current nickname), local and remote IDs,
- *    and other information.  All strings in the structure are UTF-8 encoded.
- *
- * SOURCE
- */
-struct SilcClientConnectionStruct {
-  SilcClientEntry local_entry;        /* Our own Client Entry */
-  SilcClientID *local_id;             /* Our current Client ID */
-
-  char *remote_host;                  /* Remote host name */
-  int remote_port;                    /* Remote port */
-  SilcID remote_id;                   /* Remote ID */
-
-  SilcChannelEntry current_channel;    /* Current joined channel */
-  SilcPublicKey public_key;           /* Public key used in this connection */
-  SilcPrivateKey private_key;         /* Private key */
-  SilcPacketStream stream;            /* Connection to remote host */
-  SilcConnectionType type;            /* Connection type */
-  SilcClientConnectCallback callback;  /* Connection callback */
-  void *callback_context;             /* Connection context */
-  SilcClient client;                  /* Pointer back to SilcClient */
-
-  /* Application specific data.  Application may set here whatever it wants. */
-  void *context;
-
-  /* Internal data for client library.  Application cannot access this. */
-  SilcClientConnectionInternal internal;
-};
-/***/
-
-/****s* silcclient/SilcClientAPI/SilcChannelUser
- *
- * NAME
- *
- *    typedef struct SilcChannelUserStruct { ... } *SilcChannelUser
- *
- * DESCRIPTION
- *
- *    This structure represents a client that has joined to a channel.
- *    It shows the client and the channel and the client's mode (channel
- *    user mode) on the channel.
- *
- * SOURCE
- */
-struct SilcChannelUserStruct {
-  SilcClientEntry client;                   /* Client joined on channel */
-  SilcUInt32 mode;                          /* mode, ChannelUserModes */
-  SilcChannelEntry channel;                 /* The channel user has joined */
-
-  /* Application specific data.  Application may set here whatever it wants. */
-  void *context;
-};
-/***/
-
-/****s* silcclient/SilcClientAPI/SilcClientStats
- *
- * NAME
- *
- *    typedef struct { ... } SilcClientStats;
- *
- * DESCRIPTION
- *
- *    This structure holds SILC network statistics returned by the
- *    SILC_COMMAND_STATS command reply to the application.
- *
- * SOURCE
- */
-typedef struct SilcClientStatsStruct {
-  SilcUInt32 starttime;                /* SILC server start time */
-  SilcUInt32 uptime;           /* SILC server uptime*/
-  SilcUInt32 my_clients;       /* Number of clients in the server */
-  SilcUInt32 my_channels;      /* Number of channel in the server */
-  SilcUInt32 my_server_ops;    /* Number of server operators in the server */
-  SilcUInt32 my_router_ops;    /* Number of router operators in the router */
-  SilcUInt32 cell_clients;     /* Number of clients in the cell */
-  SilcUInt32 cell_channels;    /* Number of channels in the cell */
-  SilcUInt32 cell_servers;     /* Number of server in the cell */
-  SilcUInt32 clients;          /* All clients in SILC network */
-  SilcUInt32 channels;         /* All channels in SILC network */
-  SilcUInt32 servers;          /* All servers in SILC network */
-  SilcUInt32 routers;          /* All routers in SILC network */
-  SilcUInt32 server_ops;       /* All server operators in SILC network */
-  SilcUInt32 router_ops;       /* All router operators in SILC network */
-} SilcClientStats;
-/***/
-
-/****d* silcclient/SilcClientAPI/SilcKeyAgreementStatus
- *
- * NAME
- *
- *    typedef enum { ... } SilcKeyAgreementStatus;
- *
- * DESCRIPTION
- *
- *    Key agreement status types indicating the status of the key
- *    agreement protocol.  These types are returned to the application
- *    in the SilcKeyAgreementCallback callback function.
- *
- * SOURCE
- */
-typedef enum {
-  SILC_KEY_AGREEMENT_OK,              /* Everything is Ok */
-  SILC_KEY_AGREEMENT_ERROR,           /* Unknown error occurred */
-  SILC_KEY_AGREEMENT_FAILURE,         /* The protocol failed */
-  SILC_KEY_AGREEMENT_TIMEOUT,         /* The protocol timeout */
-  SILC_KEY_AGREEMENT_ABORTED,         /* The protocol aborted */
-  SILC_KEY_AGREEMENT_ALREADY_STARTED,  /* Already started */
-  SILC_KEY_AGREEMENT_SELF_DENIED,      /* Negotiationg with itself denied */
-  SILC_KEY_AGREEMENT_NO_MEMORY,        /* System out of memory */
-} SilcKeyAgreementStatus;
-/***/
-
-/****f* silcclient/SilcClientAPI/SilcKeyAgreementCallback
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcKeyAgreementCallback)(SilcClient client,
- *                                             SilcClientConnection conn,
- *                                             SilcClientEntry client_entry,
- *                                             SilcKeyAgreementStatus status,
- *                                             SilcSKEKeyMaterial *key,
- *                                             void *context);
- *
- * DESCRIPTION
- *
- *    Key agreement callback that is called after the key agreement protocol
- *    has been performed. This is called also if error occurred during the
- *    key agreement protocol. The `key' is the allocated key material and
- *    the caller is responsible of freeing it. The `key' is NULL if error
- *    has occurred. The application can freely use the `key' to whatever
- *    purpose it needs. See lib/silcske/silcske.h for the definition of
- *    the SilcSKEKeyMaterial structure.
- *
- ***/
-typedef void (*SilcKeyAgreementCallback)(SilcClient client,
-                                        SilcClientConnection conn,
-                                        SilcClientEntry client_entry,
-                                        SilcKeyAgreementStatus status,
-                                        SilcSKEKeyMaterial key,
-                                        void *context);
-
-/****s* silcclient/SilcClientAPI/SilcPrivateMessageKeys
- *
- * NAME
- *
- *    typedef struct { ... } SilcPrivateMessageKeys;
- *
- * DESCRIPTION
- *
- *    Structure to hold the list of private message keys. The list of these
- *    structures is returned by the silc_client_list_private_message_keys
- *    function.
- *
- * SOURCE
- */
-typedef struct SilcPrivateMessageKeysStruct {
-  SilcClientEntry client_entry;       /* The remote client entry */
-  char *cipher;                              /* The cipher name */
-  unsigned char *key;                /* The original key, If the appliation
-                                        provided it. This is NULL if
-                                        the SKE key material was used. */
-  SilcUInt32 key_len;                /* The key length */
-} *SilcPrivateMessageKeys;
-/***/
-
-/****s* silcclient/SilcClientAPI/SilcChannelPrivateKey
- *
- * NAME
- *
- *    typedef struct SilcChannelPrivateKeyStruct { ... }
- *                      *SilcChannelPrivateKey;
- *
- * DESCRIPTION
- *
- *    Structure to hold one channel private key. The array of this structure
- *    is returned by silc_client_list_channel_private_keys function.
- *
- * SOURCE
- */
-struct SilcChannelPrivateKeyStruct {
-  char *name;                        /* Application given name */
-  SilcCipher send_key;               /* The cipher and key */
-  SilcCipher receive_key;            /* The cipher and key */
-  SilcHmac hmac;                     /* The HMAC and hmac key */
-};
-/***/
-
-/****f* silcclient/SilcClientAPI/SilcAskPassphrase
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcAskPassphrase)(const unsigned char *passphrase,
- *                                     SilcUInt32 passphrase_len,
- *                                     void *context);
- *
- * DESCRIPTION
- *
- *    Ask passphrase callback. This is called by the application when the
- *    library calls `ask_passphrase' client operation.  The callback delivers
- *    the passphrase to the library.  The passphrases in SILC protocol
- *    MUST be in UTF-8 encoding, therefore the `passphrase' SHOULD be UTF-8
- *    encoded, and if it is not then library will attempt to encode it.
- *
- ***/
-typedef void (*SilcAskPassphrase)(const unsigned char *passphrase,
-                                 SilcUInt32 passphrase_len,
-                                 void *context);
-
-/****f* silcclient/SilcClientAPI/SilcVerifyPublicKey
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcVerifyPublicKey)(SilcBool success, void *context);
- *
- * DESCRIPTION
- *
- *    Public key (or certificate) verification callback. This is called
- *    by the application to indicate that the public key verification was
- *    either success or failure.
- *
- ***/
-typedef void (*SilcVerifyPublicKey)(SilcBool success, void *context);
-
-/****f* silcclient/SilcClientAPI/SilcGetAuthMeth
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcGetAuthMeth)(SilcAuthMethod auth_meth,
- *                                    const void *auth, SilcUInt32 auth_len,
- *                                    void *context);
- *
- * DESCRIPTION
- *
- *    Authentication data resolving callback. This is called by the
- *    application to return the resolved authentication data. The client
- *    library has called the get_auth_method client operation and given
- *    this function pointer as argument. The `auth_meth' is the selected
- *    authentication method. The `auth_data' and the `auth_data_len'
- *    are the resolved authentication data. The `context' is the libary's
- *    context sent to the get_auth_method client operation.
- *
- *    If the `auth_method' is SILC_AUTH_PASSWORD then `auth' and `auth_len'
- *    is the passphrase and its length.  If it is SILC_AUTH_PUBLIC_KEY the
- *    `auth' must be NULL.  The library will use the private key given as
- *    argument to silc_client_connect_to_server, silc_client_connect_to_client
- *    or silc_client_key_exchange.  If it is SILC_AUTH_NONE, both `auth' and
- *    `auth_len' are ignored.
- *
- ***/
-typedef void (*SilcGetAuthMeth)(SilcAuthMethod auth_meth,
-                               const void *auth, SilcUInt32 auth_len,
-                               void *context);
-
-/****d* silcclient/SilcClientAPI/SilcClientMessageType
- *
- * NAME
- *
- *    typedef enum { ... } SilcClientMessageType;
- *
- * DESCRIPTION
- *
- *    Different message types for `say' client operation.  The application
- *    may filter the message sent by the library according this type.
- *
- * SOURCE
- */
-typedef enum {
-  SILC_CLIENT_MESSAGE_INFO,           /* Informational */
-  SILC_CLIENT_MESSAGE_WARNING,        /* Warning */
-  SILC_CLIENT_MESSAGE_ERROR,          /* Error */
-  SILC_CLIENT_MESSAGE_COMMAND_ERROR,   /* Error during command */
-  SILC_CLIENT_MESSAGE_AUDIT,          /* Auditable */
-} SilcClientMessageType;
-/***/
-
-/****s* silcclient/SilcClientAPI/SilcClientOperations
- *
- * NAME
- *
- *    typedef struct { ... } SilcClientOperations;
- *
- * DESCRIPTION
- *
- *    SILC Client Operations. These must be implemented by the application.
- *    The Client library may call any of these routines at any time.  The
- *    routines are used to deliver certain information to the application
- *    or from the application to the client library.
- *
- * SOURCE
- */
-typedef struct SilcClientOperationsStruct {
-  /* Message sent to the application by library. `conn' associates the
-     message to a specific connection.  `conn', however, may be NULL.
-     The `type' indicates the type of the message sent by the library.
-     The application can for example filter the message according the
-     type.  The variable argument list is arguments to the formatted
-     message that `msg' may be. */
-  void (*say)(SilcClient client, SilcClientConnection conn,
-             SilcClientMessageType type, char *msg, ...);
-
-  /* Message for a channel. The `sender' is the sender of the message
-     The `channel' is the channel. The `message' is the message.  Note
-     that `message' maybe NULL.  The `flags' indicates message flags
-     and it is used to determine how the message can be interpreted
-     (like it may tell the message is multimedia message).  The `payload'
-     may be used to retrieve all the details of the message. */
-  void (*channel_message)(SilcClient client, SilcClientConnection conn,
-                         SilcClientEntry sender, SilcChannelEntry channel,
-                         SilcMessagePayload payload,
-                         SilcChannelPrivateKey key, SilcMessageFlags flags,
-                         const unsigned char *message,
-                         SilcUInt32 message_len);
-
-  /* Private message to the client. The `sender' is the sender of the
-     message. The message is `message'and maybe NULL.  The `flags'
-     indicates message flags  and it is used to determine how the message
-     can be interpreted (like it may tell the message is multimedia
-     message).  The `payload' may be used to retrieve all the details of
-     the message. */
-  void (*private_message)(SilcClient client, SilcClientConnection conn,
-                         SilcClientEntry sender, SilcMessagePayload payload,
-                         SilcMessageFlags flags, const unsigned char *message,
-                         SilcUInt32 message_len);
-
-  /* Notify message to the client.  The arguments are notify `type' specific.
-     See separate documentation in the Toolkit Reference Manual for the notify
-     arguments. */
-  void (*notify)(SilcClient client, SilcClientConnection conn,
-                SilcNotifyType type, ...);
-
-  /* Command handler. This function is called always after application has
-     called a command.  It will be called to indicate that the command
-     was processed.  It will also be called if error occurs while processing
-     the command.  The `success' indicates whether the command was sent
-     or if error occurred.  The `status' indicates the actual error.
-     The `argc' and `argv' are the command line arguments sent to the
-     command by application.  Note that, this is not reply to the command
-     from server, this is merely and indication to application that the
-     command was processed. */
-  void (*command)(SilcClient client, SilcClientConnection conn,
-                 SilcBool success, SilcCommand command, SilcStatus status,
-                 SilcUInt32 argc, unsigned char **argv);
-
-  /* Command reply handler.  Delivers a reply to command that was sent
-     earlier.  The `conn' is the associated client connection.  The `command'
-     indicates the command reply type.  If the `status' other than
-     SILC_STATUS_OK an error occurred.  In this case the `error' will indicate
-     the error.  It is possible to receive list of command replies and list
-     of errors.  In this case the `status' will indicate it is an list entry
-     (the `status' is SILC_STATUS_LIST_START, SILC_STATUS_LIST_ITEM and/or
-     SILC_STATUS_LIST_END).
-
-     The arguments received in `ap' are command specific.  See a separate
-     documentation in the Toolkit Reference Manual for the command reply
-     arguments. */
-  void (*command_reply)(SilcClient client, SilcClientConnection conn,
-                       SilcCommand command, SilcStatus status,
-                       SilcStatus error, va_list ap);
-
-  /* Find authentication method and authentication data by hostname and
-     port. The hostname may be IP address as well. The `auth_method' is
-     the authentication method the remote connection requires.  It is
-     however possible that remote accepts also some other authentication
-     method.  Application should use the method that may have been
-     configured for this connection.  If none has been configured it should
-     use the required `auth_method'.  If the `auth_method' is
-     SILC_AUTH_NONE, server does not require any authentication or the
-     required authentication method is not known.  The `completion'
-     callback must be called to deliver the chosen authentication method
-     and data. The `conn' may be NULL. */
-  void (*get_auth_method)(SilcClient client, SilcClientConnection conn,
-                         char *hostname, SilcUInt16 port,
-                         SilcAuthMethod auth_method,
-                         SilcGetAuthMeth completion, void *context);
-
-  /* Called to verify received public key. The `conn_type' indicates which
-     entity (server or client) has sent the public key. If user decides to
-     trust the key the application may save the key as trusted public key for
-     later use. The `completion' must be called after the public key has
-     been verified. */
-  void (*verify_public_key)(SilcClient client, SilcClientConnection conn,
-                           SilcConnectionType conn_type,
-                           SilcPublicKey public_key,
-                           SilcVerifyPublicKey completion, void *context);
-
-  /* Ask from end user a passphrase or a password. The passphrase is
-     returned to the library by calling the `completion' callback with
-     the `context'. The returned passphrase SHOULD be in UTF-8 encoded,
-     if not then the library will attempt to encode. */
-  void (*ask_passphrase)(SilcClient client, SilcClientConnection conn,
-                        SilcAskPassphrase completion, void *context);
-
-  /* Called to indicate that incoming key agreement request has been
-     received.  If the application wants to perform key agreement it may
-     call silc_client_perform_key_agreement to initiate key agreement or
-     silc_client_send_key_agreement to provide connection point to the
-     remote client in case the `hostname' is NULL.  If key agreement is
-     not desired this request can be ignored.  The `protocol' is either
-     value 0 for TCP or value 1 for UDP. */
-  void (*key_agreement)(SilcClient client, SilcClientConnection conn,
-                       SilcClientEntry client_entry,
-                       const char *hostname, SilcUInt16 protocol,
-                       SilcUInt16 port);
-
-  /* Notifies application that file transfer protocol session is being
-     requested by the remote client indicated by the `client_entry' from
-     the `hostname' and `port'. The `session_id' is the file transfer
-     session and it can be used to either accept or reject the file
-     transfer request, by calling the silc_client_file_receive or
-     silc_client_file_close, respectively. */
-  void (*ftp)(SilcClient client, SilcClientConnection conn,
-             SilcClientEntry client_entry, SilcUInt32 session_id,
-             const char *hostname, SilcUInt16 port);
-} SilcClientOperations;
-/***/
-
-/****s* silcclient/SilcClientAPI/SilcClientParams
- *
- * NAME
- *
- *    typedef struct { ... } SilcClientParams;
- *
- * DESCRIPTION
- *
- *    Client parameters. This can be filled with proper values and
- *    given as argument to the silc_client_alloc function. The structure
- *    hold various parameters which affects the function of the client.
- *
- * SOURCE
- */
-typedef struct SilcClientParamsStruct {
-  /* If this boolean is set to TRUE then the client library will use
-     threads.  Any of the callback functions in the SilcClientOperations
-     and other callbacks may be called at any time in a thread.  The
-     application may need to employ appropriate concurrency control
-     in the callbacks to protect application specific data. */
-  SilcBool threads;
-
-  /* Nickname format string. This can be used to order the client library
-     to save the nicknames in the library in a certain format. Since
-     nicknames are not unique in SILC it is possible to have multiple same
-     nicknames. Using this format string it is possible to order the library
-     to separate the multiple same nicknames from each other. If this is
-     empty then default format is used which is the default nickname
-     without anything else. The string MUST be NULL terminated.
-
-     Following format types are available:
-
-     %n  nickname      - the real nickname returned by the server (mandatory)
-     %a  number        - ascending number in case there are several
-                         same nicknames (fe. nick#2 and nick#3)
-     %h  hostname      - the stripped hostname of the client
-     %H  full hostname - the full hostname of the client
-
-     Example format strings: "%n#%a"     (fe. nick#2, nick#3)
-                             "%n#%h%a"   (fe. nick#host, nick#host2)
-                             "%a!%n#%h"  (fe. nick#host, 2!nick#host)
-
-     Note that there must always be some separator characters around '%n'
-     format.  It is not possible to put format characters before or after
-     '%n' without separators (such ash '#').  Also note that the separator
-     character should be a character that cannot be part of normal nickname.
-     Note that, using '@' as a separator is not recommended as the nickname
-     string may contain it to separate a server name from the nickname (eg.
-     nickname@silcnet.org).
-  */
-  char nickname_format[32];
-
-  /* If this is set to TRUE then the `nickname_format' is employed to all
-     saved nicknames even if there are no multiple same nicknames in the
-     cache. By default this is FALSE, which means that the `nickname_format'
-     is employed only if the library will receive a nickname that is
-     already saved in the cache. It is recommended to leave this to FALSE
-     value. */
-  SilcBool nickname_force_format;
-
-  /* If this is set to TRUE then all nickname strings returned by the library
-     and stored by the library are in the format of 'nickname@server', eg.
-     nickname@silcnet.org.  If this is FALSE then the server name of the
-     nickname is available only from the SilcClientEntry structure.  When this
-     is TRUE the server name is still parsed to SilcClientEntry. */
-  SilcBool full_nicknames;
-
-  /* If this is set to TRUE then all channel name strings returned by the
-     library and stored by the library are in the format of 'channel@server',
-     eg. silc@silcnet.org.  If this is FALSE then the server name of the
-     channel is available only from the SilcChannelEntry structure.  When this
-     is TRUE the server name is still parsed to SilcChannelEntry.  Note that,
-     not all SILC server versions return such channel name strings. */
-  SilcBool full_channel_names;
-
-  /* If this is set to TRUE, the silcclient library will not initialize
-     or uninitialize the SILC Crypto Toolkit.  The application will have
-     to do that itself by calling silc_crypto_init and silc_crypto_uninit. */
-  SilcBool dont_register_crypto_library;
-
-} SilcClientParams;
-/***/
-
-
-/* Initialization functions (client.c) */
-
-/****f* silcclient/SilcClientAPI/silc_client_alloc
- *
- * SYNOPSIS
- *
- *    SilcClient silc_client_alloc(SilcClientOperations *ops,
- *                                 SilcClientParams *params,
- *                                 void *application,
- *                                 const char *silc_version);
- *
- * DESCRIPTION
- *
- *    Allocates new client object. This has to be done before client may
- *    work. After calling this one must call silc_client_init to initialize
- *    the client. The `application' is application specific user data pointer
- *    and caller must free it. The `silc_version' is the application version
- *    that will be used to compare against remote host's (usually a server)
- *    version string.  The `application' context is accessible by the
- *    application by client->application, client being SilcClient.
- *
- ***/
-SilcClient silc_client_alloc(SilcClientOperations *ops,
-                            SilcClientParams *params,
-                            void *application,
-                            const char *version_string);
-
-/****f* silcclient/SilcClientAPI/silc_client_free
- *
- * SYNOPSIS
- *
- *    void silc_client_free(SilcClient client);
- *
- * DESCRIPTION
- *
- *    Frees client object and its internals.  The execution of the client
- *    should be stopped with silc_client_stop function before calling
- *    this function.
- *
- ***/
-void silc_client_free(SilcClient client);
-
-/****f* silcclient/SilcClientAPI/silc_client_init
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_init(SilcClient client, const char *username,
- *                              const char *hostname, const char *realname,
- *                              SilcClientRunning running, void *context);
- *
- * DESCRIPTION
- *
- *    Initializes the client. This makes all the necessary steps to make
- *    the client ready to be run. One must call silc_client_run to run the
- *    client. Returns FALSE if error occurred, TRUE otherwise.
- *
- *    The `username' and `hostname' strings must be given and they must be
- *    UTF-8 encoded.  The `username' is the client's username in the
- *    operating system, `hostname' is the client's host name and the
- *    `realname' is the user's real name.
- *
- *    The `running' callback with `context' is called after the client is
- *    running after silc_client_run or silc_client_run_one has been called.
- *    Application may start using the Client library API after that.  Setting
- *    the callback is optional, but highly recommended.
- *
- ***/
-SilcBool silc_client_init(SilcClient client, const char *username,
-                         const char *hostname, const char *realname,
-                         SilcClientRunning running, void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_run
- *
- * SYNOPSIS
- *
- *    void silc_client_run(SilcClient client);
- *
- * DESCRIPTION
- *
- *    Runs the client.  This starts the scheduler from the utility library.
- *    When this functions returns the execution of the application is over.
- *    The client must be initialized before calling this.
- *
- ***/
-void silc_client_run(SilcClient client);
-
-/****f* silcclient/SilcClientAPI/silc_client_run_one
- *
- * SYNOPSIS
- *
- *    void silc_client_run_one(SilcClient client);
- *
- * DESCRIPTION
- *
- *    Runs the client and returns immeadiately. This function is used when
- *    the SILC Client object indicated by the `client' is run under some
- *    other scheduler, or event loop or main loop.  On GUI applications,
- *    for example this may be desired to used to run the client under the
- *    GUI application's main loop.  Typically the GUI application would
- *    register an idle task that calls this function multiple times in
- *    a second to quickly process the SILC specific data.
- *
- ***/
-void silc_client_run_one(SilcClient client);
-
-/****f* silcclient/SilcClientAPI/silc_client_stop
- *
- * SYNOPSIS
- *
- *    void silc_client_stop(SilcClient client, SilcClientStopped stopped,
- *                          void *context);
- *
- * DESCRIPTION
- *
- *    Stops the client. This is called to stop the client and thus to stop
- *    the program.  The client context must be freed with the silc_client_free
- *    function.  All connections that exist in this client must be closed
- *    before calling this function.  Connections can be closed by calling
- *    silc_client_close_connection.
- *
- *    The `stopped' will be called once the client and all connections have
- *    finished.  The client may be freed after that.  Note that the `stopped'
- *    won't be called before all connections have finished.  Setting the
- *    callback is optional.
- *
- ***/
-void silc_client_stop(SilcClient client, SilcClientStopped stopped,
-                     void *context);
-
-/* Connecting functions */
-
-/****s* silcclient/SilcClientAPI/SilcClientConnectionParams
- *
- * NAME
- *
- *    typedef struct { ... } SilcClientConnectionParams;
- *
- * DESCRIPTION
- *
- *    Client connection parameters.  This can be filled by the application
- *    and given as argument to silc_client_connect_to_server,
- *    silc_client_connect_to_client, silc_client_key_exchange or
- *    silc_client_send_key_agreement.
- *
- * SOURCE
- */
-typedef struct SilcClientConnectionParamsStruct {
-  /* If this is provided the user's nickname in the network will be the
-     string given here.  If it is given, it must be UTF-8 encoded.  If this
-     string is not given, the user's username by default is used as nickname.
-     The nickname may later be changed by using NICK command.  The maximum
-     length for the nickname string is 128 bytes. */
-  char *nickname;
-
-  /* If this key repository pointer is non-NULL then public key received in
-     the key exchange protocol will be verified from this repository.  If
-     this is not provided then the `verify_public_key' client operation will
-     be called back to application.  If the boolean `verify_notfound' is set
-     to TRUE then the `verify_public_key' client operation will be called
-     in case the public key is not found in `repository'.  Only public keys
-     added with at least SILC_SKR_USAGE_KEY_AGREEMENT in the repository will
-     be checked, other keys will be ignored. */
-  SilcSKR repository;
-  SilcBool verify_notfound;
-
-  /* Authentication data.  Application may set here the authentication data
-     and authentication method to be used in connecting.  If `auth_set'
-     boolean is TRUE then authentication data is provided by application.
-     If the authentication method is public key authentication then the key
-     pair given as argument when connecting will be used and `auth' field
-     is NULL.  If it is passphrase authentication, it can be provided in
-     `auth' and `auth_len' fields.  If `auth_set' is FALSE
-     the `get_auth_method' client operation will be called to get the
-     authentication method and data from application. */
-  SilcBool auth_set;
-  SilcAuthMethod auth_method;
-  void *auth;
-  SilcUInt32 auth_len;
-
-  /* If this boolean is set to TRUE then the connection will use UDP instead
-     of TCP.  If UDP is set then also the next `local_ip' and `local_port'
-     must be set. */
-  SilcBool udp;
-
-  /* The `local_ip' specifies the local IP address used with the connection.
-     It must be non-NULL if `udp' boolean is TRUE.  If the `local_port' is
-     non-zero it will be used as local port with UDP connection.  The remote
-     host will also send packets to the specified address and port.  If the
-     `bind_ip' is non-NULL a listener is bound to that address instead of
-     `local_ip'. */
-  char *local_ip;
-  char *bind_ip;
-  int local_port;
-
-  /* If this boolean is set to TRUE then the key exchange is done with
-     perfect forward secrecy. */
-  SilcBool pfs;
-
-  /* If this boolean is set to TRUE then connection authentication protocol
-     is not performed during connecting.  Only key exchange protocol is
-     performed.  This usually must be set to TRUE when connecting to another
-     client, but must be FALSE with server connections. */
-  SilcBool no_authentication;
-
-  /* The SILC session detachment data that was returned in the `command_reply'
-     client operation for SILC_COMMAND_DETACH command.  If this is provided
-     here the client library will attempt to resume the session in the network.
-     After the connection is created and the session has been resumed the
-     client will receive SILC_COMMAND_NICK command_reply for the client's
-     nickname in the network and SILC_COMMAND_JOIN command reply for all the
-     channels that the client has joined in the network.  It may also receive
-     SILC_COMMAND_UMODE command reply to set user's mode on the network. */
-  unsigned char *detach_data;
-  SilcUInt32 detach_data_len;
-
-  /* Connection timeout.  If non-zero, the connection will timeout unless
-     the SILC connection is completed in the specified amount of time. */
-  SilcUInt32 timeout_secs;
-
-  /* Rekey timeout in seconds.  The client will perform rekey in this
-     time interval.  If set to zero, the default value will be used
-     (3600 seconds, 1 hour). */
-  SilcUInt32 rekey_secs;
-
-  /* If this is set to TRUE then the client will ignore all incoming
-     Requested Attributes queries and does not reply anything back.  This
-     usually leads into situation where server does not anymore send
-     the queries after seeing that client does not reply anything back.
-     If your application does not support Requested Attributes or you do
-     not want to use them set this to TRUE.  See SilcAttribute and
-     silc_client_attribute_add for more information on attributes. */
-  SilcBool ignore_requested_attributes;
-
-} SilcClientConnectionParams;
-/***/
-
-/****f* silcclient/SilcClientAPI/silc_client_connect_to_server
- *
- * SYNOPSIS
- *
- *    SilcAsyncOperation
- *    silc_client_connect_to_server(SilcClient client,
- *                                  SilcClientConnectionParams *params,
- *                                  SilcPublicKey public_key,
- *                                  SilcPrivateKey private_key,
- *                                  char *remote_host, int port,
- *                                  SilcClientConnectCallback callback,
- *                                  void *context);
- *
- * DESCRIPTION
- *
- *    Connects to remote server `remote_host' at port `port'.  This function
- *    can be used to create connection to remote SILC server and start
- *    SILC session in the SILC network.  The `params' may be provided
- *    to provide various connection parameters.  The `public_key' and the
- *    `private_key' is your identity used in this connection.  When
- *    authentication method is based on digital signatures, this key pair
- *    will be used.  The `callback' with `context' will be called after the
- *    connection has been created.  It will also be called later when remote
- *    host disconnects.
- *
- *    If application wishes to create the network connection itself, use
- *    the silc_client_key_exchange after creating the connection to start
- *    key exchange and authentication with the server.
- *
- *    Returns SilcAsyncOperation which can be used to cancel the connecting,
- *    or NULL on error.  Note that the returned pointer becomes invalid
- *    after the `callback' is called.
- *
- ***/
-SilcAsyncOperation
-silc_client_connect_to_server(SilcClient client,
-                             SilcClientConnectionParams *params,
-                             SilcPublicKey public_key,
-                             SilcPrivateKey private_key,
-                             char *remote_host, int port,
-                             SilcClientConnectCallback callback,
-                             void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_connect_to_client
- *
- * SYNOPSIS
- *
- *    SilcAsyncOperation
- *    silc_client_connect_to_client(SilcClient client,
- *                                  SilcClientConnectionParams *params,
- *                                  SilcPublicKey public_key,
- *                                  SilcPrivateKey private_key,
- *                                  char *remote_host, int port,
- *                                  SilcClientConnectCallback callback,
- *                                  void *context);
- *
- * DESCRIPTION
- *
- *    Connects to remote client `remote_host' at port `port'.  This function
- *    can be used to create peer-to-peer connection to another SILC client,
- *    for example, for direct conferencing, or file transfer or for other
- *    purposes.  The `params' may be provided to provide various connection
- *    parameters.  The `public_key' and the `private_key' is your identity
- *    used in this connection.  The `callback' with `context' will be called
- *    after the connection has been created.  It will also be called later
- *    when remote host disconnects.
- *
- *    If application wishes to create the network connection itself, use
- *    the silc_client_key_exchange after creating the connection to start
- *    key exchange with the client.
- *
- *    Returns SilcAsyncOperation which can be used to cancel the connecting,
- *    or NULL on error.  Note that the returned pointer becomes invalid
- *    after the `callback' is called.
- *
- ***/
-SilcAsyncOperation
-silc_client_connect_to_client(SilcClient client,
-                             SilcClientConnectionParams *params,
-                             SilcPublicKey public_key,
-                             SilcPrivateKey private_key,
-                             char *remote_host, int port,
-                             SilcClientConnectCallback callback,
-                             void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_key_exchange
- *
- * SYNOPSIS
- *
- *    SilcAsyncOperation
- *    silc_client_key_exchange(SilcClient client,
- *                             SilcClientConnectionParams *params,
- *                             SilcPublicKey public_key,
- *                             SilcPrivateKey private_key,
- *                             SilcStream stream,
- *                             SilcConnectionType conn_type,
- *                             SilcClientConnectCallback callback,
- *                             void *context);
- *
- * DESCRIPTION
- *
- *    Starts key exchange protocol and authentication protocol in the
- *    connection indicated by `stream'.  This function can be be used to
- *    start SILC session with remote host (usually server) when the caller
- *    has itself created the connection, instead of calling the function
- *    silc_client_connect_to_server or silc_client_connect_to_client.  If
- *    one of those functions was used this function must not be called as
- *    in that case the key exchange is performed automatically.
- *
- *    Use this function only if you have created the connection by yourself.
- *    After creating the connection the socket must be wrapped into a
- *    socket stream.  See silcsocketstream.h for more information.  Note that
- *    the `stream' must have valid remote IP address (and optionally also
- *    hostname) and port set.
- *
- *    The `params' may be provided to provide various connection parameters.
- *    The `public_key' and the `private_key' is your identity used in this
- *    session.  The `callback' with `context' will be called after the session
- *    has been set up.  It will also be called later when remote host
- *    disconnects.  The `conn_type' is the type of session this is going to
- *    be.  If the remote is SILC server it is SILC_CONN_SERVER or if it is
- *    SILC client it is SILC_CONN_CLIENT.
- *
- *    Returns SilcAsyncOperation which can be used to cancel the connecting,
- *    or NULL on error.  Note that the returned pointer becomes invalid
- *    after the `callback' is called.
- *
- * EXAMPLE
- *
- *    int sock;
- *
- *    // Create remote connection stream.  Resolve hostname and IP also.
- *    sock = create_connection(remote_host, port);
- *    silc_socket_tcp_stream_create(sock, TRUE, FALSE, schedule,
- *                                  stream_create_cb, app);
- *
- *    // Stream callback delivers our new SilcStream context
- *    void stream_create_cb(SilcResult status, SilcStream stream,
- *                          void *context)
- *    {
- *      ...
- *      if (status != SILC_OK)
- *        error(status);
- *
- *      // Start key exchange
- *      silc_client_key_exchange(client, NULL, public_key, private_key,
- *                               stream, SILC_CONN_SERVER, connection_cb, app);
- *      ...
- *    }
- *
- ***/
-SilcAsyncOperation
-silc_client_key_exchange(SilcClient client,
-                        SilcClientConnectionParams *params,
-                        SilcPublicKey public_key,
-                        SilcPrivateKey private_key,
-                        SilcStream stream,
-                        SilcConnectionType conn_type,
-                        SilcClientConnectCallback callback,
-                        void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_close_connection
- *
- * SYNOPSIS
- *
- *    void silc_client_close_connection(SilcClient client,
- *                                      SilcClientConnection conn);
- *
- * DESCRIPTION
- *
- *    Closes the remote connection `conn'.  The `conn' will become invalid
- *    after this call.  Usually this function is called only when explicitly
- *    closing connection for example in case of error, or when the remote
- *    connection was created by the application or when the remote is client
- *    connection.  Server connections are usually closed by sending QUIT
- *    command to the server.  However, this call may also be used.
- *
- ***/
-void silc_client_close_connection(SilcClient client,
-                                 SilcClientConnection conn);
-
-/* Message sending functions */
-
-/****f* silcclient/SilcClientAPI/silc_client_send_channel_message
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_send_channel_message(SilcClient client,
- *                                              SilcClientConnection conn,
- *                                              SilcChannelEntry channel,
- *                                              SilcChannelPrivateKey key,
- *                                              SilcMessageFlags flags,
- *                                              SilcHash hash,
- *                                              unsigned char *data,
- *                                              SilcUInt32 data_len);
- *
- * DESCRIPTION
- *
- *    Sends encrypted message to the `channel'.  The plaintext message is
- *    the `data' of `data_len' bytes in length.
- *
- *    If `key' is provided then that private channel message key is used to
- *    encrypt the message.  If it is not provided and the `channel' does not
- *    have SILC_CHANNEL_MODE_PRIVKEY set, the curent channel key is used
- *    instead.  If the mode is set but `key' is NULL the key that was added
- *    first as private channel message key will be used.
- *
- *    If the `flags' includes SILC_MESSAGE_FLAG_SIGNED the message will be
- *    digitally signed with the SILC key pair associated with the `conn'.
- *    In this case the `hash' pointer must be provided as well.
- *
- *    Returns TRUE if the message was sent, and FALSE if error occurred or
- *    the sending is not allowed due to channel modes (like sending is
- *    blocked).  This function is thread safe and private messages can be
- *    sent from multiple threads.
- *
- ***/
-SilcBool silc_client_send_channel_message(SilcClient client,
-                                         SilcClientConnection conn,
-                                         SilcChannelEntry channel,
-                                         SilcChannelPrivateKey key,
-                                         SilcMessageFlags flags,
-                                         SilcHash hash,
-                                         unsigned char *data,
-                                         SilcUInt32 data_len);
-
-/****f* silcclient/SilcClientAPI/silc_client_send_private_message
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_send_private_message(SilcClient client,
- *                                              SilcClientConnection conn,
- *                                              SilcClientEntry client_entry,
- *                                              SilcMessageFlags flags,
- *                                              SilcHash hash,
- *                                              unsigned char *data,
- *                                              SilcUInt32 data_len);
- *
- * DESCRIPTION
- *
- *    Sends private message to remote client. If private message key has
- *    not been set with this client then the message will be encrypted using
- *    the session keys used in `conn' connection.  If the `flags' includes
- *    SILC_MESSAGE_FLAG_SIGNED the message will be digitally signed with the
- *    SILC key pair associated with `conn'.  In this case the caller must also
- *    provide the `hash' pointer.
- *
- *    Returns TRUE if the message was sent, and FALSE if error occurred.
- *    This function is thread safe and private messages can be sent from
- *    multiple threads.
- *
- ***/
-SilcBool silc_client_send_private_message(SilcClient client,
-                                         SilcClientConnection conn,
-                                         SilcClientEntry client_entry,
-                                         SilcMessageFlags flags,
-                                         SilcHash hash,
-                                         unsigned char *data,
-                                         SilcUInt32 data_len);
-
-/****f* silcclient/SilcClientAPI/silc_client_private_message_wait_init
- *
- * SYNOPSIS
- *
- *    SilcBool
- *    silc_client_private_message_wait_init(SilcClient client,
- *                                          SilcClientConnection conn,
- *                                          SilcClientEntry client_entry);
- *
- * DESCRIPTION
- *
- *    Initializes private message waiting functionality for the client
- *    indicated by `client_entry'.  Once this is called private message
- *    from remote connection indicated by `conn' for `client_entry' may
- *    be waiter for, for example in a thread.  The function
- *    silc_client_private_message_wait is used to block the current thread
- *    until a private message is received from a specified client entry.
- *    Return FALSE in case an internal error occurred.
- *
- ***/
-SilcBool silc_client_private_message_wait_init(SilcClient client,
-                                              SilcClientConnection conn,
-                                              SilcClientEntry client_entry);
-
-/****f* silcclient/SilcClientAPI/silc_client_private_message_wait_uninit
- *
- * SYNOPSIS
- *
- *    void
- *    silc_client_private_message_wait_uninit(SilcClient client,
- *                                            SilcClientConnection conn,
- *                                            SilcClientEntry client_entry);
- *
- * DESCRIPTION
- *
- *    Unintializes private message waiting for client indicated by
- *    `client_entry'.  After this call private message cannot be waited
- *    anymore and silc_client_private_message_wait will return with FALSE
- *    value.
- *
- ***/
-void silc_client_private_message_wait_uninit(SilcClient client,
-                                            SilcClientConnection conn,
-                                            SilcClientEntry client_entry);
-
-/****f* silcclient/SilcClientAPI/silc_client_private_message_wait
- *
- * SYNOPSIS
- *
- *    SilcBool
- *    silc_client_private_message_wait(SilcClient client,
- *                                     SilcClientConnection conn,
- *                                     SilcClientEntry client_entry,
- *                                     SilcMessagePayload *payload);
- *
- * DESCRIPTION
- *
- *    Blocks current thread or process until a private message has been
- *    received from the remote client indicated by `client_entry'.  Before
- *    private messages can be waited the silc_client_private_message_wait_init
- *    must be called.  This function can be used from a thread to wait for
- *    private message from the specified client.  Multiple threads can be
- *    created to wait messages from multiple clients.  Any other private
- *    message received from the connection indicated by `conn' will be
- *    forwarded to the normal `private_message' client operation callback.
- *    The private messages from `client_entry' will not be delivered to the
- *    `private_message' client operation callback.
- *
- *    Returns TRUE and the received private message into `payload'.  The caller
- *    must free the returned SilcMessagePayload.  If this function returns
- *    FALSE the private messages cannot be waited anymore.  This happens
- *    when some other thread calls silc_client_private_message_wait_uninit.
- *    This returns FALSE also if silc_client_private_message_wait_init has
- *    not been called.
- *
- ***/
-SilcBool silc_client_private_message_wait(SilcClient client,
-                                         SilcClientConnection conn,
-                                         SilcClientEntry client_entry,
-                                         SilcMessagePayload *payload);
-
-/****f* silcclient/SilcClientAPI/silc_client_on_channel
- *
- * SYNOPSIS
- *
- *    SilcChannelUser silc_client_on_channel(SilcChannelEntry channel,
- *                                           SilcClientEntry client_entry);
- *
- * DESCRIPTION
- *
- *    Returns the SilcChannelUser entry if the `client_entry' is joined on the
- *    channel indicated by the `channel'. NULL if client is not joined on
- *    the channel.
- *
- ***/
-SilcChannelUser silc_client_on_channel(SilcChannelEntry channel,
-                                      SilcClientEntry client_entry);
-
-
-/* Command management */
-
-/****f* silcclient/SilcClientAPI/silc_client_command_call
- *
- * SYNOPSIS
- *
- *    SilcUInt16 silc_client_command_call(SilcClient client,
- *                                        SilcClientConnection conn,
- *                                        const char *command_line, ...);
- *
- * DESCRIPTION
- *
- *    Calls and executes the command indicated by the `command_name'.
- *    The `command_line' is a string which includes the command's name and
- *    its arguments separated with whitespaces (' ').  If `command_line'
- *    is non-NULL then all variable arguments are ignored by default.
- *
- *    If `command_line' is NULL, then the variable arguments define the
- *    command's name and its arguments.  The first variable argument must
- *    be the command name.  The variable argument list must be terminated
- *    with NULL.
- *
- *    Returns command identifier for this sent command.  It can be used
- *    to additionally attach to the command reply using the function
- *    silc_client_command_pending, if needed.  Returns 0 on error.
- *
- *    The `command' client operation callback will be called when the
- *    command is executed to indicate whether or not the command executed
- *    successfully.
- *
- *    The `command_reply' client operation callbak will be called when reply
- *    is received from the server to the command.  Application may also use
- *    the silc_client_command_pending to attach to the command reply.
- *    The command identifier for silc_client_command_pending function after
- *    this function call is conn->cmd_ident, which application may use.
- *
- * EXAMPLE
- *
- *    silc_client_command_call(client, conn, NULL, "PING", "silc.silcnet.org",
- *                             NULL);
- *    silc_client_command_call(client, conn, "PING silc.silcnet.org");
- *
- * NOTES
- *
- *    This command executes the commands implemented inside the client
- *    library.  These commands are designed for command line applications,
- *    but GUI application may call them too if needed.  Alternatively
- *    application may override the library and use silc_client_command_send
- *    function instead.
- *
- ***/
-SilcUInt16 silc_client_command_call(SilcClient client,
-                                   SilcClientConnection conn,
-                                   const char *command_line, ...);
-
-/****f* silcclient/SilcClientAPI/SilcClientCommandReply
- *
- * SYNOPSIS
- *
- *    typedef SilcBool (*SilcClientCommandReply)(SilcClient client,
- *                                               SilcClientConnection conn,
- *                                               SilcCommand command,
- *                                               SilcStatus status,
- *                                               SilcStatus error,
- *                                               void *context,
- *                                               va_list ap);
- *
- * DESCRIPTION
- *
- *    The command reply callback function given as argument to functions
- *    silc_client_command_send and silc_client_command_pending.  This is
- *    called to deliver the command replies to the caller.  Each command
- *    reply received from the server to the `command' will be delivered
- *    separately to the caller by calling this callback.  The `status' will
- *    indicate whether there is only one reply or multiple replies.  The
- *    `error' will indicate if an error occurred.  The `ap' will include
- *    command reply arguments.  They are the same arguments as for
- *    `command_reply' client operation callback in SilcClientOperations.
- *
- *    If `status' is SILC_STATUS_OK only one reply was received and error
- *    did not occur.  If it is SILC_STATUS_LIST_START, SILC_STATUS_LIST_ITEM
- *    or SILC_STATUS_LIST_END, there are will be two or more replies.  The
- *    first reply is SILC_STATUS_LIST_START and last one SILC_STATUS_LIST_END.
- *
- *    If FALSE is returned in this function this callback will not be called
- *    again for `command' even if there are more comand replies.  By returning
- *    FALSE the caller may stop the command reply handling when needed.
- *
- ***/
-typedef SilcBool (*SilcClientCommandReply)(SilcClient client,
-                                          SilcClientConnection conn,
-                                          SilcCommand command,
-                                          SilcStatus status,
-                                          SilcStatus error,
-                                          void *context,
-                                          va_list ap);
-
-/****f* silcclient/SilcClientAPI/silc_client_command_send
- *
- * SYNOPSIS
- *
- *    SilcUInt16 silc_client_command_send(SilcClient client,
- *                                        SilcClientConnection conn,
- *                                        SilcCommand command,
- *                                        SilcClientCommandReply reply,
- *                                        void *reply_context,
- *                                        SilcUInt32 argc, ...);
- *
- * DESCRIPTION
- *
- *    Generic function to send any command.  The arguments must be given
- *    already encoded into correct format and in correct order. If application
- *    wants to perform the commands by itself, it can do so and send the data
- *    directly to the server using this function.  If application is using
- *    the silc_client_command_call, this function is usually not used.
- *    Programmer should get familiar with the SILC protocol commands
- *    specification when using this function, as the arguments needs to
- *    be encoded as specified in the protocol.
- *
- *    The variable arguments are a set of { type, data, data_length },
- *    and the `argc' is the number of these sets.
- *
- *    The `reply' callback must be provided, and it is called when the
- *    command reply is received from the server.  Note that, when using this
- *    function the default `command_reply' client operation callback will not
- *    be called when reply is received.
- *
- *    Returns command identifier for this sent command.  It can be used
- *    to additionally attach to the command reply using the function
- *    silc_client_command_pending, if needed.  Returns 0 on error.
- *
- * EXAMPLE
- *
- *    silc_client_command_send(client, conn, SILC_COMMAND_WHOIS,
- *                             my_whois_command_reply, cmd_ctx,
- *                             1, 1, nickname, strlen(nickname));
- *
- ***/
-SilcUInt16 silc_client_command_send(SilcClient client,
-                                   SilcClientConnection conn,
-                                   SilcCommand command,
-                                   SilcClientCommandReply reply,
-                                   void *reply_context,
-                                   SilcUInt32 argc, ...);
-
-/****f* silcclient/SilcClientAPI/silc_client_command_pending
- *
- * SYNOPSIS
- *
- *    void silc_client_command_pending(SilcClientConnection conn,
- *                                     SilcCommand command,
- *                                     SilcUInt16 cmd_ident,
- *                                     SilcClientCommandReply reply,
- *                                     void *context);
- *
- * DESCRIPTION
- *
- *    This function can be used to add pending command callback to be
- *    called when an command reply is received to an earlier sent command.
- *    The `command' is the command that must be received in order for
- *    the pending command callback indicated by `callback' to be called.
- *
- *    The `cmd_ident' is a command identifier which was set for the earlier
- *    sent command.  The command reply will include the same identifier
- *    and pending command callback will be called when the reply is
- *    received with the same command identifier.  It is possible to
- *    add multiple pending command callbacks for same command and for
- *    same identifier.
- *
- *    Application may use this function to add its own command reply
- *    handlers if it wishes not to use the standard `command_reply'
- *    client operation.
- *
- *    Note also that the application is notified about the received command
- *    reply through the `command_reply' client operation before calling
- *    the `callback` pending command callback.  That is the normal
- *    command reply handling, and is called regardless whether pending
- *    command callbacks are used or not.
- *
- * EXAMPLE
- *
- *    SilcUInt16 cmd_ident;
- *    cmd_ident = silc_client_command_call(client, conn,
- *                                         "PING silc.silcnet.org");
- *    silc_client_command_pending(conn, SILC_COMMAND_PING, cmd_ident,
- *                                my_ping_handler, my_ping_context);
- *
- ***/
-SilcBool silc_client_command_pending(SilcClientConnection conn,
-                                    SilcCommand command,
-                                    SilcUInt16 cmd_ident,
-                                    SilcClientCommandReply reply,
-                                    void *context);
-
-
-/* Private Message key management */
-
-/****f* silcclient/SilcClientAPI/silc_client_add_private_message_key
- *
- * SYNOPSIS
- *
- *    SilcBool
- *    silc_client_add_private_message_key(SilcClient client,
- *                                        SilcClientConnection conn,
- *                                        SilcClientEntry client_entry,
- *                                        const char *cipher,
- *                                        const char *hmac,
- *                                        unsigned char *key,
- *                                        SilcUInt32 key_len);
- *
- * DESCRIPTION
- *
- *    Adds a static private message key to the client library.  The key
- *    will be used to encrypt all private message between the client and
- *    the remote client indicated by the `client_entry'.  The `key' can
- *    be for example a pre-shared-key, passphrase or similar shared secret
- *    string.  The `cipher' and `hmac' MAY be provided but SHOULD be NULL
- *    to assure that the requirements of the SILC protocol are met. The
- *    API, however, allows to allocate any cipher and HMAC.
- *
- *    If the private message key is added to client without first receiving
- *    a request for it from the remote `client_entry' this function will
- *    send the request to `client_entry'.  Note that, the actual key is
- *    not sent to the network.
- *
- *    It is not necessary to set key for normal private message usage. If the
- *    key is not set then the private messages are encrypted using normal
- *    session keys.  Setting the private key, however, increases security.
- *
- *    Returns FALSE if the key is already set for the `client_entry', TRUE
- *    otherwise.
- *
- ***/
-SilcBool silc_client_add_private_message_key(SilcClient client,
-                                            SilcClientConnection conn,
-                                            SilcClientEntry client_entry,
-                                            const char *cipher,
-                                            const char *hmac,
-                                            unsigned char *key,
-                                            SilcUInt32 key_len);
-
-/****f* silcclient/SilcClientAPI/silc_client_add_private_message_key_ske
- *
- * SYNOPSIS
- *
- *    SilcBool
- *    silc_client_add_private_message_key_ske(SilcClient client,
- *                                            SilcClientConnection conn,
- *                                            SilcClientEntry client_entry,
- *                                            const char *cipher,
- *                                            const char *hmac,
- *                                            SilcSKEKeyMaterial key);
- *
- * DESCRIPTION
- *
- *    Same as silc_client_add_private_message_key but takes the key material
- *    from the SKE key material structure.  This structure is received if
- *    the application uses the silc_client_send_key_agreement to negotiate
- *    the key material.  The `cipher' and `hmac' SHOULD be provided as it is
- *    negotiated also in the SKE protocol.
- *
- ***/
-SilcBool silc_client_add_private_message_key_ske(SilcClient client,
-                                                SilcClientConnection conn,
-                                                SilcClientEntry client_entry,
-                                                const char *cipher,
-                                                const char *hmac,
-                                                SilcSKEKeyMaterial key);
-
-/****f* silcclient/SilcClientAPI/silc_client_del_private_message_key
- *
- * SYNOPSIS
- *
- *    SilcBool
- *    silc_client_del_private_message_key(SilcClient client,
- *                                        SilcClientConnection conn,
- *                                        SilcClientEntry client_entry);
- *
- * DESCRIPTION
- *
- *    Removes the private message from the library. The key won't be used
- *    after this to protect the private messages with the remote `client_entry'
- *    client. Returns FALSE on error, TRUE otherwise.
- *
- ***/
-SilcBool silc_client_del_private_message_key(SilcClient client,
-                                            SilcClientConnection conn,
-                                            SilcClientEntry client_entry);
-
-/****f* silcclient/SilcClientAPI/silc_client_list_private_message_keys
- *
- * SYNOPSIS
- *
- *    SilcPrivateMessageKeys
- *    silc_client_list_private_message_keys(SilcClient client,
- *                                          SilcClientConnection conn,
- *                                          SilcUInt32 *key_count);
- *
- * DESCRIPTION
- *
- *    Returns array of set private message keys associated to the connection
- *    `conn'. Returns allocated SilcPrivateMessageKeys array and the array
- *    count to the `key_count' argument. The array must be freed by the caller
- *    by calling the silc_client_free_private_message_keys function. Note:
- *    the keys returned in the array is in raw format. It might not be desired
- *    to show the keys as is. The application might choose not to show the keys
- *    at all or to show the fingerprints of the keys.
- *
- ***/
-SilcPrivateMessageKeys
-silc_client_list_private_message_keys(SilcClient client,
-                                     SilcClientConnection conn,
-                                     SilcUInt32 *key_count);
-
-/****f* silcclient/SilcClientAPI/silc_client_free_private_message_keys
- *
- * SYNOPSIS
- *
- *    void silc_client_free_private_message_keys(SilcPrivateMessageKeys keys,
- *                                               SilcUInt32 key_count);
- *
- * DESCRIPTION
- *
- *    Frees the SilcPrivateMessageKeys array returned by the function
- *    silc_client_list_private_message_keys.
- *
- ***/
-void silc_client_free_private_message_keys(SilcPrivateMessageKeys keys,
-                                          SilcUInt32 key_count);
-
-/****f* silcclient/SilcClientAPI/silc_client_private_message_key_is_set
- *
- * SYNOPSIS
- *
- *    SilcBool
- *    silc_client_private_message_key_is_set(SilcClient client,
- *                                           SilcClientConnection conn,
- *                                           SilcClientEntry client_entry);
- *
- * DESCRIPTION
- *
- *    Returns TRUE if the private message key has been set for the client
- *    entry indicated by `client_entry'.
- *
- ***/
-SilcBool
-silc_client_private_message_key_is_set(SilcClient client,
-                                      SilcClientConnection conn,
-                                      SilcClientEntry client_entry);
-
-
-/* Channel private key management */
-
-/****f* silcclient/SilcClientAPI/silc_client_add_channel_private_key
- *
- * SYNOPSIS
- *
- *    SilcBool
- *    silc_client_add_channel_private_key(SilcClient client,
- *                                        SilcClientConnection conn,
- *                                        SilcChannelEntry channel,
- *                                        const char *name,
- *                                        char *cipher,
- *                                        char *hmac,
- *                                        unsigned char *key,
- *                                        SilcUInt32 key_len,
- *                                        SilcChannelPrivateKey *ret_key);
- *
- * DESCRIPTION
- *
- *    Adds private key for channel. When channel has private key then the
- *    messages are encrypted using that key. All clients on the channel
- *    must also know the key in order to decrypt the messages. However,
- *    it is possible to have several private keys per one channel. In this
- *    case only some of the clients on the channel may know the one key
- *    and only some the other key.  The `name' can be application given
- *    name for the key.  This returns the created key to the 'ret_key'
- *    pointer if it is non-NULL;
- *
- *    If `cipher' and/or `hmac' is NULL then default values will be used
- *    (aes-256-cbc for cipher and hmac-sha1-96 for hmac).
- *
- *    The private key for channel is optional. If it is not set then the
- *    channel messages are encrypted using the channel key generated by the
- *    server. However, setting the private key (or keys) for the channel
- *    significantly adds security. If more than one key is set the library
- *    will automatically try all keys at the message decryption phase. Note:
- *    setting many keys slows down the decryption phase as all keys has to
- *    be tried in order to find the correct decryption key. However, setting
- *    a few keys does not have big impact to the decryption performace.
- *
- * NOTES
- *
- *    NOTE: This is entirely local setting. The key set using this function
- *    is not sent to the network at any phase.
- *
- *    NOTE: If the key material was originated by the SKE protocol (using
- *    silc_client_send_key_agreement) then the `key' MUST be the
- *    key->send_enc_key as this is dictated by the SILC protocol. However,
- *    currently it is not expected that the SKE key material would be used
- *    as channel private key. However, this API allows it.
- *
- ***/
-SilcBool silc_client_add_channel_private_key(SilcClient client,
-                                            SilcClientConnection conn,
-                                            SilcChannelEntry channel,
-                                            const char *name,
-                                            char *cipher,
-                                            char *hmac,
-                                            unsigned char *key,
-                                            SilcUInt32 key_len,
-                                            SilcChannelPrivateKey *ret_key);
-
-/****f* silcclient/SilcClientAPI/silc_client_del_channel_private_keys
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_del_channel_private_keys(SilcClient client,
- *                                                  SilcClientConnection conn,
- *                                                  SilcChannelEntry channel);
- *
- * DESCRIPTION
- *
- *    Removes all private keys from the `channel'. The old channel key is used
- *    after calling this to protect the channel messages. Returns FALSE on
- *    on error, TRUE otherwise.
- *
- ***/
-SilcBool silc_client_del_channel_private_keys(SilcClient client,
-                                             SilcClientConnection conn,
-                                             SilcChannelEntry channel);
-
-/****f* silcclient/SilcClientAPI/silc_client_del_channel_private_key
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_del_channel_private_key(SilcClient client,
- *                                                 SilcClientConnection conn,
- *                                                 SilcChannelEntry channel,
- *                                                 SilcChannelPrivateKey key);
- *
- * DESCRIPTION
- *
- *    Removes and frees private key `key' from the channel `channel'.
- *    The `key' is retrieved by calling the function
- *    silc_client_list_channel_private_keys. The key is not used after
- *    this. If the key was last private key then the old channel key is
- *    used hereafter to protect the channel messages. This returns FALSE
- *    on error, TRUE otherwise.
- *
- ***/
-SilcBool silc_client_del_channel_private_key(SilcClient client,
-                                            SilcClientConnection conn,
-                                            SilcChannelEntry channel,
-                                            SilcChannelPrivateKey key);
-
-/****f* silcclient/SilcClientAPI/silc_client_list_channel_private_keys
- *
- * SYNOPSIS
- *
- *    SilcDList
- *    silc_client_list_channel_private_keys(SilcClient client,
- *                                          SilcClientConnection conn,
- *                                          SilcChannelEntry channel);
- *
- * DESCRIPTION
- *
- *    Returns list of private keys associated to the `channel'.  The caller
- *    must free the returned list with silc_dlist_uninit.  The pointers in
- *    the list may be used to delete the specific key by giving the pointer
- *    as argument to the function silc_client_del_channel_private_key.  Each
- *    entry in the list is SilcChannelPrivateKey.
- *
- ***/
-SilcDList silc_client_list_channel_private_keys(SilcClient client,
-                                               SilcClientConnection conn,
-                                               SilcChannelEntry channel);
-
-/****f* silcclient/SilcClientAPI/silc_client_current_channel_private_key
- *
- * SYNOPSIS
- *
- *    void silc_client_current_channel_private_key(SilcClient client,
- *                                                 SilcClientConnection conn,
- *                                                 SilcChannelEntry channel,
- *                                                 SilcChannelPrivateKey key);
- *
- * DESCRIPTION
- *
- *    Sets the `key' to be used as current channel private key on the
- *    `channel'.  Packet sent after calling this function will be secured
- *    with `key'.
- *
- ***/
-void silc_client_current_channel_private_key(SilcClient client,
-                                            SilcClientConnection conn,
-                                            SilcChannelEntry channel,
-                                            SilcChannelPrivateKey key);
-
-
-/* Key Agreement routines */
-
-/****f* silcclient/SilcClientAPI/silc_client_send_key_agreement
- *
- * SYNOPSIS
- *
- *    void silc_client_send_key_agreement(SilcClient client,
- *                                        SilcClientConnection conn,
- *                                        SilcClientEntry client_entry,
- *                                        SilcClientConnectionParams *params,
- *                                        SilcPublicKey public_key,
- *                                        SilcPrivateKey private_key,
- *                                        SilcKeyAgreementCallback completion,
- *                                        void *context);
- *
- * DESCRIPTION
- *
- *    Sends key agreement request to the remote client indicated by the
- *    `client_entry'.
- *
- *    If `params' is non-NULL and it has the `local_ip' and `local_port' set
- *    the caller will provide the connection endpoint for the key agreement
- *    connection.  The `bind_ip' can be used to bind to that IP instead of
- *    `local_ip'.  If the `udp' is set to TRUE the connection will be UDP
- *    instead of TCP.  Caller may also set the `repository', `verify_notfound'
- *    and `timeout_secs' fields in `params'.  Other fields are ignored.
- *    If `params' is NULL, then the `client_entry' is expected to provide
- *    the connection endpoint for us.  It is recommended the `timeout_secs'
- *    is specified in case the remote client does not reply anything to
- *    the request.
- *
- *    The `public_key' and `private_key' is our identity in the key agreement.
- *
- *    In case we do not provide the connection endpoint, we will receive
- *    the `key_agreement' client operation when the remote send its own
- *    key agreement request packet.  We may then there start the key
- *    agreement with silc_client_perform_key_agreement.  If we provided the
- *    the connection endpoint, the client operation will not be called.
- *
- *    There can be only one active key agreement for `client_entry'.  Old
- *    key agreement may be aborted by calling silc_client_abort_key_agreement.
- *
- * EXAMPLE
- *
- *    // Send key agreement request (we don't provide connection endpoint)
- *    silc_client_send_key_agreement(client, conn, remote_client,
- *                                   NULL, public_key, private_key,
- *                                   my_keyagr_completion, my_context);
- *
- *    // Another example where we provide connection endpoint (TCP).
- *    SilcClientConnectionParams params;
- *    memset(&params, 0, sizeof(params));
- *    params.local_ip = local_ip;
- *    params.local_port = local_port;
- *    params.timeout_secs = 60;
- *    silc_client_send_key_agreement(client, conn, remote_client,
- *                                   &params, public_key, private_key,
- *                                   my_keyagr_completion, my_context);
- *
- ***/
-void silc_client_send_key_agreement(SilcClient client,
-                                   SilcClientConnection conn,
-                                   SilcClientEntry client_entry,
-                                   SilcClientConnectionParams *params,
-                                   SilcPublicKey public_key,
-                                   SilcPrivateKey private_key,
-                                   SilcKeyAgreementCallback completion,
-                                   void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_perform_key_agreement
- *
- * SYNOPSIS
- *
- *    void
- *    silc_client_perform_key_agreement(SilcClient client,
- *                                      SilcClientConnection conn,
- *                                      SilcClientEntry client_entry,
- *                                      SilcClientConnectionParams *params,
- *                                      SilcPublicKey public_key,
- *                                      SilcPrivateKey private_key,
- *                                      char *hostname, int port,
- *                                      SilcKeyAgreementCallback completion,
- *                                      void *context);
- *
- * DESCRIPTION
- *
- *    Performs the key agreement protocol.  Application may use this to
- *    initiate the key agreement protocol.  Usually this is called after
- *    receiving the `key_agreement' client operation.
- *
- *    The `hostname' is the remote hostname (or IP address) and the `port'
- *    is the remote port.  The `completion' callback with the `context' will
- *    be called after the key agreement protocol.
- *
- *    The `params' is connection parameters and it may be used to define
- *    the key agreement connection related parameters.  It may be NULL.
- *
- ***/
-void silc_client_perform_key_agreement(SilcClient client,
-                                      SilcClientConnection conn,
-                                      SilcClientEntry client_entry,
-                                      SilcClientConnectionParams *params,
-                                      SilcPublicKey public_key,
-                                      SilcPrivateKey private_key,
-                                      char *hostname, int port,
-                                      SilcKeyAgreementCallback completion,
-                                      void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_perform_key_agreement_stream
- *
- * SYNOPSIS
- *
- *    void
- *    silc_client_perform_key_agreement_stream(
- *                                      SilcClient client,
- *                                      SilcClientConnection conn,
- *                                      SilcClientEntry client_entry,
- *                                      SilcClientConnectionParams *params,
- *                                      SilcPublicKey public_key,
- *                                      SilcPrivateKey private_key,
- *                                      SilcStream stream,
- *                                      SilcKeyAgreementCallback completion,
- *                                      void *context);
- *
- * DESCRIPTION
- *
- *    Same as silc_client_perform_key_agreement but the caller has created
- *    the connection to remote client.  The `stream' is the created
- *    connection.
- *
- ***/
-void
-silc_client_perform_key_agreement_stream(SilcClient client,
-                                        SilcClientConnection conn,
-                                        SilcClientEntry client_entry,
-                                        SilcClientConnectionParams *params,
-                                        SilcPublicKey public_key,
-                                        SilcPrivateKey private_key,
-                                        SilcStream stream,
-                                        SilcKeyAgreementCallback completion,
-                                        void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_abort_key_agreement
- *
- * SYNOPSIS
- *
- *    void silc_client_abort_key_agreement(SilcClient client,
- *                                         SilcClientConnection conn,
- *                                         SilcClientEntry client_entry);
- *
- * DESCRIPTION
- *
- *    This function can be called to unbind the hostname and the port for
- *    the key agreement protocol. However, this function has effect only
- *    before the key agreement protocol has been performed. After it has
- *    been performed the library will automatically unbind the port. The
- *    `client_entry' is the client to which we sent the key agreement
- *    request.  The key agreement completion callback will be called
- *    with SILC_KEY_AGREEMENT_ABORTED status.
- *
- ***/
-void silc_client_abort_key_agreement(SilcClient client,
-                                    SilcClientConnection conn,
-                                    SilcClientEntry client_entry);
-
-
-/* Misc functions */
-
-/****f* silcclient/SilcClientAPI/silc_client_set_away_message
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_set_away_message(SilcClient client,
- *                                          SilcClientConnection conn,
- *                                          char *message);
- *
- * DESCRIPTION
- *
- *    Sets away `message'.  The away message may be set when the client's
- *    mode is changed to SILC_UMODE_GONE and the client whishes to reply
- *    to anyone who sends private message.  The `message' will be sent
- *    automatically back to the the client who send private message.  If
- *    away message is already set this replaces the old message with the
- *    new one.  If `message' is NULL the old away message is removed.
- *    The sender may freely free the memory of the `message'.  Returns
- *    FALSE on error.
- *
- ***/
-SilcBool silc_client_set_away_message(SilcClient client,
-                                     SilcClientConnection conn,
-                                     char *message);
-
-/****d* silcclient/SilcClientAPI/SilcClientMonitorStatus
- *
- * NAME
- *
- *    typedef enum { ... } SilcClientMonitorStatus;
- *
- * DESCRIPTION
- *
- *    File transmission session status types.  These will indicate
- *    the status of the file transmission session.
- *
- *    The SILC_CLIENT_FILE_MONITOR_KEY_AGREEMENT is called when session
- *    is key exchange phase.
- *
- *    The SILC_CLIENT_FILE_MONITOR_SEND is called when data is being sent
- *    to remote client.
- *
- *    The SILC_CLIENT_FILE_MONITOR_RECEIVE is called when data is being
- *    recieved from remote client.
- *
- *    The SILC_CLIENT_FILE_MONITOR_CLOSED will be called when the user
- *    issues silc_client_file_close.  If needed, it may be ignored in the
- *    monitor callback.
- *
- *    The SILC_CLIENT_FILE_MONITOR_DISCONNECT will be called if remote
- *    disconnects the session connection.  The silc_client_file_close must
- *    be called when this status is received.  The session is over when
- *    this is received.
- *
- *    The SILC_CLIENLT_FILE_MONITOR_ERROR is called in case some error
- *    occured.  The SilcClientFileError will indicate more detailed error
- *    condition.  The silc_client_file_close must be called when this status
- *    is received.  The session is over when this is received.
- *
- * SOURCE
- */
-typedef enum {
-  SILC_CLIENT_FILE_MONITOR_KEY_AGREEMENT,    /* In key agreemenet phase */
-  SILC_CLIENT_FILE_MONITOR_SEND,            /* Sending file */
-  SILC_CLIENT_FILE_MONITOR_RECEIVE,         /* Receiving file */
-  SILC_CLIENT_FILE_MONITOR_GET,                     /* Unsupported */
-  SILC_CLIENT_FILE_MONITOR_PUT,                     /* Unsupported */
-  SILC_CLIENT_FILE_MONITOR_CLOSED,          /* Session closed */
-  SILC_CLIENT_FILE_MONITOR_DISCONNECT,      /* Session disconnected */
-  SILC_CLIENT_FILE_MONITOR_ERROR,           /* Error during session */
-} SilcClientMonitorStatus;
-/***/
-
-/****d* silcclient/SilcClientAPI/SilcClientFileError
- *
- * NAME
- *
- *    typedef enum { ... } SilcClientFileError;
- *
- * DESCRIPTION
- *
- *    File transmission error types.  These types are returned by
- *    some of the file transmission functions, and by the monitor
- *    callback to indicate error.
- *
- * SOURCE
- */
-typedef enum {
-  SILC_CLIENT_FILE_OK,
-  SILC_CLIENT_FILE_ERROR,                   /* Generic error */
-  SILC_CLIENT_FILE_UNKNOWN_SESSION,         /* Unknown session ID */
-  SILC_CLIENT_FILE_ALREADY_STARTED,         /* Session already started */
-  SILC_CLIENT_FILE_NO_SUCH_FILE,            /* No such file */
-  SILC_CLIENT_FILE_PERMISSION_DENIED,       /* Permission denied */
-  SILC_CLIENT_FILE_KEY_AGREEMENT_FAILED,     /* Key exchange failed */
-  SILC_CLIENT_FILE_CONNECT_FAILED,          /* Error during connecting */
-  SILC_CLIENT_FILE_TIMEOUT,                 /* Connecting timedout */
-  SILC_CLIENT_FILE_NO_MEMORY,               /* System out of memory */
-} SilcClientFileError;
-/***/
-
-/****f* silcclient/SilcClientAPI/SilcClientFileMonitor
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcClientFileMonitor)(SilcClient client,
- *                                          SilcClientConnection conn,
- *                                          SilcClientMonitorStatus status,
- *                                          SilcClientFileError error,
- *                                          SilcUInt64 offset,
- *                                          SilcUInt64 filesize,
- *                                          SilcClientEntry client_entry,
- *                                          SilcUInt32 session_id,
- *                                          const char *filepath,
- *                                          void *context);
- *
- * DESCRIPTION
- *
- *    Monitor callback that is called during the file transmission to
- *    monitor the transmission process.  The `status' indicates the current
- *    monitoring process.  The `error' will indicate the error type
- *    if `status' is SILC_CLIENT_FILE_MONITOR_ERROR.  The `offset' is the
- *    currently transmitted amount of total `filesize'.  The `client_entry'
- *    indicates the remote client, and the transmission session ID is the
- *    `session_id'.  The filename being transmitted is indicated by the
- *    `filepath'.  The `conn' is NULL if the connection to remote client
- *    does not exist yet.
- *
- ***/
-typedef void (*SilcClientFileMonitor)(SilcClient client,
-                                     SilcClientConnection conn,
-                                     SilcClientMonitorStatus status,
-                                     SilcClientFileError error,
-                                     SilcUInt64 offset,
-                                     SilcUInt64 filesize,
-                                     SilcClientEntry client_entry,
-                                     SilcUInt32 session_id,
-                                     const char *filepath,
-                                     void *context);
-
-/****f* silcclient/SilcClientAPI/SilcClientFileName
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcClientFileName)(const char *filepath,
- *                                       void *context);
- *
- * DESCRIPTION
- *
- *    Completion callback for the SilcClientFileAskName callback function.
- *    Application calls this to deliver the filepath and filename where
- *    the downloaded file is to be saved.
- *
- ***/
-typedef void (*SilcClientFileName)(const char *filepath,
-                                  void *context);
-
-/****f* silcclient/SilcClientAPI/SilcClientFileAskName
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcClientFileAskName)(SilcClient client,
- *                                          SilcClientConnection conn,
- *                                          SilcUInt32 session_id,
- *                                          const char *remote_filename,
- *                                          SilcClientFileName completion,
- *                                          void *completion_context,
- *                                          void *context);
- *
- * DESCRIPTION
- *
- *    File name asking callback that is called if it is given to the
- *    silc_client_file_receive and the path given to that as argument was
- *    NULL.  The library calls this to ask the filename and filepath to
- *    where the file is to be saved.  The 'remote_filename' is the file
- *    that is being downloaded.  Application must call the 'completion'
- *    with 'completion_context' to continue with the file downloading.
- *    It is not mandatory to provide this to the silc_client_file_receive.
- *
- ***/
-typedef void (*SilcClientFileAskName)(SilcClient client,
-                                     SilcClientConnection conn,
-                                     SilcUInt32 session_id,
-                                     const char *remote_filename,
-                                     SilcClientFileName completion,
-                                     void *completion_context,
-                                     void *context);
-
-/****f* silcclient/SilcClientAPI/silc_client_file_send
- *
- * SYNOPSIS
- *
- *    SilcClientFileError
- *    silc_client_file_send(SilcClient client,
- *                          SilcClientConnection conn,
- *                          SilcClientEntry client_entry,
- *                          SilcClientConnectionParams *params,
- *                          SilcPublicKey public_key,
- *                          SilcPrivateKey private_key,
- *                          SilcClientFileMonitor monitor,
- *                          void *monitor_context,
- *                          const char *filepath,
- *                          SilcUInt32 *session_id);
- *
- * DESCRIPTION
- *
- *    Sends a file indicated by the `filepath' to the remote client
- *    indicated by the `client_entry'.  This will negotiate a secret key
- *    with the remote client before actually starting the transmission of
- *    the file.  The `monitor' callback will be called to monitor the
- *    transmission of the file.
- *
- *    This returns a file session ID for the file transmission to the
- *    `session_id' pointer.  It can be used to close the session (and
- *    abort the file transmission) by calling the silc_client_file_close
- *    function.  The session ID is also returned in the `monitor' callback.
- *
- *    If `params' is non-NULL and it has the `local_ip' and `local_port' set
- *    the caller will provide the connection endpoint for the key agreement
- *    connection.  The `bind_ip' can be used to bind to that IP instead of
- *    `local_ip'.  Caller may also set the `repository', `verify_notfound'
- *    and `timeout_secs' fields in `params'.  Other fields are ignored.
- *    If `params' is NULL, then the `client_entry' is expected to provide
- *    the connection endpoint for us.  It is recommended the `timeout_secs'
- *    is specified in case the remote client does not reply anything to
- *    the request.
- *
- *    The `public_key' and `private_key' is our identity in the key agreement.
- *
- *    If error will occur during the file transfer process the error status
- *    will be returned in the monitor callback.  In this case the application
- *    must call silc_client_file_close to close the session.
- *
- ***/
-SilcClientFileError
-silc_client_file_send(SilcClient client,
-                     SilcClientConnection conn,
-                     SilcClientEntry client_entry,
-                     SilcClientConnectionParams *params,
-                     SilcPublicKey public_key,
-                     SilcPrivateKey private_key,
-                     SilcClientFileMonitor monitor,
-                     void *monitor_context,
-                     const char *filepath,
-                     SilcUInt32 *session_id);
-
-/****f* silcclient/SilcClientAPI/silc_client_file_receive
- *
- * SYNOPSIS
- *
- *    SilcClientFileError
- *    silc_client_file_receive(SilcClient client,
- *                             SilcClientConnection conn,
- *                             SilcClientConnectionParams *params,
- *                             SilcPublicKey public_key,
- *                             SilcPrivateKey private_key,
- *                             SilcClientFileMonitor monitor,
- *                             void *monitor_context,
- *                             const char *path,
- *                             SilcUInt32 session_id,
- *                             SilcClientFileAskName ask_name,
- *                             void *ask_name_context);
- *
- * DESCRIPTION
- *
- *    Receives a file from a client indicated by the `client_entry'.  The
- *    `session_id' indicates the file transmission session and it has been
- *    received in the `ftp' client operation callback.  This will actually
- *    perform the key agreement protocol with the remote client before
- *    actually starting the file transmission.  The `monitor' callback
- *    will be called to monitor the transmission.  If `path' is non-NULL
- *    the file will be saved into that directory.  If NULL the file is
- *    saved in the current working directory, unless the 'ask_name'
- *    callback is non-NULL.  In this case the callback is called to ask
- *    the path and filename from application.
- *
- *    The `params' is the connection related parameters.  If the remote client
- *    provided connection point the `params' will be used when creating
- *    connection to the remote client.  If remote client did not provide
- *    connection point the `params' is used to provide connection point
- *    locally for the remote client.  See silc_client_file_send for more
- *    information on providing connection point for remote client.
- *
- *    The `public_key' and `private_key' is our identity in the key agreement.
- *
- *    If error will occur during the file transfer process the error status
- *    will be returned in the monitor callback.  In this case the application
- *    must call silc_client_file_close to close the session.
- *
- ***/
-SilcClientFileError
-silc_client_file_receive(SilcClient client,
-                        SilcClientConnection conn,
-                        SilcClientConnectionParams *params,
-                        SilcPublicKey public_key,
-                        SilcPrivateKey private_key,
-                        SilcClientFileMonitor monitor,
-                        void *monitor_context,
-                        const char *path,
-                        SilcUInt32 session_id,
-                        SilcClientFileAskName ask_name,
-                        void *ask_name_context);
-
-/****f* silcclient/SilcClientAPI/silc_client_file_close
- *
- * SYNOPSIS
- *
- *    SilcClientFileError silc_client_file_close(SilcClient client,
- *                                               SilcClientConnection conn,
- *                                               SilcUInt32 session_id);
- *
- * DESCRIPTION
- *
- *    Closes file transmission session indicated by the `session_id'.
- *    If file transmission is being conducted it will be aborted
- *    automatically. This function is also used to close the session
- *    after successful file transmission. This function can be used
- *    also to reject incoming file transmission request.  If the
- *    session was already started and the monitor callback was set
- *    the monitor callback will be called with the monitor status
- *    SILC_CLIENT_FILE_MONITOR_CLOSED.
- *
- ***/
-SilcClientFileError silc_client_file_close(SilcClient client,
-                                          SilcClientConnection conn,
-                                          SilcUInt32 session_id);
-
-/****f* silcclient/SilcClientAPI/silc_client_attribute_add
- *
- * SYNOPSIS
- *
- *    SilcAttributePayload
- *    silc_client_attribute_add(SilcClient client,
- *                              SilcClientConnection conn,
- *                              SilcAttribute attribute,
- *                              void *object,
- *                              SilcUInt32 object_size);
- *
- * DESCRIPTION
- *
- *    Add new Requsted Attribute for WHOIS command to the client library.
- *    The `attribute' object indicated by `object' is added and allocated
- *    SilcAttributePayload is returned.  The `object' must be of correct
- *    type and of correct size.  See the SilcAttribute for object types
- *    for different attributes.  You may also get all added attributes
- *    from the client with silc_client_attributes_get function.
- *
- *    Requested Attributes are different personal information about the
- *    user, status information and other information which other users
- *    may query with WHOIS command.  Application may set these so that
- *    if someone sends WHOIS query these attributes will be replied back
- *    to the sender.  The library always puts the public key to the
- *    Requested Attributes, but if application wishes to add additional
- *    public keys (or certificates) it can be done with this interface.
- *    Library also always computes digital signature of the attributes
- *    automatically, so application does not need to do that.
- *
- ***/
-SilcAttributePayload silc_client_attribute_add(SilcClient client,
-                                              SilcClientConnection conn,
-                                              SilcAttribute attribute,
-                                              void *object,
-                                              SilcUInt32 object_size);
-
-/****f* silcclient/SilcClientAPI/silc_client_attribute_del
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_attribute_del(SilcClient client,
- *                                   SilcClientConnection conn,
- *                                   SilcAttribute attribute,
- *                                   SilcAttributePayload attr);
- *
- * DESCRIPTION
- *
- *    Delete a Requested Attribute from the client.  If the `attribute'
- *    is non-zero then all attributes of that type are deleted and the
- *    `attr' is ignored.  If `attr' is non-NULL then that specific
- *    attribute is deleted and `attribute' is ignored.
- *
- *    You may get all added attributes with the function
- *    silc_client_attributes_get and to get the SilcAttributePayload.
- *    This function Returns TRUE if the attribute was found and deleted.
- *
- ***/
-SilcBool silc_client_attribute_del(SilcClient client,
-                                  SilcClientConnection conn,
-                                  SilcAttribute attribute,
-                                  SilcAttributePayload attr);
-
-/****f* silcclient/SilcClientAPI/silc_client_attributes_get
- *
- * SYNOPSIS
- *
- *    const SilcHashTable
- *    silc_client_attributes_get(SilcClient client,
- *                               SilcClientConnection conn);
- *
- * DESCRIPTION
- *
- *    Returns pointer to the SilcHashTable which includes all the added
- *    Requested Attributes.  The caller must not free the hash table.
- *    The caller may use SilcHashTableList and silc_hash_table_list to
- *    traverse the table.  Each entry in the hash table is one added
- *    SilcAttributePayload.  It is possible to delete a attribute
- *    payload while traversing the table.
- *
- ***/
-SilcHashTable silc_client_attributes_get(SilcClient client,
-                                        SilcClientConnection conn);
-
-/****f* silcclient/SilcClientAPI/silc_client_attributes_request
- *
- * SYNOPSIS
- *
- *    SilcBuffer silc_client_attributes_request(SilcAttribute attribute, ...);
- *
- * DESCRIPTION
- *
- *    Constructs a Requested Attributes buffer. If the `attribute' is zero (0)
- *    then all attributes are requested.  Alternatively, `attribute' and
- *    all variable arguments can each be requested attribute.  In this case
- *    the last must be set to zero (0) to complete the variable list of
- *    requested attributes.  See SilcAttribute for all attributes.
- *    You can give the returned buffer as argument to for example
- *    silc_client_get_client_by_id_resolve function.
- *
- * EXAMPLE
- *
- *    Request all attributes
- *    buffer = silc_client_attributes_request(0);
- *
- *    Request only the following attributes
- *    buffer = silc_client_attributes_request(SILC_ATTRIBUTE_USER_INFO,
- *                                            SILC_ATTRIBUTE_SERVICE,
- *                                            SILC_ATTRIBUTE_MOOD, 0);
- *
- ***/
-SilcBuffer silc_client_attributes_request(SilcAttribute attribute, ...);
-
-/****f* silcclient/SilcClientAPI/silc_client_nickname_format
- *
- * SYNOPSIS
- *
- *    SilcClientEntry
- *    silc_client_nickname_format(SilcClient client,
- *                                SilcClientConnection conn,
- *                                SilcClientEntry client_entry,
- *                                SilcBool priority);
- *
- * DESCRIPTION
- *
- *    Formats the nickname of `client_entry' according to the nickname
- *    formatting rules set in SilcClientParams.  If the `priority' is TRUE
- *    then the `client_entry' will always get the unformatted nickname.
- *    If FALSE and there are more than one same nicknames in the client
- *    the nickname will be formatted.
- *
- *    This returns NULL on error.  Otherwise, the client entry that was
- *    formatted is returned.  If `priority' is FALSE this always returns
- *    the `client_entry'.  If it is TRUE, this may return the client entry
- *    that was formatted after giving the `client_entry' the unformatted
- *    nickname.
- *
- *    Usually application does not need to call this function, as the library
- *    automatically formats nicknames.  However, if application wants to
- *    for example force the `client_entry' to always have the unformatted
- *    nickname it may call this function to do so.
- *
- ***/
-SilcClientEntry silc_client_nickname_format(SilcClient client,
-                                           SilcClientConnection conn,
-                                           SilcClientEntry client_entry,
-                                           SilcBool priority);
-
-/****f* silcclient/SilcClientAPI/silc_client_nickname_parse
- *
- * SYNOPSIS
- *
- *    SilcBool silc_client_nickname_parse(SilcClient client,
- *                                        SilcClientConnection conn,
- *                                        char *nickname,
- *                                        char **ret_nick);
- *
- * DESCRIPTION
- *
- *    Parses the `nickname' according to the format string given in the
- *    SilcClientParams.  Returns the parsed nickname into the `ret_nick'.
- *    The caller must free the returned pointer.  Returns FALSE if error
- *    occurred during parsing.  Returns TRUE if the nickname was parsed,
- *    it was not formatted or if the format string has not been specified
- *    in SilcClientParams.
- *
- ***/
-SilcBool silc_client_nickname_parse(SilcClient client,
-                                   SilcClientConnection conn,
-                                   char *nickname,
-                                   char **ret_nick);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* SILCCLIENT_H */