From 8f6a3c8d1cfaf698acc1af78443ab74601ddc504 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Thu, 2 May 2002 13:08:23 +0000 Subject: [PATCH] updates --- apps/irssi/src/silc/core/silc-servers.c | 4 ++-- lib/silcclient/client_ftp.c | 16 +++++++++++++--- lib/silcclient/silcclient.h | 6 +++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/apps/irssi/src/silc/core/silc-servers.c b/apps/irssi/src/silc/core/silc-servers.c index d258c4c7..ba829c82 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -723,7 +723,7 @@ static void command_file(const char *data, SILC_SERVER_REC *server, } 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) @@ -744,7 +744,7 @@ static void command_file(const char *data, SILC_SERVER_REC *server, 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, diff --git a/lib/silcclient/client_ftp.c b/lib/silcclient/client_ftp.c index 87a1f4c9..24233fc8 100644 --- a/lib/silcclient/client_ftp.c +++ b/lib/silcclient/client_ftp.c @@ -49,6 +49,7 @@ struct SilcClientFtpSessionStruct { SilcClientFileMonitor monitor; void *monitor_context; char *filepath; + char *path; SilcSFTP sftp; SilcSFTPFilesystem fs; @@ -291,6 +292,7 @@ static void silc_client_ftp_open_handle(SilcSFTP sftp, void *context) { SilcClientFtpSession session = (SilcClientFtpSession)context; + char path[512]; SILC_LOG_DEBUG(("Start")); @@ -310,8 +312,14 @@ static void silc_client_ftp_open_handle(SilcSFTP sftp, } /* 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, @@ -379,7 +387,7 @@ static void silc_client_ftp_readdir_name(SilcSFTP sftp, 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; @@ -891,6 +899,7 @@ silc_client_file_receive(SilcClient client, SilcClientConnection conn, SilcClientFileMonitor monitor, void *monitor_context, + const char *path, SilcUInt32 session_id) { SilcClientFtpSession session; @@ -920,6 +929,7 @@ silc_client_file_receive(SilcClient client, 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 diff --git a/lib/silcclient/silcclient.h b/lib/silcclient/silcclient.h index 7e0de3f3..b0ef27ef 100644 --- a/lib/silcclient/silcclient.h +++ b/lib/silcclient/silcclient.h @@ -2128,6 +2128,7 @@ silc_client_file_send(SilcClient client, * SilcClientConnection conn, * SilcClientFileMonitor monitor, * void *monitor_context, + * const char *path, * SilcUInt32 session_id); * * DESCRIPTION @@ -2137,7 +2138,9 @@ silc_client_file_send(SilcClient client, * 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 @@ -2150,6 +2153,7 @@ silc_client_file_receive(SilcClient client, SilcClientConnection conn, SilcClientFileMonitor monitor, void *monitor_context, + const char *path, SilcUInt32 session_id); /****f* silcclient/SilcClientAPI/silc_client_file_close -- 2.43.0