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 */
} SilcKeyAgreementStatus;
/***/
silc_client_perform_key_agreement). If TRUE is returned also the
`completion' and `context' arguments must be set by the application. */
int (*key_agreement)(SilcClient client, SilcClientConnection conn,
- SilcClientEntry client_entry, char *hostname,
- int port,
- SilcKeyAgreementCallback *completion,
+ SilcClientEntry client_entry, const char *hostname,
+ uint16 port, SilcKeyAgreementCallback *completion,
void **context);
+
+ /* 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, uint32 session_id,
+ const char *hostname, uint16 port);
} SilcClientOperations;
/***/
***/
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
* is the formatted nickname to find exact match from multiple found
* entries. The format must be same as given in the SilcClientParams
* structure to the client library. If the `format' is NULL all found
- * clients by `nickname' are returned.
+ * clients by `nickname' are returned. The caller must return the
+ * returned array.
*
***/
SilcClientEntry *silc_client_get_clients_local(SilcClient client,
*
* SYNOPSIS
*
- * SilcClientCommandContext silc_client_command_alloc();
+ * SilcClientCommandContext silc_client_command_alloc(void);
*
* DESCRIPTION
*
* context.
*
***/
-SilcClientCommandContext silc_client_command_alloc();
+SilcClientCommandContext silc_client_command_alloc(void);
/****f* silcclient/SilcClientAPI/silc_client_command_free
*
*
* SYNOPSIS
*
- * SilcClientCommand *silc_client_command_find(const char *name);
+ * SilcClientCommand silc_client_command_find(SilcClient client,
+ * const char *name);
*
* DESCRIPTION
*
* command is not found. See the `command.[ch]' for the command list.
*
***/
-SilcClientCommand *silc_client_command_find(const char *name);
+SilcClientCommand silc_client_command_find(SilcClient client,
+ const char *name);
+
+/****f* silcclient/SilcClientAPI/silc_client_command_call
+ *
+ * SYNOPSIS
+ *
+ * void silc_client_command_call(SilcClientCommand command);
+ *
+ * DESCRIPTION
+ *
+ * Calls the command (executes it). Application can call this after
+ * it has allocated the SilcClientCommandContext with the function
+ * silc_client_command_alloc and found the command from the client
+ * library by calling silc_client_command_find. This will execute
+ * the command.
+ *
+ * Application can call the command function directly too if it
+ * wishes to do so. See the command.h for details of the
+ * SilcClientCommand structure.
+ *
+ ***/
+void silc_client_command_call(SilcClientCommand command,
+ SilcClientCommandContext cmd);
-/****f* silcclient/SilcClientAPI/silc_client_send_command
+/****f* silcclient/SilcClientAPI/silc_client_command_send
*
* SYNOPSIS
*
- * void silc_client_send_command(SilcClient client,
+ * void silc_client_command_send(SilcClient client,
* SilcClientConnection conn,
* SilcCommand command, uint16 ident,
* uint32 argc, ...);
* DESCRIPTION
*
* Generic function to send any command. The arguments must be sent already
- * encoded into correct form and in correct order.
+ * encoded into correct form 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.
*
***/
-void silc_client_send_command(SilcClient client, SilcClientConnection conn,
+void silc_client_command_send(SilcClient client, SilcClientConnection conn,
SilcCommand command, uint16 ident,
uint32 argc, ...);
*
* Add new pending command to be executed when reply to a command has been
* received. The `reply_cmd' is the command that will call the `callback'
- * with `context' when reply has been received. If `ident is non-zero
+ * with `context' when reply has been received. If `ident' is non-zero
* the `callback' will be executed when received reply with command
* identifier `ident'.
*
+ * Note that the application is notified about the received command
+ * reply through the `command_reply' client operation before calling
+ * the `callback` pending command callback.
+ *
***/
void silc_client_command_pending(SilcClientConnection conn,
SilcCommand reply_cmd,
void silc_client_send_key_agreement(SilcClient client,
SilcClientConnection conn,
SilcClientEntry client_entry,
- char *hostname,
+ const char *hostname,
+ const char *bindhost,
int port,
uint32 timeout_secs,
SilcKeyAgreementCallback completion,
* 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.
+ * request. The key agreement completion callback will be called
+ * with SILC_KEY_AGREEMENT_ABORTED status.
*
***/
void silc_client_abort_key_agreement(SilcClient client,
SilcConnectionAuthRequest callback,
void *context);
+/****d* silcclient/SilcClientAPI/SilcClientMonitorStatus
+ *
+ * NAME
+ *
+ * typedef enum { ... } SilcClientMonitorStatus;
+ *
+ * DESCRIPTION
+ *
+ * File transmission session status types. These will indicate
+ * the status of the file transmission session.
+ *
+ * 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,
+ SILC_CLIENT_FILE_MONITOR_PUT,
+ SILC_CLIENT_FILE_MONITOR_CLOSED, /* Session closed */
+ 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,
+ SILC_CLIENT_FILE_UNKNOWN_SESSION,
+ SILC_CLIENT_FILE_ALREADY_STARTED,
+ SILC_CLIENT_FILE_NO_SUCH_FILE,
+ SILC_CLIENT_FILE_PERMISSION_DENIED,
+} SilcClientFileError;
+/***/
+
+/****f* silcclient/SilcClientAPI/SilcClientFileMonitor
+ *
+ * SYNOPSIS
+ *
+ * typedef void (*SilcClientFileMonitor)(SilcClient client,
+ * SilcClientConnection conn,
+ * SilcClientMonitorStatus status,
+ * SilcClientFileError error,
+ * uint64 offset,
+ * uint64 filesize,
+ * SilcClientEntry client_entry,
+ * uint32 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'.
+ *
+ ***/
+typedef void (*SilcClientFileMonitor)(SilcClient client,
+ SilcClientConnection conn,
+ SilcClientMonitorStatus status,
+ SilcClientFileError error,
+ uint64 offset,
+ uint64 filesize,
+ SilcClientEntry client_entry,
+ uint32 session_id,
+ const char *filepath,
+ void *context);
+
+/****f* silcclient/SilcClientAPI/silc_client_file_send
+ *
+ * SYNOPSIS
+ *
+ * uint32 silc_client_file_send(SilcClient client,
+ * SilcClientConnection conn,
+ * SilcClientFileMonitor monitor,
+ * void *monitor_context,
+ * const char *local_ip,
+ * uint32 local_port,
+ * SilcClientEntry client_entry,
+ * const char *filepath);
+ *
+ * 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. 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. This returns 0 if the
+ * file indicated by the `filepath' is being transmitted to the remote
+ * client indicated by the `client_entry', already.
+ *
+ * If the `local_ip' is provided then this will try to bind the
+ * listener for key exchange protocol to that IP. If `local_port' is
+ * non-zero that port is used. If `local_ip' is NULL then this will
+ * automatically attempt to bind it to local IP address of the machine.
+ * If that fails then this does not bind to any address and port, and
+ * assume that the remote client will provide the listener for the
+ * key exchange protocol.
+ *
+ * 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.
+ *
+ ***/
+uint32 silc_client_file_send(SilcClient client,
+ SilcClientConnection conn,
+ SilcClientFileMonitor monitor,
+ void *monitor_context,
+ const char *local_ip,
+ uint32 local_port,
+ SilcClientEntry client_entry,
+ const char *filepath);
+
+/****f* silcclient/SilcClientAPI/silc_client_file_receive
+ *
+ * SYNOPSIS
+ *
+ * SilcClientFileError
+ * silc_client_file_receive(SilcClient client,
+ * SilcClientConnection conn,
+ * SilcClientFileMonitor monitor,
+ * void *monitor_context,
+ * uint32 session_id);
+ *
+ * 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 function. 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 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,
+ SilcClientFileMonitor monitor,
+ void *monitor_context,
+ uint32 session_id);
+
+/****f* silcclient/SilcClientAPI/silc_client_file_close
+ *
+ * SYNOPSIS
+ *
+ * SilcClientFileError silc_client_file_close(SilcClient client,
+ * SilcClientConnection conn,
+ * uint32 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.
+ *
+ ***/
+SilcClientFileError silc_client_file_close(SilcClient client,
+ SilcClientConnection conn,
+ uint32 session_id);
+
#endif