3#include "ChannelSSHTerminal.h"
4#include <QLoggingCategory>
6static Q_LOGGING_CATEGORY(log,
"Plugin.SSH.Channel")
11 qDebug(log) << Q_FUNC_INFO;
14CChannelSSHTerminal::~CChannelSSHTerminal()
16 qDebug(log) << Q_FUNC_INFO;
19qint64 CChannelSSHTerminal::readData(
char *data, qint64 maxlen)
22 if(!m_Channel || !ssh_channel_is_open(m_Channel))
24 nRet = ssh_channel_read(m_Channel, data, maxlen, 0);
25 m_nBytesAvailable -= nRet;
30qint64 CChannelSSHTerminal::writeData(
const char *data, qint64 maxlen)
33 if(!m_Channel || !ssh_channel_is_open(m_Channel))
36 nRet = ssh_channel_write(m_Channel, data, maxlen);
41int CChannelSSHTerminal::OnOpen(ssh_session session)
46 m_Channel = ssh_channel_new(session);
47 if (m_Channel == NULL) {
48 szErr = QString(
"Don't create channel: ") + ssh_get_error(session);
49 qCritical(log) << szErr;
50 setErrorString(szErr);
53 nRet = ssh_channel_open_session(m_Channel);
55 szErr = QString(
"Error opening channel: ") + ssh_get_error(session);
56 qCritical(log) << szErr;
57 setErrorString(szErr);
60 nRet = ssh_channel_request_pty(m_Channel);
62 szErr = QString(
"Error request pty: ") + ssh_get_error(session);
63 qCritical(log) << szErr;
64 setErrorString(szErr);
67 nRet = ssh_channel_change_pty_size(m_Channel, m_nColumn, m_nRow);
69 szErr = QString(
"Error change pty size: ") + ssh_get_error(session);
70 qCritical(log) << szErr;
71 setErrorString(szErr);
74 qDebug(log) <<
"row:" << m_nRow <<
"; column:" << m_nColumn;
75 nRet = ssh_channel_request_shell(m_Channel);
77 szErr = QString(
"Requesting shell: ") + ssh_get_error(session);
78 qCritical(log) << szErr;
79 setErrorString(szErr);
86void CChannelSSHTerminal::OnClose()
89 if(ssh_channel_is_open(m_Channel)) {
90 ssh_channel_close(m_Channel);
92 ssh_channel_free(m_Channel);
97void CChannelSSHTerminal::SetSize(
int row,
int column)
103int CChannelSSHTerminal::OnProcess(
int tm)
107 m_nBytesAvailable = 0;
108 if(!m_Channel || !ssh_channel_is_open(m_Channel)
109 || ssh_channel_is_eof(m_Channel)) {
110 QString szErr =
"The channel is not open";
111 qCritical(log) << szErr;
112 setErrorString(szErr);
116 struct timeval timeout = {0, tm};
117 ssh_channel channels[2], channel_out[2];
118 channels[0] = m_Channel;
119 channels[1] =
nullptr;
123 socket_t fd = SSH_INVALID_SOCKET;
125 fd = m_pEvent->GetFd();
126 if(SSH_INVALID_SOCKET != fd)
130 nRet = ssh_select(channels, channel_out, fd + 1, &set, &timeout);
137 szErr =
"ssh_channel_select failed: " + QString::number(nRet);
138 szErr += ssh_get_error(m_Session);
139 qCritical(log) << szErr;
140 setErrorString(szErr);
144 if(SSH_INVALID_SOCKET != fd && FD_ISSET(fd, &set)) {
147 nRet = m_pEvent->Reset();
152 if(!channel_out[0]) {
157 if(ssh_channel_is_eof(m_Channel)) {
158 qWarning(log) <<
"Channel is eof";
159 setErrorString(tr(
"The channel is eof"));
165 nRet = ssh_channel_poll(m_Channel, 0);
167 if(SSH_ERROR == nRet)
170 szErr =
"ssh_channel_poll failed. nRet:";
171 szErr += QString::number(nRet);
172 szErr += ssh_get_error(m_Session);
173 setErrorString(szErr);
174 qCritical(log) << szErr;
176 }
else if(SSH_EOF == nRet) {
179 }
else if(0 > nRet) {
181 szErr =
"ssh_channel_poll failed. nRet:";
182 szErr += QString::number(nRet);
183 szErr += ssh_get_error(m_Session);
184 setErrorString(szErr);
185 qCritical(log) << szErr;
188 }
else if(0 == nRet) {
193 m_nBytesAvailable = nRet;
199qint64 CChannelSSHTerminal::bytesAvailable()
const
201 return m_nBytesAvailable;