[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: sftp_read receives EOF on second call for a 24kb file




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);
    // -------------------------------------

}

Follow-Ups:
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>
References:
RE: sftp_read receives EOF on second call for a 24kb file"Kevin Lambert" <klambert@xxxxxxxxx>
Archive administrator: postmaster@lists.cynapses.org