aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/remotelinux/linuxdevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/remotelinux/linuxdevice.cpp')
-rw-r--r--src/plugins/remotelinux/linuxdevice.cpp110
1 files changed, 44 insertions, 66 deletions
diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp
index 9b5d9c78f7..cf7fe54810 100644
--- a/src/plugins/remotelinux/linuxdevice.cpp
+++ b/src/plugins/remotelinux/linuxdevice.cpp
@@ -357,8 +357,11 @@ public:
~LinuxDevicePrivate();
bool setupShell();
- bool runInShell(const CommandLine &cmd, const QByteArray &data = {});
- std::optional<QByteArray> outputForRunInShell(const CommandLine &cmd);
+ RunResult runInShell(const CommandLine &cmd, const QByteArray &stdInData = {});
+ bool runInShellSuccess(const CommandLine &cmd, const QByteArray &stdInData = {}) {
+ return runInShell(cmd, stdInData).exitCode == 0;
+ }
+
void attachToSharedConnection(SshConnectionHandle *connectionHandle,
const SshParameters &sshParameters);
@@ -462,7 +465,7 @@ qint64 SshProcessInterface::processId() const
bool SshProcessInterface::runInShell(const CommandLine &command, const QByteArray &data)
{
- return d->m_devicePrivate->runInShell(command, data);
+ return d->m_devicePrivate->runInShellSuccess(command, data);
}
void SshProcessInterface::start()
@@ -807,20 +810,10 @@ public:
}
// Call me with shell mutex locked
- bool runInShell(const CommandLine &cmd, const QByteArray &data = {})
- {
- QTC_ASSERT(m_shell, return false);
- return m_shell->runInShell(cmd, data);
- }
-
- // Call me with shell mutex locked
- std::optional<QByteArray> outputForRunInShell(const CommandLine &cmd)
+ RunResult runInShell(const CommandLine &cmd, const QByteArray &data = {})
{
QTC_ASSERT(m_shell, return {});
- const DeviceShell::RunResult result = m_shell->outputForRunInShell(cmd);
- if (result.exitCode == 0)
- return result.stdOut;
- return {};
+ return m_shell->runInShell(cmd, data);
}
void setSshParameters(const SshParameters &sshParameters)
@@ -1104,22 +1097,13 @@ bool LinuxDevicePrivate::setupShell()
return ok;
}
-bool LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &data)
+RunResult LinuxDevicePrivate::runInShell(const CommandLine &cmd, const QByteArray &data)
{
QMutexLocker locker(&m_shellMutex);
DEBUG(cmd.toUserOutput());
- QTC_ASSERT(setupShell(), return false);
-
- return m_handler->runInShell(cmd, data);
-}
-
-std::optional<QByteArray> LinuxDevicePrivate::outputForRunInShell(const CommandLine &cmd)
-{
- QMutexLocker locker(&m_shellMutex);
- DEBUG(cmd);
QTC_ASSERT(setupShell(), return {});
- return m_handler->outputForRunInShell(cmd);
+ return m_handler->runInShell(cmd, data);
}
void LinuxDevicePrivate::attachToSharedConnection(SshConnectionHandle *connectionHandle,
@@ -1141,56 +1125,56 @@ bool LinuxDevice::isExecutableFile(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-x", path}});
+ return d->runInShellSuccess({"test", {"-x", path}});
}
bool LinuxDevice::isReadableFile(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-r", path, "-a", "-f", path}});
+ return d->runInShellSuccess({"test", {"-r", path, "-a", "-f", path}});
}
bool LinuxDevice::isWritableFile(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-w", path, "-a", "-f", path}});
+ return d->runInShellSuccess({"test", {"-w", path, "-a", "-f", path}});
}
bool LinuxDevice::isReadableDirectory(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-r", path, "-a", "-d", path}});
+ return d->runInShellSuccess({"test", {"-r", path, "-a", "-d", path}});
}
bool LinuxDevice::isWritableDirectory(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-w", path, "-a", "-d", path}});
+ return d->runInShellSuccess({"test", {"-w", path, "-a", "-d", path}});
}
bool LinuxDevice::isFile(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-f", path}});
+ return d->runInShellSuccess({"test", {"-f", path}});
}
bool LinuxDevice::isDirectory(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-d", path}});
+ return d->runInShellSuccess({"test", {"-d", path}});
}
bool LinuxDevice::createDirectory(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"mkdir", {"-p", path}});
+ return d->runInShellSuccess({"mkdir", {"-p", path}});
}
bool LinuxDevice::exists(const FilePath &filePath) const
@@ -1198,20 +1182,20 @@ bool LinuxDevice::exists(const FilePath &filePath) const
DEBUG("filepath " << filePath.path());
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"test", {"-e", path}});
+ return d->runInShellSuccess({"test", {"-e", path}});
}
bool LinuxDevice::ensureExistingFile(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
const QString path = filePath.path();
- return d->runInShell({"touch", {path}});
+ return d->runInShellSuccess({"touch", {path}});
}
bool LinuxDevice::removeFile(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return false);
- return d->runInShell({"rm", {filePath.path()}});
+ return d->runInShellSuccess({"rm", {filePath.path()}});
}
bool LinuxDevice::removeRecursively(const FilePath &filePath) const
@@ -1226,29 +1210,28 @@ bool LinuxDevice::removeRecursively(const FilePath &filePath) const
const int levelsNeeded = path.startsWith("/home/") ? 3 : 2;
QTC_ASSERT(path.count('/') >= levelsNeeded, return false);
- return d->runInShell({"rm", {"-rf", "--", path}});
+ return d->runInShellSuccess({"rm", {"-rf", "--", path}});
}
bool LinuxDevice::copyFile(const FilePath &filePath, const FilePath &target) const
{
QTC_ASSERT(handlesFile(filePath), return false);
QTC_ASSERT(handlesFile(target), return false);
- return d->runInShell({"cp", {filePath.path(), target.path()}});
+ return d->runInShellSuccess({"cp", {filePath.path(), target.path()}});
}
bool LinuxDevice::renameFile(const FilePath &filePath, const FilePath &target) const
{
QTC_ASSERT(handlesFile(filePath), return false);
QTC_ASSERT(handlesFile(target), return false);
- return d->runInShell({"mv", {filePath.path(), target.path()}});
+ return d->runInShellSuccess({"mv", {filePath.path(), target.path()}});
}
QDateTime LinuxDevice::lastModified(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return {});
- const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%Y", filePath.path()}})
- .value_or(QByteArray());
- const qint64 secs = output.toLongLong();
+ const RunResult result = d->runInShell({"stat", {"-L", "-c", "%Y", filePath.path()}});
+ const qint64 secs = result.stdOut.toLongLong();
const QDateTime dt = QDateTime::fromSecsSinceEpoch(secs, Qt::UTC);
return dt;
}
@@ -1256,18 +1239,16 @@ QDateTime LinuxDevice::lastModified(const FilePath &filePath) const
FilePath LinuxDevice::symLinkTarget(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return {});
- const QByteArray output = d->outputForRunInShell({"readlink", {"-n", "-e", filePath.path()}})
- .value_or(QByteArray());
- const QString out = QString::fromUtf8(output.data(), output.size());
- return output.isEmpty() ? FilePath() : filePath.withNewPath(out);
+ const RunResult result = d->runInShell({"readlink", {"-n", "-e", filePath.path()}});
+ return result.stdOut.isEmpty() ? FilePath()
+ : filePath.withNewPath(QString::fromUtf8(result.stdOut));
}
qint64 LinuxDevice::fileSize(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return -1);
- const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%s", filePath.path()}})
- .value_or(QByteArray());
- return output.toLongLong();
+ const RunResult result = d->runInShell({"stat", {"-L", "-c", "%s", filePath.path()}});
+ return result.stdOut.toLongLong();
}
qint64 LinuxDevice::bytesAvailable(const FilePath &filePath) const
@@ -1275,17 +1256,15 @@ qint64 LinuxDevice::bytesAvailable(const FilePath &filePath) const
QTC_ASSERT(handlesFile(filePath), return -1);
CommandLine cmd("df", {"-k"});
cmd.addArg(filePath.path());
- const QByteArray output = d->outputForRunInShell(cmd).value_or(QByteArray());
-
- return FileUtils::bytesAvailableFromDFOutput(output);
+ const RunResult result = d->runInShell(cmd);
+ return FileUtils::bytesAvailableFromDFOutput(result.stdOut);
}
QFileDevice::Permissions LinuxDevice::permissions(const FilePath &filePath) const
{
QTC_ASSERT(handlesFile(filePath), return {});
- const QByteArray output = d->outputForRunInShell({"stat", {"-L", "-c", "%a", filePath.path()}})
- .value_or(QByteArray());
- const uint bits = output.toUInt(nullptr, 8);
+ const RunResult result = d->runInShell({"stat", {"-L", "-c", "%a", filePath.path()}});
+ const uint bits = result.stdOut.toUInt(nullptr, 8);
QFileDevice::Permissions perm = {};
#define BIT(n, p) if (bits & (1<<n)) perm |= QFileDevice::p
BIT(0, ExeOther);
@@ -1305,7 +1284,7 @@ bool LinuxDevice::setPermissions(const FilePath &filePath, QFileDevice::Permissi
{
QTC_ASSERT(handlesFile(filePath), return false);
const int flags = int(permissions);
- return d->runInShell({"chmod", {QString::number(flags, 16), filePath.path()}});
+ return d->runInShellSuccess({"chmod", {QString::number(flags, 16), filePath.path()}});
}
void LinuxDevice::iterateDirectory(const FilePath &filePath,
@@ -1313,9 +1292,7 @@ void LinuxDevice::iterateDirectory(const FilePath &filePath,
const FileFilter &filter) const
{
QTC_ASSERT(handlesFile(filePath), return);
- auto runInShell = [this](const CommandLine &cmd) {
- return d->outputForRunInShell(cmd).value_or(QByteArray());
- };
+ auto runInShell = [this](const CommandLine &cmd) { return d->runInShell(cmd); };
FileUtils::iterateUnixDirectory(filePath, filter, &d->m_useFind, runInShell, callBack);
}
@@ -1331,19 +1308,20 @@ std::optional<QByteArray> LinuxDevice::fileContents(const FilePath &filePath,
}
CommandLine cmd(FilePath::fromString("dd"), args, CommandLine::Raw);
- const std::optional<QByteArray> output = d->outputForRunInShell(cmd);
- if (output) {
- DEBUG(*output << QByteArray::fromHex(*output));
- } else {
+ const RunResult result = d->runInShell(cmd);
+ if (result.exitCode != 0) {
DEBUG("fileContents failed");
+ return {};
}
- return output;
+
+ DEBUG(result.stdOut << QByteArray::fromHex(result.stdOut));
+ return result.stdOut;
}
bool LinuxDevice::writeFileContents(const FilePath &filePath, const QByteArray &data) const
{
QTC_ASSERT(handlesFile(filePath), return {});
- return d->runInShell({"dd", {"of=" + filePath.path()}}, data);
+ return d->runInShellSuccess({"dd", {"of=" + filePath.path()}}, data);
}
static FilePaths dirsToCreate(const FilesToTransfer &files)