diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-01 21:41:56 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-01 21:41:56 +0200 |
commit | c4e67730a3ac2c921420b068b7f72e0675a12c43 (patch) | |
tree | 5fc1bd381e95a64a4f40a75cd4902f882e0448ae | |
parent | 9f7e2c32524052b4b0e234b84195869d950943f9 (diff) | |
download | libssh-c4e67730a3ac2c921420b068b7f72e0675a12c43.tar.gz libssh-c4e67730a3ac2c921420b068b7f72e0675a12c43.tar.xz libssh-c4e67730a3ac2c921420b068b7f72e0675a12c43.zip |
Convert sftp.c to ssh_channel_read
-rw-r--r-- | src/sftp.c | 28 |
1 files changed, 22 insertions, 6 deletions
@@ -288,8 +288,10 @@ int sftp_packet_write(sftp_session sftp, uint8_t type, ssh_buffer payload){ } sftp_packet sftp_packet_read(sftp_session sftp) { + unsigned char buffer[4096]; sftp_packet packet = NULL; uint32_t size; + int r; sftp_enter_function(); @@ -306,13 +308,14 @@ sftp_packet sftp_packet_read(sftp_session sftp) { return NULL; } - if (channel_read_buffer(sftp->channel, packet->payload, 4, 0) <= 0) { + r=ssh_channel_read(sftp->channel, buffer, 4, 0); + if (r < 0) { ssh_buffer_free(packet->payload); SAFE_FREE(packet); sftp_leave_function(); return NULL; } - + buffer_add_data(packet->payload,buffer, r); if (buffer_get_u32(packet->payload, &size) != sizeof(uint32_t)) { ssh_set_error(sftp->session, SSH_FATAL, "Short sftp packet!"); ssh_buffer_free(packet->payload); @@ -322,23 +325,36 @@ sftp_packet sftp_packet_read(sftp_session sftp) { } size = ntohl(size); - if (channel_read_buffer(sftp->channel, packet->payload, 1, 0) <= 0) { + r=ssh_channel_read(sftp->channel, buffer, 1, 0); + if (r <= 0) { /* TODO: check if there are cases where an error needs to be set here */ ssh_buffer_free(packet->payload); SAFE_FREE(packet); sftp_leave_function(); return NULL; } - + buffer_add_data(packet->payload, buffer, r); buffer_get_u8(packet->payload, &packet->type); - if (size > 1) { - if (channel_read_buffer(sftp->channel, packet->payload, size - 1, 0) <= 0) { + size=size-1; + while (size>0){ + r=ssh_channel_read(sftp->channel,buffer, + sizeof(buffer)>size ? size:sizeof(buffer),0); + + if(r <= 0) { /* TODO: check if there are cases where an error needs to be set here */ ssh_buffer_free(packet->payload); SAFE_FREE(packet); sftp_leave_function(); return NULL; } + if(buffer_add_data(packet->payload,buffer,r)==SSH_ERROR){ + ssh_buffer_free(packet->payload); + SAFE_FREE(packet); + sftp_leave_function(); + ssh_set_error_oom(sftp->session); + return NULL; + } + size -= r; } sftp_leave_function(); |