[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
sftp_read receives EOF on second call for a 24kb file
[Thread Prev] | [Thread Next]
- Subject: sftp_read receives EOF on second call for a 24kb file
- From: "Kevin Lambert" <klambert@xxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 22 Oct 2013 15:10:46 -0400
- To: "libssh" <libssh@xxxxxxxxxx>
I have built and am running libssh 0.5.5 for windows x32 and am trying to pull a 24kb file over. I have my buffer size set to 1024 (but have tried 4096 with the same result). The first call to sftp_read returns back 1024 as the count of bytes read but the subsequent call returns 0. When I stepped through sftp_read I found that sftp_read was receiving SSH_FX_EOF even though there is still 23kb left to read. Am I opening the ssh or sftp session incorrectly? I have attached the relevant code. Thanks, Kevin
int SshHelper::InitFtpSession(ssh_session &sshSession, sftp_session &sftpSession) { int port = 22; int timeout = 10; //seconds int rc; sshSession = ssh_new(); if ( sshSession == NULL ) { TRACE("SshHelper::InitFtpSession - Unable to obtain SSH session"); return SSH_ERROR; } ssh_options_set(sshSession, SSH_OPTIONS_HOST, mIpAddress.c_str()); ssh_options_set(sshSession, SSH_OPTIONS_USER, mUsername.c_str()); ssh_options_set(sshSession, SSH_OPTIONS_PORT, &port); ssh_options_set(sshSession, SSH_OPTIONS_TIMEOUT, &timeout); try { rc = ssh_connect(sshSession); if ( rc != SSH_OK ) { ssh_free(sshSession); TRACE((char*)String::F("SshHelper::InitFtpSession error connecting to modem. Address %s:%d, Username %s, Timeout: %d", mIpAddress.c_str(), port, mUsername.c_str(), timeout).c_str()); return SSH_ERROR; } } catch (...) { TRACE("SshHelper::InitFtpSession Crash"); } sftpSession = sftp_new(sshSession); if ( sftpSession == NULL ) { TRACE("SshHelper::InitFtpSession - Unable to obtaion SFTP session"); return SSH_ERROR; } rc = sftp_init(sftpSession); if ( rc != SSH_OK ) { TRACE("SshHelper::InitFtpSession - Unable to init sftp session"); return rc; } return SSH_OK; } int SshHelper::GetFile(String source, String destination) { sftp_session sftp = NULL; ssh_session sshSession = NULL; int rc = SSH_OK; char buffer[1024]; size_t length = sizeof(buffer); size_t totalLength = 0; std::ofstream destFile; rc = InitFtpSession( sshSession, sftp ); if ( rc != SSH_OK ) { TRACE("SshHelper::GetFile - Failure to init sftp session"); } destFile.open(destination.c_str(), std::ios::out); //read a file int access_type = O_RDONLY; sftp_file file = sftp_open(sftp, source.c_str(), access_type, 0); if ( file == NULL ) { TRACE("SshHelper::GetFile - Failure to open file for writing"); } else { 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); } } destFile.close(); // Cleanup try { sftp_free(sftp); ssh_disconnect(sshSession); ssh_free(sshSession); } catch (...) { TRACE("SshHelper::GetFile - Exception during cleanup"); } return rc; }
Archive administrator: postmaster@lists.cynapses.org