Browse Source

LibCore: Get the environment in Core::Process::spawn() on macOS

This is copied over from ladybird, but putting it here makes this
more reusable.
MacDue 2 years ago
parent
commit
cd7459d608
1 changed files with 15 additions and 3 deletions
  1. 15 3
      Userland/Libraries/LibCore/Process.cpp

+ 15 - 3
Userland/Libraries/LibCore/Process.cpp

@@ -21,7 +21,19 @@
 #    include <syscall.h>
 #    include <syscall.h>
 #endif
 #endif
 
 
-extern char** environ;
+#if defined(AK_OS_MACOS)
+#    include <crt_externs.h>
+#endif
+
+static char** environment()
+{
+#if defined(AK_OS_MACOS)
+    return *_NSGetEnviron();
+#else
+    extern char** environ;
+    return environ;
+#endif
+}
 
 
 namespace Core {
 namespace Core {
 
 
@@ -65,11 +77,11 @@ struct ArgvList {
         if (!m_working_directory.is_empty())
         if (!m_working_directory.is_empty())
             posix_spawn_file_actions_addchdir(&spawn_actions, m_working_directory.characters());
             posix_spawn_file_actions_addchdir(&spawn_actions, m_working_directory.characters());
 
 
-        auto pid = TRY(System::posix_spawn(m_path.view(), &spawn_actions, nullptr, const_cast<char**>(get().data()), environ));
+        auto pid = TRY(System::posix_spawn(m_path.view(), &spawn_actions, nullptr, const_cast<char**>(get().data()), environment()));
         if (keep_as_child == Process::KeepAsChild::No)
         if (keep_as_child == Process::KeepAsChild::No)
             TRY(System::disown(pid));
             TRY(System::disown(pid));
 #else
 #else
-        auto pid = TRY(System::posix_spawn(m_path.view(), nullptr, nullptr, const_cast<char**>(get().data()), environ));
+        auto pid = TRY(System::posix_spawn(m_path.view(), nullptr, nullptr, const_cast<char**>(get().data()), environment()));
         // FIXME: Support keep_as_child outside Serenity.
         // FIXME: Support keep_as_child outside Serenity.
         (void)keep_as_child;
         (void)keep_as_child;
 #endif
 #endif