|
- diff --git a/modules/juce_core/native/juce_linux_Files.cpp b/modules/juce_core/native/juce_linux_Files.cpp
- index f661e4ab4..dce73fcc2 100644
- --- a/modules/juce_core/native/juce_linux_Files.cpp
- +++ b/modules/juce_core/native/juce_linux_Files.cpp
- @@ -223,15 +223,21 @@ bool Process::openDocument (const String& fileName, const String& parameters)
-
- const char* const argv[] = { "/bin/sh", "-c", cmdString.toUTF8(), nullptr };
-
- +#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 (execve (argv[0], (char**) argv, environ) < 0)
- + _exit (0);
- }
-
- return cpid >= 0;
- diff --git a/modules/juce_core/native/juce_mac_Files.mm b/modules/juce_core/native/juce_mac_Files.mm
- index aefa76317..066c12cde 100644
- --- a/modules/juce_core/native/juce_mac_Files.mm
- +++ b/modules/juce_core/native/juce_mac_Files.mm
- @@ -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
- }
- diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h
- index f3a8f061b..bcd3eab59 100644
- --- a/modules/juce_core/native/juce_posix_SharedCode.h
- +++ b/modules/juce_core/native/juce_posix_SharedCode.h
- @@ -1125,7 +1125,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)
- {
- @@ -1134,6 +1145,7 @@ public:
- }
- else if (result == 0)
- {
- +#if ! JUCE_USE_VFORK
- // we're the child process..
- close (pipeHandles[0]); // close the read handle
-
- @@ -1148,17 +1160,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
- {
|