1
0
mirror of https://git.libssh.org/projects/libssh.git synced 2025-12-02 01:17:52 +03:00

Improve sftp_write().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@604 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-04-24 10:08:46 +00:00
parent b0778ca169
commit 29e6f140fa

View File

@@ -1663,40 +1663,62 @@ int sftp_async_read(SFTP_FILE *file, void *data, u32 size, u32 id){
return SSH_ERROR; return SSH_ERROR;
} }
ssize_t sftp_write(SFTP_FILE *file, const void *buf, size_t count){ ssize_t sftp_write(SFTP_FILE *file, const void *buf, size_t count) {
SFTP_MESSAGE *msg=NULL; SFTP_SESSION *sftp = file->sftp;
SFTP_MESSAGE *msg = NULL;
STATUS_MESSAGE *status; STATUS_MESSAGE *status;
STRING *datastring; STRING *datastring;
SFTP_SESSION *sftp=file->sftp;
int id;
BUFFER *buffer; BUFFER *buffer;
buffer=buffer_new(); u32 id;
id=sftp_get_new_id(file->sftp); int len;
buffer_add_u32(buffer,id);
buffer_add_ssh_string(buffer,file->handle); buffer = buffer_new();
buffer_add_u64(buffer,htonll(file->offset)); if (buffer == NULL) {
datastring=string_new(count); return -1;
string_fill(datastring, buf, count);
buffer_add_ssh_string(buffer,datastring);
free(datastring);
if((u32) sftp_packet_write(file->sftp,SSH_FXP_WRITE,buffer)
!= buffer_get_len(buffer)) {
ssh_log(sftp->session, SSH_LOG_PACKET,
"sftp_packet_write did not write as much data as expected");
} }
datastring = string_new(count);
if (datastring == NULL) {
buffer_free(buffer); buffer_free(buffer);
while(!msg){ return -1;
if(sftp_read_and_dispatch(file->sftp)) }
string_fill(datastring, buf, count);
id = sftp_get_new_id(file->sftp);
if (buffer_add_u32(buffer, id) < 0 ||
buffer_add_ssh_string(buffer, file->handle) < 0 ||
buffer_add_u64(buffer, htonll(file->offset)) < 0 ||
buffer_add_ssh_string(buffer, datastring) < 0) {
buffer_free(buffer);
string_free(datastring);
return -1;
}
string_free(datastring);
len = sftp_packet_write(file->sftp, SSH_FXP_WRITE, buffer);
buffer_free(buffer);
if (len < 0) {
return -1;
} else if ((u32) len != buffer_get_len(buffer)) {
ssh_log(sftp->session, SSH_LOG_PACKET,
"Could not write as much data as expected");
}
while (msg == NULL) {
if (sftp_read_and_dispatch(file->sftp) < 0) {
/* something nasty has happened */ /* something nasty has happened */
return -1; return -1;
msg=sftp_dequeue(file->sftp,id);
} }
switch (msg->packet_type){ msg = sftp_dequeue(file->sftp, id);
}
switch (msg->packet_type) {
case SSH_FXP_STATUS: case SSH_FXP_STATUS:
status=parse_status_msg(msg); status = parse_status_msg(msg);
sftp_message_free(msg); sftp_message_free(msg);
if(!status) if (status == NULL) {
return -1; return -1;
}
sftp_set_error(sftp, status->status); sftp_set_error(sftp, status->status);
switch (status->status) { switch (status->status) {
case SSH_FX_OK: case SSH_FX_OK:
@@ -1706,15 +1728,18 @@ ssize_t sftp_write(SFTP_FILE *file, const void *buf, size_t count){
default: default:
break; break;
} }
ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg); ssh_set_error(sftp->session, SSH_REQUEST_DENIED,
"SFTP server: %s", status->errormsg);
file->offset += count; file->offset += count;
status_msg_free(status); status_msg_free(status);
return -1; return -1;
default: default:
ssh_set_error(sftp->session,SSH_FATAL,"Received message %d during write!",msg->packet_type); ssh_set_error(sftp->session, SSH_FATAL,
"Received message %d during write!", msg->packet_type);
sftp_message_free(msg); sftp_message_free(msg);
return -1; return -1;
} }
return -1; /* not reached */ return -1; /* not reached */
} }