[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: sftp_read receives EOF on second call for a 24kb file
[Thread Prev] | [Thread Next]
- Subject: Re: sftp_read receives EOF on second call for a 24kb file
- From: Darren <d.tomlin@xxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Wed, 23 Oct 2013 09:19:44 -0400
- To: libssh@xxxxxxxxxx
Hi Andreas :o), Many thanks for LibSSH! Alas, I believe it is a bug in libssh which is why I came up with that work around. I know it's not a great solution but it does work for the time being ;) -Darren. -----Original Message----- From: Kevin Lambert <klambert@xxxxxxxxx> To: libssh@xxxxxxxxxx Sent: Wed, 23 Oct 2013 13:33 Subject: RE: sftp_read receives EOF on second call for a 24kb file That is what I was asking about. I have a 24kb file that I was trying to transfer in 1kb chunks, transferred 1kb without a problem but on my second call to sftp_read there was a SSH_FX_EOF received at line 1802 in sftp.c (version 0.5.5). I built this with openssl 1.0.1. The reason I sent the ssh_session init along with the sftp code was incase there was something I was doing wrong in the ssh session initialization to cause this. My read loop is as such: char buffer[1024]; size_t length = sizeof(buffer); size_t totalLength = 0; size_t count = 0; count = sftp_read(file, buffer, length); while ( count > 0 ) { if ( destFile.is_open() ) { destFile.write(buffer, length); } totalLength += count; count = sftp_read(file, buffer, length); } Kevin -----Original Message----- From: Aris Adamantiadis [mailto:aris@xxxxxxxxxxxx] Sent: Wednesday, October 23, 2013 7:47 AM To: libssh@xxxxxxxxxx Subject: Re: sftp_read receives EOF on second call for a 24kb file Hi Andreas, I think Kevin complained that sftp_read returned an EOF condition when the file was not fully read, and if it does it's a bug in libssh. Aris Le 23/10/13 09:53, Andreas Schneider a écrit : > On Tuesday 22 October 2013 18:58:17 Darren wrote: >> Hi Kevin, >> >> Assuming remote to local transfer: >> >> You read the first chunk of data, and use sftp_seek to move the file >> pointer >> > > There is absolutely no need to call sftp_seek() you only need it if > you resume a transfer. The API works the same way as the POSIX API. > Files should be transferred in small chunks. > > #define MAX_XFER_BUF_SIZE 16384 > > char buf[MAX_XFER_BUF_SIZE]; > > file = sftp_open(sftp, path, O_RDONLY, 0); > > for (;;) { > bytesread = sftp_read(file, buf, MAX_XFER_BUF_SIZE); > if (bytesread == 0) { > break; /* EOF */ > } else if (bytesread < 0) { > /* ERROR HANDLING */ > } > > byteswritten = write(fd, buf, MAX_XFER_BUF_SIZE) > if (byteswritten != bytesread) { > /* ERROR */ > } > } > > This way I can transfer files which are several gigabyte of size. > > > -- andreas >
#include <libssh/libssh.h> #include <libssh/sftp.h> #include <stdlib.h> #include <stdio.h> int main() { ssh_session my_ssh_session = ssh_new(); int verbosity = SSH_LOG_PROTOCOL; int port = 22; int rc; if (my_ssh_session == NULL) { exit(-1); } ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "<host>"); ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); rc = ssh_connect(my_ssh_session); rc = ssh_userauth_password(my_ssh_session, NULL, "<password>"); sftp_session sftp; sftp = sftp_new(my_ssh_session); rc = sftp_init(sftp); sftp_file file; int access_type; char *buffer = malloc(1024); //char *buffer[1024]; int nbytes; sftp_attributes getFileSize; int getRemainder = 0; int getExcess = 0; int buffersize = 1024; int FCount = 0; file = sftp_open(sftp, "/home/Owner/test.pdf", 0, 0); getFileSize = sftp_stat(sftp, "/home/Owner/test.pdf"); getRemainder = getFileSize->size%buffersize; getExcess = getFileSize->size - getRemainder; FILE *fp; fp = fopen("test.pdf", "w+b"); if(getFileSize < buffersize) { nbytes = sftp_read(file, buffer, buffersize); fwrite(buffer, sizeof(buffer), nbytes, fp); } else { while(FCount != getExcess) { nbytes = sftp_read(file, buffer, buffersize); FCount = FCount + buffersize; fwrite(buffer, sizeof(buffer), FCount, fp); sftp_seek(file, FCount); fseek(fp, FCount, 0); } if(getRemainder > 0) { nbytes = sftp_read(file, buffer, getRemainder); fwrite(buffer, sizeof(buffer), getRemainder, fp); } } free(buffer); fclose(fp); // ------------------------------------- }
RE: sftp_read receives EOF on second call for a 24kb file | "Kevin Lambert" <klambert@xxxxxxxxx> |
RE: sftp_read receives EOF on second call for a 24kb file | "Kevin Lambert" <klambert@xxxxxxxxx> |
RE: sftp_read receives EOF on second call for a 24kb file | "Kevin Lambert" <klambert@xxxxxxxxx> |