From 226f245c71df5673b5114615fbd9ad5c285b8d3a Mon Sep 17 00:00:00 2001 From: Rafael Roquetto Date: Tue, 20 Nov 2012 18:30:15 -0200 Subject: QNX: fix QProcess fd inheritance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under QNX, QProcess was not inheriting the parent's file descriptors. This patch fills in the fd_map array, containing the file descriptors to be inherited, which is passed to spawn(), accordingly. Change-Id: Ia160abda88c1ffede877301aeae93a97c2b35320 Reviewed-by: Thiago Macieira Reviewed-by: Sérgio Martins --- src/corelib/io/qprocess_unix.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index 0a928e4603..19d0b061f1 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -107,6 +107,8 @@ QT_END_NAMESPACE #include #include #ifdef Q_OS_QNX +#include "qvarlengtharray.h" + #include #include #endif @@ -779,8 +781,21 @@ static pid_t doSpawn(int fd_count, int fd_map[], char **argv, char **envp, pid_t QProcessPrivate::spawnChild(const char *workingDir, char **argv, char **envp) { - const int fd_count = 3; - int fd_map[fd_count]; + // we need to manually fill in fd_map + // to inherit the file descriptors from + // the parent + const int fd_count = sysconf(_SC_OPEN_MAX); + QVarLengthArray fd_map(fd_count); + + for (int i = 3; i < fd_count; ++i) { + // here we rely that fcntl returns -1 and + // sets errno to EBADF + const int flags = ::fcntl(i, F_GETFD); + + fd_map[i] = ((flags >= 0) && !(flags & FD_CLOEXEC)) + ? i : SPAWN_FDCLOSED; + } + switch (processChannelMode) { case QProcess::ForwardedChannels: fd_map[0] = stdinChannel.pipe[0]; @@ -799,7 +814,7 @@ pid_t QProcessPrivate::spawnChild(const char *workingDir, char **argv, char **en break; } - pid_t childPid = doSpawn(fd_count, fd_map, argv, envp, workingDir, false); + pid_t childPid = doSpawn(fd_count, fd_map.data(), argv, envp, workingDir, false); if (childPid == -1) { QString error = qt_error_string(errno); -- cgit v1.2.3