Browse Source

Fix fork/exec usage

Signed-off-by: falkTX <falktx@falktx.com>
v6.0.8-distrho
falkTX 2 years ago
parent
commit
1632cbdc9a
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
3 changed files with 34 additions and 24 deletions
  1. +9
    -3
      modules/juce_core/native/juce_linux_Files.cpp
  2. +9
    -10
      modules/juce_core/native/juce_mac_Files.mm
  3. +16
    -11
      modules/juce_core/native/juce_posix_SharedCode.h

+ 9
- 3
modules/juce_core/native/juce_linux_Files.cpp View File

@@ -211,15 +211,21 @@ bool Process::openDocument (const String& fileName, const String& parameters)
const char* const argv[4] = { "/bin/sh", "-c", cmdString.toUTF8(), nullptr };
auto cpid = fork();
#if JUCE_USE_VFORK
const auto cpid = vfork();
#else
const auto cpid = fork();
#endif
if (cpid == 0)
{
#if ! JUCE_USE_VFORK
setsid();
#endif
// Child process
execve (argv[0], (char**) argv, environ);
exit (0);
if (execvp (argv[0], (char**) argv) < 0)
_exit (0);
}
return cpid >= 0;


+ 9
- 10
modules/juce_core/native/juce_mac_Files.mm View File

@@ -92,23 +92,22 @@ namespace MacFileHelpers
#else
static bool launchExecutable (const String& pathAndArguments)
{
const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr };
#if JUCE_USE_VFORK
const auto cpid = vfork();
#else
auto cpid = fork();
#endif
if (cpid == 0)
{
const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr };
// Child process
if (execve (argv[0], (char**) argv, nullptr) < 0)
exit (0);
}
else
{
if (cpid < 0)
return false;
if (execvp (argv[0], (char**) argv) < 0)
_exit (0);
}
return true;
return cpid >= 0;
}
#endif
}


+ 16
- 11
modules/juce_core/native/juce_posix_SharedCode.h View File

@@ -1104,7 +1104,18 @@ public:
if (pipe (pipeHandles) == 0)
{
auto result = fork();
Array<char*> argv;
for (auto& arg : arguments)
if (arg.isNotEmpty())
argv.add (const_cast<char*> (arg.toRawUTF8()));
argv.add (nullptr);
#if JUCE_USE_VFORK
const pid_t result = vfork();
#else
const pid_t result = fork();
#endif
if (result < 0)
{
@@ -1113,6 +1124,7 @@ public:
}
else if (result == 0)
{
#if ! JUCE_USE_VFORK
// we're the child process..
close (pipeHandles[0]); // close the read handle
@@ -1127,17 +1139,10 @@ public:
dup2 (open ("/dev/null", O_WRONLY), STDERR_FILENO);
close (pipeHandles[1]);
#endif
Array<char*> argv;
for (auto& arg : arguments)
if (arg.isNotEmpty())
argv.add (const_cast<char*> (arg.toRawUTF8()));
argv.add (nullptr);
execvp (exe.toRawUTF8(), argv.getRawDataPointer());
_exit (-1);
if (execvp (exe.toRawUTF8(), argv.getRawDataPointer()) < 0)
_exit (-1);
}
else
{


Loading…
Cancel
Save