QNX: fix QProcess fd inheritance
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 <thiago.macieira@intel.com> Reviewed-by: Sérgio Martins <sergio.martins.qnx@kdab.com>
This commit is contained in:
parent
171938ce1a
commit
226f245c71
@ -107,6 +107,8 @@ QT_END_NAMESPACE
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#ifdef Q_OS_QNX
|
#ifdef Q_OS_QNX
|
||||||
|
#include "qvarlengtharray.h"
|
||||||
|
|
||||||
#include <spawn.h>
|
#include <spawn.h>
|
||||||
#include <sys/neutrino.h>
|
#include <sys/neutrino.h>
|
||||||
#endif
|
#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)
|
pid_t QProcessPrivate::spawnChild(const char *workingDir, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
const int fd_count = 3;
|
// we need to manually fill in fd_map
|
||||||
int fd_map[fd_count];
|
// to inherit the file descriptors from
|
||||||
|
// the parent
|
||||||
|
const int fd_count = sysconf(_SC_OPEN_MAX);
|
||||||
|
QVarLengthArray<int, 1024> 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) {
|
switch (processChannelMode) {
|
||||||
case QProcess::ForwardedChannels:
|
case QProcess::ForwardedChannels:
|
||||||
fd_map[0] = stdinChannel.pipe[0];
|
fd_map[0] = stdinChannel.pipe[0];
|
||||||
@ -799,7 +814,7 @@ pid_t QProcessPrivate::spawnChild(const char *workingDir, char **argv, char **en
|
|||||||
break;
|
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) {
|
if (childPid == -1) {
|
||||||
QString error = qt_error_string(errno);
|
QString error = qt_error_string(errno);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user