コード例 #1
0
ファイル: file.c プロジェクト: LubkaB/mc
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;
}
コード例 #2
0
ファイル: sftpfileengine.cpp プロジェクト: komh/kfw
bool SFtpFileEngine::atEnd() const
{
    qDebug() << "atEnd()" << _fileName;

    return _urlInfo.size()
                >= static_cast<qint64>(libssh2_sftp_tell64(_sftp_handle));
}
コード例 #3
0
ファイル: file.c プロジェクト: LubkaB/mc
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;
}
コード例 #4
0
ファイル: file.c プロジェクト: NoSeungHwan/mc_kor_dev
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;
}