diff --git a/ChangeLog.md b/ChangeLog.md index d2d75e77e50e1..89a69705af6c9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -21,6 +21,10 @@ See docs/process.md for more on how version tagging works. 3.1.33 (in development) ----------------------- - Update SDL2_ttf port to 2.20.2 (#18804) +- When running under node the full set of environment variables (i.e. + process.env) are now reflected to running emscripten process (via e.g. + getenv). If you don't want this behaviour `-sDETERMINISTIC` can be used + to disable this can give fake envinonment instead. 3.1.32 - 02/17/23 ----------------- diff --git a/src/library_wasi.js b/src/library_wasi.js index 97e3cbc59f046..6d4387d703b08 100644 --- a/src/library_wasi.js +++ b/src/library_wasi.js @@ -42,12 +42,12 @@ var WasiLibrary = { $getEnvStrings: function() { if (!getEnvStrings.strings) { // Default values. -#if !DETERMINISTIC - // Browser language detection #8751 - var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8'; -#else +#if DETERMINISTIC // Deterministic language detection, ignore the browser's language. var lang = 'C.UTF-8'; +#else + // Browser language detection #8751 + var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8'; #endif var env = { 'USER': 'web_user', @@ -58,6 +58,12 @@ var WasiLibrary = { 'LANG': lang, '_': getExecutableName() }; +#if ENVIRONMENT_MAY_BE_NODE && !DETERMINISTIC + if (ENVIRONMENT_IS_NODE) { + // Under node we mirror then entire outer environment + env = process.env; + } +#endif // Apply the user-provided values, if any. for (var x in ENV) { // x is a key in ENV; if ENV[x] is undefined, that means it was diff --git a/test/test_other.py b/test/test_other.py index 00b260cfc6253..df4996b418315 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -7282,13 +7282,25 @@ def test_override_js_execution_environment(self): seen = self.run_js('test.js', engine=engine, assert_returncode=NON_ZERO) self.assertContained('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node', seen) + @requires_node + @with_env_modify({'FOO': 'bar'}) + def test_node_environ(self): + create_file('src.c', r''' + #include + #include + int main() { + printf("|%s|\n", getenv("FOO")); + } + ''') + self.do_runf('src.c', '|bar|') + def test_override_c_environ(self): create_file('pre.js', r''' var Module = { preRun: [function() { ENV.hello = 'world'; ENV.LANG = undefined; }] }; ''') - create_file('src.cpp', r''' + create_file('src.c', r''' #include #include int main() { @@ -7296,7 +7308,7 @@ def test_override_c_environ(self): printf("LANG is %s\n", getenv("LANG") ? "set" : "not set"); } ''') - self.run_process([EMXX, 'src.cpp', '--pre-js', 'pre.js']) + self.run_process([EMCC, 'src.c', '--pre-js', 'pre.js']) output = self.run_js('a.out.js') self.assertContained('|world|', output) self.assertContained('LANG is not set', output) @@ -7306,10 +7318,10 @@ def test_override_c_environ(self): preRun: [function(module) { module.ENV.hello = 'world' }] }; ''') - self.run_process([EMXX, 'src.cpp', '--pre-js', 'pre.js', '-sEXPORTED_RUNTIME_METHODS=ENV']) + self.run_process([EMCC, 'src.c', '--pre-js', 'pre.js', '-sEXPORTED_RUNTIME_METHODS=ENV']) self.assertContained('|world|', self.run_js('a.out.js')) - self.run_process([EMXX, 'src.cpp', '--pre-js', 'pre.js', '-sEXPORTED_RUNTIME_METHODS=ENV', '-sMODULARIZE']) + self.run_process([EMCC, 'src.c', '--pre-js', 'pre.js', '-sEXPORTED_RUNTIME_METHODS=ENV', '-sMODULARIZE']) output = self.run_process(config.NODE_JS + ['-e', 'require("./a.out.js")();'], stdout=PIPE, stderr=PIPE) self.assertContained('|world|', output.stdout)