diff options
-rw-r--r-- | src/corelib/io/qprocess.cpp | 18 | ||||
-rw-r--r-- | tests/auto/corelib/io/qprocess/tst_qprocess.cpp | 6 |
2 files changed, 17 insertions, 7 deletions
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp index bd25910976..842d219a43 100644 --- a/src/corelib/io/qprocess.cpp +++ b/src/corelib/io/qprocess.cpp @@ -982,33 +982,38 @@ bool QProcessPrivate::openChannels() bool QProcessPrivate::openChannelsForDetached() { // stdin channel. + bool needToOpen = (stdinChannel.type == Channel::Redirect + || stdinChannel.type == Channel::PipeSink); if (stdinChannel.type != Channel::Normal - && (stdinChannel.type != Channel::Redirect + && (!needToOpen || inputChannelMode == QProcess::ForwardedInputChannel)) { qWarning("QProcess::openChannelsForDetached: Inconsistent stdin channel configuration"); } - if (stdinChannel.type == Channel::Redirect && !openChannel(stdinChannel)) + if (needToOpen && !openChannel(stdinChannel)) return false; // stdout channel. + needToOpen = (stdoutChannel.type == Channel::Redirect + || stdoutChannel.type == Channel::PipeSource); if (stdoutChannel.type != Channel::Normal - && (stdoutChannel.type != Channel::Redirect + && (!needToOpen || processChannelMode == QProcess::ForwardedChannels || processChannelMode == QProcess::ForwardedOutputChannel)) { qWarning("QProcess::openChannelsForDetached: Inconsistent stdout channel configuration"); } - if (stdoutChannel.type == Channel::Redirect && !openChannel(stdoutChannel)) + if (needToOpen && !openChannel(stdoutChannel)) return false; // stderr channel. + needToOpen = (stderrChannel.type == Channel::Redirect); if (stderrChannel.type != Channel::Normal - && (stderrChannel.type != Channel::Redirect + && (!needToOpen || processChannelMode == QProcess::ForwardedChannels || processChannelMode == QProcess::ForwardedErrorChannel || processChannelMode == QProcess::MergedChannels)) { qWarning("QProcess::openChannelsForDetached: Inconsistent stderr channel configuration"); } - if (stderrChannel.type == Channel::Redirect && !openChannel(stderrChannel)) + if (needToOpen && !openChannel(stderrChannel)) return false; return true; @@ -2175,6 +2180,7 @@ void QProcess::startCommand(const QString &command, OpenMode mode) \li setStandardInputFile() \li setStandardOutputFile() \li setProcessChannelMode(QProcess::MergedChannels) + \li setStandardOutputProcess() \li setWorkingDirectory() \endlist All other properties of the QProcess object are ignored. diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index 3c72e9ba8a..b6ba4e546c 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -2030,14 +2030,18 @@ void tst_QProcess::setStandardOutputProcess_data() void tst_QProcess::setStandardOutputProcess() { QProcess source; + QProcess intermediate; QProcess sink; QFETCH(bool, merged); QFETCH(bool, waitForBytesWritten); source.setProcessChannelMode(merged ? QProcess::MergedChannels : QProcess::SeparateChannels); - source.setStandardOutputProcess(&sink); + source.setStandardOutputProcess(&intermediate); + intermediate.setStandardOutputProcess(&sink); source.start("testProcessEcho2/testProcessEcho2"); + intermediate.setProgram("testProcessEcho/testProcessEcho"); + QVERIFY(intermediate.startDetached()); sink.start("testProcessEcho2/testProcessEcho2"); QByteArray data("Hello, World"); |