diff options
author | Thiago Macieira <thiago.macieira@nokia.com> | 2008-11-25 16:44:11 +0100 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@nokia.com> | 2009-08-21 15:03:05 +0200 |
commit | 02ef8fab7e511f50e901676eac15229eb456b01c (patch) | |
tree | 107d58effefa02942f3a715b8b60894852aee83d /src/corelib/io/qprocess_unix.cpp | |
parent | f13908359f08d856c2825988e65651dbf744c0e4 (diff) |
Add a new class for handling a process's environment variables.
First of all, make it a lot easier to access individual variables by
having them in an associative container (a QHash). This fixes task
232427, albeit one release later than I had originally planned.
On Windows, the variable names in the environment are
case-insensitive, so a direct QHash isn't a good solution. Implement
code that does the uppercasing on Windows and leaves untransformed on
other platforms.
Since we're doing this anyways, use QByteArray on Unix systems, since,
in theory, the environment could contain any random binary data, which
is not representable in QString.
Task-number: 232427
Diffstat (limited to 'src/corelib/io/qprocess_unix.cpp')
-rw-r--r-- | src/corelib/io/qprocess_unix.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index d28cdc4f5f..dfeeb71cf4 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -458,11 +458,11 @@ bool QProcessPrivate::createChannel(Channel &channel) } } -static char **_q_dupEnvironment(const QHash<QString, QString> *environment, int *envc) +static char **_q_dupEnvironment(const QHash<QByteArray, QByteArray> &environment, int *envc) { *envc = 0; - if (!environment) - return 0; // use the default environment + if (environment.isEmpty()) + return 0; // if LD_LIBRARY_PATH exists in the current environment, but // not in the environment list passed by the programmer, then @@ -474,17 +474,17 @@ static char **_q_dupEnvironment(const QHash<QString, QString> *environment, int #endif const QByteArray envLibraryPath = qgetenv(libraryPath); bool needToAddLibraryPath = !envLibraryPath.isEmpty() && - !environment->contains(QLatin1String(libraryPath)); + !environment.contains(libraryPath); - char **envp = new char *[environment->count() + 2]; - envp[environment->count()] = 0; - envp[environment->count() + 1] = 0; + char **envp = new char *[environment.count() + 2]; + envp[environment.count()] = 0; + envp[environment.count() + 1] = 0; - QHash<QString, QString>::ConstIterator it = environment->constBegin(); - const QHash<QString, QString>::ConstIterator end = environment->constEnd(); + QHash<QByteArray, QByteArray>::ConstIterator it = environment.constBegin(); + const QHash<QByteArray, QByteArray>::ConstIterator end = environment.constEnd(); for ( ; it != end; ++it) { - QByteArray key = it.key().toLocal8Bit(); - QByteArray value = it.value().toLocal8Bit(); + QByteArray key = it.key(); + QByteArray value = it.value(); key.reserve(key.length() + 1 + value.length()); key.append('='); key.append(value); @@ -590,7 +590,9 @@ void QProcessPrivate::startProcess() // Duplicate the environment. int envc = 0; - char **envp = _q_dupEnvironment(environment, &envc); + char **envp = 0; + if (environment.d.constData()) + envp = _q_dupEnvironment(environment.d.constData()->hash, &envc); // Encode the working directory if it's non-empty, otherwise just pass 0. const char *workingDirPtr = 0; |