1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-11-27 13:21:11 +03:00

sftp: Add support for append in sftp_open()

Signed-off-by: Tilo Eckert <tilo.eckert@flam.de>
This commit is contained in:
Tilo Eckert
2016-07-01 10:57:38 +02:00
committed by Andreas Schneider
parent cfe7065ce1
commit 1cc1a352fc

View File

@@ -1606,6 +1606,7 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags,
sftp_file handle; sftp_file handle;
ssh_string filename; ssh_string filename;
ssh_buffer buffer; ssh_buffer buffer;
sftp_attributes stat_data;
uint32_t sftp_flags = 0; uint32_t sftp_flags = 0;
uint32_t id; uint32_t id;
@@ -1639,6 +1640,9 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags,
sftp_flags |= SSH_FXF_TRUNC; sftp_flags |= SSH_FXF_TRUNC;
if ((flags & O_EXCL) == O_EXCL) if ((flags & O_EXCL) == O_EXCL)
sftp_flags |= SSH_FXF_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); SSH_LOG(SSH_LOG_PACKET,"Opening file %s with sftp flags %x",file,sftp_flags);
id = sftp_get_new_id(sftp); id = sftp_get_new_id(sftp);
if (ssh_buffer_add_u32(buffer, htonl(id)) < 0 || 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: case SSH_FXP_HANDLE:
handle = parse_handle_msg(msg); handle = parse_handle_msg(msg);
sftp_message_free(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; return handle;
default: default:
ssh_set_error(sftp->session, SSH_FATAL, ssh_set_error(sftp->session, SSH_FATAL,