summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qprocess_unix.cpp
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2016-06-01 09:41:15 +0200
committerJoerg Bornemann <joerg.bornemann@qt.io>2017-03-31 17:37:30 +0000
commit6ba8708a2fdec666172446783a7ff292cd454055 (patch)
tree578c23babbc6da2622efd86d7d2282f26a83c7bf /src/corelib/io/qprocess_unix.cpp
parent28666d167aa8e602c0bea25ebc4d51b55005db13 (diff)
QProcess::startDetached: support custom process environment
Starting a detached process with a custom process environment can now be achieved by: QProcess p; p.setProgram("foo"); p.setProcessEnvironment(myEnv); p.startDetached(); [ChangeLog][QtCore][QProcess] Added the ability to set a custom process environment for detached processes. Task-number: QTBUG-2284 Change-Id: I49406dffb64fa2aed41ea05cb271bd42eeabb729 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/io/qprocess_unix.cpp')
-rw-r--r--src/corelib/io/qprocess_unix.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 047a8ddc11..e72773d7a4 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -937,6 +937,14 @@ bool QProcessPrivate::startDetached(qint64 *pid)
argv[i + 1] = ::strdup(QFile::encodeName(arguments.at(i)).constData());
argv[arguments.size() + 1] = 0;
+ // Duplicate the environment.
+ int envc = 0;
+ char **envp = nullptr;
+ if (environment.d.constData()) {
+ QProcessEnvironmentPrivate::MutexLocker locker(environment.d);
+ envp = _q_dupEnvironment(environment.d.constData()->hash, &envc);
+ }
+
QByteArray tmp;
if (!program.contains(QLatin1Char('/'))) {
const QString &exeFilePath = QStandardPaths::findExecutable(program);
@@ -946,7 +954,11 @@ bool QProcessPrivate::startDetached(qint64 *pid)
if (tmp.isEmpty())
tmp = QFile::encodeName(program);
argv[0] = tmp.data();
- qt_safe_execv(argv[0], argv);
+
+ if (envp)
+ qt_safe_execve(argv[0], argv, envp);
+ else
+ qt_safe_execv(argv[0], argv);
struct sigaction noaction;
memset(&noaction, 0, sizeof(noaction));