From 8f66fcb7e32ce074fda9816efec37b45659c45e3 Mon Sep 17 00:00:00 2001
From: Erik Kundiman <erik@megapahit.org>
Date: Sun, 21 Jul 2024 21:21:12 +0800
Subject: Wine-based Vivox-based voice support for FreeBSD

https://megapahit.com/show_bug.cgi?id=57
For SLVoice to run, there is a couple of environment variables that need
to be set, and users need to run
`/usr/local/share/wine/pkg32.sh install wine mesa-dri`
to install the necessary files first.
All this time the env parameter on apr_proc_create was never used, and
this is just the place for passing those environment settings, hence the
LLProcess::Param attribute addition.
---
 indra/llcommon/llprocess.cpp | 14 +++++++++++++-
 indra/llcommon/llprocess.h   |  5 +++++
 2 files changed, 18 insertions(+), 1 deletion(-)

(limited to 'indra/llcommon')

diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
index 2208b33b94..cf19e3aae9 100644
--- a/indra/llcommon/llprocess.cpp
+++ b/indra/llcommon/llprocess.cpp
@@ -691,10 +691,22 @@ LLProcess::LLProcess(const LLSDOrParams& params):
     // terminate with a null pointer
     argv.push_back(NULL);
 
+    // create an env vector for the child process
+    std::vector<const char*> envv;
+
+    // Add environment value assignments. See above remarks about c_str().
+    for (const std::string& env : params.envs)
+    {
+        envv.push_back(env.c_str());
+    }
+
+    // terminate with a null pointer
+    envv.push_back(NULL);
+
     // Launch! The NULL would be the environment block, if we were passing
     // one. Hand-expand chkapr() macro so we can fill in the actual command
     // string instead of the variable names.
-    if (ll_apr_warn_status(apr_proc_create(&mProcess, argv[0], &argv[0], NULL, procattr,
+    if (ll_apr_warn_status(apr_proc_create(&mProcess, argv[0], &argv[0], &envv[0], procattr,
                                            mPool)))
     {
         LLTHROW(LLProcessError(STRINGIZE(params << " failed")));
diff --git a/indra/llcommon/llprocess.h b/indra/llcommon/llprocess.h
index dcd316cb0f..4e7451c4a1 100644
--- a/indra/llcommon/llprocess.h
+++ b/indra/llcommon/llprocess.h
@@ -165,6 +165,7 @@ public:
         Params():
             executable("executable"),
             args("args"),
+            envs("envs"),
             cwd("cwd"),
             autokill("autokill", true),
             attached("attached", true),
@@ -182,6 +183,10 @@ public:
          * argument while assembling the command line.
          */
         Multiple<std::string> args;
+        /**
+         * zero or more additional command-line environment values.
+         */
+        Multiple<std::string> envs;
         /// current working directory, if need it changed
         Optional<std::string> cwd;
         /// implicitly kill child process on termination of parent, whether
-- 
cgit v1.2.3