diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2016-06-01 09:41:15 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-03-31 17:37:30 +0000 |
commit | 6ba8708a2fdec666172446783a7ff292cd454055 (patch) | |
tree | 578c23babbc6da2622efd86d7d2282f26a83c7bf /src/corelib/io/qprocess_unix.cpp | |
parent | 28666d167aa8e602c0bea25ebc4d51b55005db13 (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.cpp | 14 |
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)); |