Fixes a crash introduced with the mentioned revision, since one can only
have a single instance of the ne7ssh object. Poroper fix follows next.

Reviewed-by: ck
This commit is contained in:
kh1
2010-04-07 15:45:36 +02:00
parent 88a1db1787
commit 31ed02486f
2 changed files with 20 additions and 19 deletions

View File

@@ -55,6 +55,8 @@
namespace Qt4ProjectManager { namespace Qt4ProjectManager {
namespace Internal { namespace Internal {
namespace { namespace {
ne7ssh ssh;
char *alloc(size_t n) char *alloc(size_t n)
{ {
return new char[n]; return new char[n];
@@ -65,7 +67,7 @@ namespace {
MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf, MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf,
bool shell) bool shell)
: ssh(new ne7ssh), m_channel(-1), m_stopRequested(false) : m_channel(-1), m_stopRequested(false)
{ {
const QString *authString; const QString *authString;
int (ne7ssh::*connFunc)(const char *, int, const char *, const char *, bool, int); int (ne7ssh::*connFunc)(const char *, int, const char *, const char *, bool, int);
@@ -76,8 +78,7 @@ MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf,
authString = &devConf.keyFile; authString = &devConf.keyFile;
connFunc = &ne7ssh::connectWithKey; connFunc = &ne7ssh::connectWithKey;
} }
m_channel = (ssh.*connFunc)(devConf.host.toLatin1(), devConf.sshPort,
m_channel = (ssh.data()->*connFunc)(devConf.host.toLatin1(), devConf.sshPort,
devConf.uname.toAscii(), authString->toLatin1(), shell, devConf.timeout); devConf.uname.toAscii(), authString->toLatin1(), shell, devConf.timeout);
if (m_channel == -1) if (m_channel == -1)
throw MaemoSshException(tr("Could not connect to host")); throw MaemoSshException(tr("Could not connect to host"));
@@ -86,12 +87,12 @@ MaemoSshConnection::MaemoSshConnection(const MaemoDeviceConfig &devConf,
MaemoSshConnection::~MaemoSshConnection() MaemoSshConnection::~MaemoSshConnection()
{ {
qDebug("%s", Q_FUNC_INFO); qDebug("%s", Q_FUNC_INFO);
ssh->close(m_channel); ssh.close(m_channel);
} }
const char *MaemoSshConnection::lastError() const char *MaemoSshConnection::lastError()
{ {
return ssh->errors()->pop(channel()); return ssh.errors()->pop(channel());
} }
void MaemoSshConnection::stop() void MaemoSshConnection::stop()
@@ -103,31 +104,35 @@ MaemoInteractiveSshConnection::MaemoInteractiveSshConnection(const MaemoDeviceCo
: MaemoSshConnection(devConf, true), m_prompt(0) : MaemoSshConnection(devConf, true), m_prompt(0)
{ {
m_prompt = devConf.uname == QLatin1String("root") ? "# " : "$ "; m_prompt = devConf.uname == QLatin1String("root") ? "# " : "$ ";
if (!ssh->waitFor(channel(), m_prompt, devConf.timeout)) if (!ssh.waitFor(channel(), m_prompt, devConf.timeout)) {
throw MaemoSshException(tr("Could not start remote shell: %1").arg(lastError())); const QString error
= tr("Could not start remote shell: %1").arg(lastError());
throw MaemoSshException(error);
}
} }
MaemoInteractiveSshConnection::~MaemoInteractiveSshConnection() MaemoInteractiveSshConnection::~MaemoInteractiveSshConnection()
{ {
ssh->send("exit\n", channel()); ssh.send("exit\n", channel());
ssh->waitFor(channel(), m_prompt, 1); ssh.waitFor(channel(), m_prompt, 1);
} }
void MaemoInteractiveSshConnection::runCommand(const QString &command) void MaemoInteractiveSshConnection::runCommand(const QString &command)
{ {
if (!ssh->send((command + QLatin1String("\n")).toLatin1().data(), if (!ssh.send((command + QLatin1String("\n")).toLatin1().data(),
channel())) { channel())) {
throw MaemoSshException(tr("Error running command: %1").arg(lastError())); throw MaemoSshException(tr("Error running command: %1")
.arg(lastError()));
} }
bool done; bool done;
do { do {
done = ssh->waitFor(channel(), m_prompt, 1); done = ssh.waitFor(channel(), m_prompt, 1);
const char * const error = lastError(); const char * const error = lastError();
if (error) if (error)
throw MaemoSshException(tr("SSH error: %1").arg(error)); throw MaemoSshException(tr("SSH error: %1").arg(error));
QScopedPointer<char, QScopedPointerArrayDeleter<char> > QScopedPointer<char, QScopedPointerArrayDeleter<char> >
output(ssh->readAndReset(channel(), alloc)); output(ssh.readAndReset(channel(), alloc));
if (output.data()) { if (output.data()) {
emit remoteOutput(QString::fromUtf8(output.data())); emit remoteOutput(QString::fromUtf8(output.data()));
if (!done) if (!done)
@@ -145,10 +150,9 @@ MaemoSftpConnection::MaemoSftpConnection(const MaemoDeviceConfig &devConf)
: MaemoSshConnection(devConf, false), : MaemoSshConnection(devConf, false),
sftp(new Ne7SftpSubsystem) sftp(new Ne7SftpSubsystem)
{ {
if (!ssh->initSftp(*sftp, channel()) || !sftp->setTimeout(devConf.timeout)) { if (!ssh.initSftp(*sftp, channel()) || !sftp->setTimeout(devConf.timeout))
throw MaemoSshException(tr("Error setting up SFTP subsystem: %1") throw MaemoSshException(tr("Error setting up SFTP subsystem: %1")
.arg(lastError())); .arg(lastError()));
}
} }
MaemoSftpConnection::~MaemoSftpConnection() MaemoSftpConnection::~MaemoSftpConnection()

View File

@@ -47,7 +47,6 @@
#include <QtCore/QSharedPointer> #include <QtCore/QSharedPointer>
#include <QtCore/QString> #include <QtCore/QString>
class ne7ssh;
class Ne7SftpSubsystem; class Ne7SftpSubsystem;
namespace Qt4ProjectManager { namespace Qt4ProjectManager {
@@ -80,8 +79,6 @@ protected:
bool stopRequested() const {return m_stopRequested; } bool stopRequested() const {return m_stopRequested; }
const char *lastError(); const char *lastError();
QScopedPointer<ne7ssh> ssh;
private: private:
int m_channel; int m_channel;
volatile bool m_stopRequested; volatile bool m_stopRequested;