}
ret = silc_client_file_receive(silc_client, conn,
- silc_client_file_monitor, server,
+ silc_client_file_monitor, server, NULL,
server->current_session->session_id);
if (ret != SILC_CLIENT_FILE_OK) {
if (ret == SILC_CLIENT_FILE_ALREADY_STARTED)
if (ftp->client_entry == client_entry && !ftp->filepath) {
ret = silc_client_file_receive(silc_client, conn,
silc_client_file_monitor, server,
- ftp->session_id);
+ NULL, ftp->session_id);
if (ret != SILC_CLIENT_FILE_OK) {
if (ret == SILC_CLIENT_FILE_ALREADY_STARTED)
printformat_module("fe-common/silc", server, NULL,
SilcClientFileMonitor monitor;
void *monitor_context;
char *filepath;
+ char *path;
SilcSFTP sftp;
SilcSFTPFilesystem fs;
void *context)
{
SilcClientFtpSession session = (SilcClientFtpSession)context;
+ char path[512];
SILC_LOG_DEBUG(("Start"));
}
/* Open the actual local file */
- session->fd = silc_file_open(session->filepath,
- O_RDWR | O_CREAT | O_EXCL);
+ memset(path, 0, sizeof(path));
+ if (session->path && strlen(session->path) < sizeof(path))
+ strncat(path, session->path, strlen(session->path));
+ if (strlen(session->filepath) > sizeof(path) - strlen(path))
+ strncat(path, session->filepath, sizeof(path) - strlen(path) - 1);
+ else
+ strncat(path, session->filepath, strlen(session->filepath));
+ session->fd = silc_file_open(path, O_RDWR | O_CREAT | O_EXCL);
if (session->fd < 0) {
/* Call monitor callback */
session->client->internal->ops->say(session->client, session->conn,
silc_sftp_open(sftp, name->filename[0], SILC_SFTP_FXF_READ, &attr,
silc_client_ftp_open_handle, session);
- /* Save the important attributes */
+ /* Save the important attributes like filename and file size */
session->filepath = strdup(name->filename[0]);
session->filesize = name->attrs[0]->size;
SilcClientConnection conn,
SilcClientFileMonitor monitor,
void *monitor_context,
+ const char *path,
SilcUInt32 session_id)
{
SilcClientFtpSession session;
session->monitor = monitor;
session->monitor_context = monitor_context;
session->conn = conn;
+ session->path = path ? strdup(path) : NULL;
/* If the hostname and port already exists then the remote client did
provide the connection point to us and we won't create listener, but
* SilcClientConnection conn,
* SilcClientFileMonitor monitor,
* void *monitor_context,
+ * const char *path,
* SilcUInt32 session_id);
*
* DESCRIPTION
* 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.
+ * 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.
*
* If error will occur during the file transfer process the error
* status will be returned in the monitor callback. In this case
SilcClientConnection conn,
SilcClientFileMonitor monitor,
void *monitor_context,
+ const char *path,
SilcUInt32 session_id);
/****f* silcclient/SilcClientAPI/silc_client_file_close