diff options
Diffstat (limited to 'process.cpp')
-rw-r--r-- | process.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/process.cpp b/process.cpp index 4c9140d..1320d02 100644 --- a/process.cpp +++ b/process.cpp @@ -26,6 +26,8 @@ #include <signal.h> #include <fcntl.h> #include <QFileInfo> +#include <QTcpSocket> +#include <errno.h> static int pipefd[2]; @@ -86,6 +88,7 @@ Process::Process() , mProcess(new QProcess(this)) , mDebuggee(0) , mDebug(false) + , mStdoutFd(1) { mProcess->setProcessChannelMode(QProcess::SeparateChannels); connect(mProcess, &QProcess::readyReadStandardError, this, &Process::readyReadStandardError); @@ -112,13 +115,29 @@ Process::~Process() close(pipefd[1]); } -void Process::readyReadStandardOutput() +void Process::forwardProcessOutput(qintptr fd, const QByteArray &data) { - QByteArray b = mProcess->readAllStandardOutput(); - write(1, b.constData(), b.size()); + const char *constData = data.constData(); + int size = data.size(); + while (size > 0) { + int written = write(fd, constData, size); + if (written == -1) { + fprintf(stderr, "Cannot forward application output: %d - %s\n", errno, strerror(errno)); + qApp->quit(); + break; + } + size -= written; + constData += written; + } if (mConfig.flags.testFlag(Config::PrintDebugMessages)) - qDebug() << b; + qDebug() << data; +} + + +void Process::readyReadStandardOutput() +{ + forwardProcessOutput(mStdoutFd, mProcess->readAllStandardOutput()); } void Process::readyReadStandardError() @@ -131,10 +150,7 @@ void Process::readyReadStandardError() } mDebug = false; // only search once } - write(2, b.constData(), b.size()); - - if (mConfig.flags.testFlag(Config::PrintDebugMessages)) - qDebug() << b; + forwardProcessOutput(2, b); } void Process::setDebug() @@ -246,6 +262,11 @@ void Process::setConfig(const Config &config) mConfig = config; } +void Process::setStdoutFd(qintptr stdoutFd) +{ + mStdoutFd = stdoutFd; +} + QProcessEnvironment Process::interactiveProcessEnvironment() const { QProcessEnvironment env; @@ -311,4 +332,3 @@ QProcessEnvironment Process::interactiveProcessEnvironment() const return env; } - |