aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTilo Eckert <tilo.eckert@flam.de>2016-07-01 10:57:38 +0200
committerAndreas Schneider <asn@cryptomilk.org>2016-10-08 10:50:38 +0200
commit1cc1a352fc62bad36c8c9b1dc2f471d8b5e4a539 (patch)
tree5e9325bb7b680912b1560935b5a707317b244abe /src
parentcfe7065ce16511521d68b864398d1da0f0c5130e (diff)
downloadlibssh-1cc1a352fc62bad36c8c9b1dc2f471d8b5e4a539.tar.gz
libssh-1cc1a352fc62bad36c8c9b1dc2f471d8b5e4a539.tar.xz
libssh-1cc1a352fc62bad36c8c9b1dc2f471d8b5e4a539.zip
sftp: Add support for append in sftp_open()
Signed-off-by: Tilo Eckert <tilo.eckert@flam.de>
Diffstat (limited to 'src')
-rw-r--r--src/sftp.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/sftp.c b/src/sftp.c
index 6ff2a381..f98601ff 100644
--- a/src/sftp.c
+++ b/src/sftp.c
@@ -1606,6 +1606,7 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags,
sftp_file handle;
ssh_string filename;
ssh_buffer buffer;
+ sftp_attributes stat_data;
uint32_t sftp_flags = 0;
uint32_t id;
@@ -1639,6 +1640,9 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags,
sftp_flags |= SSH_FXF_TRUNC;
if ((flags & O_EXCL) == O_EXCL)
sftp_flags |= SSH_FXF_EXCL;
+ if ((flags & O_APPEND) == O_APPEND) {
+ sftp_flags |= SSH_FXF_APPEND;
+ }
SSH_LOG(SSH_LOG_PACKET,"Opening file %s with sftp flags %x",file,sftp_flags);
id = sftp_get_new_id(sftp);
if (ssh_buffer_add_u32(buffer, htonl(id)) < 0 ||
@@ -1686,6 +1690,22 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags,
case SSH_FXP_HANDLE:
handle = parse_handle_msg(msg);
sftp_message_free(msg);
+ if ((flags & O_APPEND) == O_APPEND) {
+ stat_data = sftp_stat(sftp, file);
+ if (stat_data == NULL) {
+ sftp_close(handle);
+ return NULL;
+ }
+ if ((stat_data->flags & SSH_FILEXFER_ATTR_SIZE) != SSH_FILEXFER_ATTR_SIZE) {
+ ssh_set_error(sftp->session,
+ SSH_FATAL,
+ "Cannot open in append mode. Unknown file size.");
+ sftp_close(handle);
+ return NULL;
+ }
+
+ handle->offset = stat_data->size;
+ }
return handle;
default:
ssh_set_error(sftp->session, SSH_FATAL,