ssize_t sftpfs_write_file (vfs_file_handler_t * file_handler, const char *buffer, size_t count, GError ** error) { ssize_t rc; sftpfs_file_handler_data_t *file_handler_data; sftpfs_super_data_t *super_data; file_handler_data = (sftpfs_file_handler_data_t *) file_handler->data; super_data = (sftpfs_super_data_t *) file_handler->ino->super->data; file_handler->pos = (off_t) libssh2_sftp_tell64 (file_handler_data->handle); do { rc = libssh2_sftp_write (file_handler_data->handle, buffer, count); if (rc >= 0) break; if (rc != LIBSSH2_ERROR_EAGAIN) { sftpfs_ssherror_to_gliberror (super_data, rc, error); return -1; } sftpfs_waitsocket (super_data, error); if (error != NULL && *error != NULL) return -1; } while (rc == LIBSSH2_ERROR_EAGAIN); return rc; }
bool SFtpFileEngine::atEnd() const { qDebug() << "atEnd()" << _fileName; return _urlInfo.size() >= static_cast<qint64>(libssh2_sftp_tell64(_sftp_handle)); }
off_t sftpfs_lseek (vfs_file_handler_t * file_handler, off_t offset, int whence, GError ** error) { sftpfs_file_handler_data_t *file_handler_data; switch (whence) { case SEEK_SET: /* Need reopen file because: "You MUST NOT seek during writing or reading a file with SFTP, as the internals use outstanding packets and changing the "file position" during transit will results in badness." */ if (file_handler->pos > offset || offset == 0) { sftpfs_reopen (file_handler, error); if (error != NULL && *error != NULL) return 0; } file_handler->pos = offset; break; case SEEK_CUR: file_handler->pos += offset; break; case SEEK_END: if (file_handler->pos > file_handler->ino->st.st_size - offset) { sftpfs_reopen (file_handler, error); if (error != NULL && *error != NULL) return 0; } file_handler->pos = file_handler->ino->st.st_size - offset; break; } file_handler_data = (sftpfs_file_handler_data_t *) file_handler->data; libssh2_sftp_seek64 (file_handler_data->handle, file_handler->pos); file_handler->pos = (off_t) libssh2_sftp_tell64 (file_handler_data->handle); return file_handler->pos; }
ssize_t sftpfs_read_file (vfs_file_handler_t * file_handler, char *buffer, size_t count, GError ** mcerror) { ssize_t rc; sftpfs_file_handler_data_t *file_handler_data; sftpfs_super_data_t *super_data; mc_return_val_if_error (mcerror, -1); if (file_handler == NULL || file_handler->data == NULL) { mc_propagate_error (mcerror, -1, "%s", _("sftp: No file handler data present for reading file")); return -1; } file_handler_data = file_handler->data; super_data = (sftpfs_super_data_t *) file_handler->ino->super->data; do { rc = libssh2_sftp_read (file_handler_data->handle, buffer, count); if (rc >= 0) break; if (rc != LIBSSH2_ERROR_EAGAIN) { sftpfs_ssherror_to_gliberror (super_data, rc, mcerror); return -1; } sftpfs_waitsocket (super_data, mcerror); mc_return_val_if_error (mcerror, -1); } while (rc == LIBSSH2_ERROR_EAGAIN); file_handler->pos = (off_t) libssh2_sftp_tell64 (file_handler_data->handle); return rc; }