| 42 | } |
| 43 | |
| 44 | int CChannelSFTP::Process() |
| 45 | { |
| 46 | int nRet = 0; |
| 47 | |
| 48 | struct timeval timeout = {0, DEFAULT_TIMEOUT}; |
| 49 | ssh_channel channels[2], channel_out[2]; |
| 50 | channels[0] = nullptr; //m_SessionSftp->channel; |
| 51 | channels[1] = nullptr; |
| 52 | |
| 53 | fd_set set; |
| 54 | FD_ZERO(&set); |
| 55 | socket_t fdEvent = SSH_INVALID_SOCKET; |
| 56 | if(m_pEvent) |
| 57 | fdEvent = m_pEvent->GetFd(); |
| 58 | if(SSH_INVALID_SOCKET != fdEvent) |
| 59 | FD_SET(fdEvent, &set); |
| 60 | |
| 61 | socket_t sshFd = ssh_get_fd(m_Session); |
| 62 | if(SSH_INVALID_SOCKET != sshFd) |
| 63 | FD_SET(sshFd, &set); |
| 64 | |
| 65 | socket_t f = qMax(sshFd, fdEvent); |
| 66 | //qDebug(log) << "ssh_select:" << fdEvent; |
| 67 | nRet = ssh_select(channels, channel_out, f + 1, &set, &timeout); |
| 68 | //qDebug(log) << "ssh_select end:" << nRet; |
| 69 | if(EINTR == nRet) |
| 70 | return 0; |
| 71 | |
| 72 | if(SSH_OK != nRet) { |
| 73 | QString szErr; |
| 74 | szErr = "ssh_channel_select failed: " + QString::number(nRet); |
| 75 | szErr += ssh_get_error(m_Session); |
| 76 | qCritical(log) << szErr; |
| 77 | setErrorString(szErr); |
| 78 | return -3; |
| 79 | } |
| 80 | |
| 81 | if(SSH_INVALID_SOCKET != fdEvent && FD_ISSET(fdEvent, &set)) { |
| 82 | //qDebug(log) << "fires event"; |
| 83 | if(m_pEvent) { |
| 84 | nRet = m_pEvent->Reset(); |
| 85 | if(nRet) { |
| 86 | QString szErr = "Reset event fail"; |
| 87 | qCritical(log) << szErr; |
| 88 | setErrorString(szErr); |
| 89 | return -4; |
| 90 | } |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | AsyncReadDir(); |
| 95 | |
| 96 | AsyncFile(); |
| 97 | |
| 98 | return 0; |
| 99 | } |
| 100 | |
| 101 | QSharedPointer<CRemoteFileSystem> CChannelSFTP::GetFileNode( |