Utils: Add a QtcProcess flag to keep stdin open

Needed to run e.g. gdb on-device.

Change-Id: I5a98df575478f18adf1540ced44f6808bdba0b76
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2021-06-21 15:13:22 +02:00
parent 6acc10a8bd
commit 76cf6ce983
4 changed files with 17 additions and 0 deletions

View File

@@ -128,6 +128,7 @@ public:
bool m_lowPriority = false; bool m_lowPriority = false;
bool m_disableUnixTerminal = false; bool m_disableUnixTerminal = false;
bool m_keepStdInOpen = false;
}; };
class QtcProcessPrivate : public QObject class QtcProcessPrivate : public QObject
@@ -433,6 +434,16 @@ void QtcProcess::setDisableUnixTerminal()
d->m_process->m_disableUnixTerminal = true; d->m_process->m_disableUnixTerminal = true;
} }
void QtcProcess::setKeepWriteChannelOpen()
{
d->m_process->m_keepStdInOpen = true;
}
bool QtcProcess::keepsWriteChannelOpen() const
{
return d->m_process->m_keepStdInOpen;
}
void QtcProcess::setRemoteProcessHooks(const DeviceProcessHooks &hooks) void QtcProcess::setRemoteProcessHooks(const DeviceProcessHooks &hooks)
{ {
s_deviceHooks = hooks; s_deviceHooks = hooks;

View File

@@ -173,6 +173,9 @@ public:
void closeWriteChannel(); void closeWriteChannel();
void close(); void close();
void setKeepWriteChannelOpen();
bool keepsWriteChannelOpen() const;
signals: signals:
void started(); void started();
void finished(); void finished();

View File

@@ -3851,6 +3851,7 @@ void GdbEngine::setupEngine()
if (QFileInfo(rp.debugger.workingDirectory).isDir()) if (QFileInfo(rp.debugger.workingDirectory).isDir())
m_gdbProc.setWorkingDirectory(rp.debugger.workingDirectory); m_gdbProc.setWorkingDirectory(rp.debugger.workingDirectory);
m_gdbProc.setEnvironment(gdbEnv); m_gdbProc.setEnvironment(gdbEnv);
m_gdbProc.setKeepWriteChannelOpen();
m_gdbProc.start(); m_gdbProc.start();
if (!m_gdbProc.waitForStarted()) { if (!m_gdbProc.waitForStarted()) {

View File

@@ -946,6 +946,8 @@ void DockerDevice::runProcess(QtcProcess &process) const
CommandLine cmd{"docker", {"exec"}}; CommandLine cmd{"docker", {"exec"}};
cmd.addArgs({"-w", workingDir.path()}); cmd.addArgs({"-w", workingDir.path()});
if (process.keepsWriteChannelOpen())
cmd.addArg("-i");
cmd.addArg(d->m_container); cmd.addArg(d->m_container);
cmd.addArg(origCmd.executable().path()); // Cut off the docker://.../ bits. cmd.addArg(origCmd.executable().path()); // Cut off the docker://.../ bits.
cmd.addArgs(origCmd.splitArguments(osType())); cmd.addArgs(origCmd.splitArguments(osType()));