[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> |