diff --git a/vlib/os/process_test.v b/vlib/os/process_test.v index 8459d301d5..dc9edee4ff 100644 --- a/vlib/os/process_test.v +++ b/vlib/os/process_test.v @@ -1,5 +1,3 @@ -// vtest flaky: true -// vtest retry: 3 import os import time @@ -63,8 +61,22 @@ fn test_set_work_folder() { assert new_parent_work_folder != child_work_folder } -fn test_done() { - exit(0) +fn test_set_environment() { + mut p := os.new_process(test_os_process) + p.set_args(['-show_env', '-target', 'stdout']) + p.set_environment({ + 'V_OS_TEST_PORT': '1234567890' + }) + p.set_redirect_stdio() + p.wait() + assert p.code == 0 + output := p.stdout_slurp().trim_space() + p.close() + $if trace_process_output ? { + eprintln('p output: "${output}"') + } + dump(output) + assert output.contains('V_OS_TEST_PORT=1234567890') } fn test_run() { diff --git a/vlib/os/process_windows.c.v b/vlib/os/process_windows.c.v index e2adc79a64..ab3895a78f 100644 --- a/vlib/os/process_windows.c.v +++ b/vlib/os/process_windows.c.v @@ -124,8 +124,38 @@ fn (mut p Process) win_spawn_process() int { to_be_freed << work_folder_ptr } + mut env_block := []u16{} + if p.env.len > 0 { + mut env_ptr := &u16(unsafe { nil }) + + for e in p.env { + // e should in `ABC=123` format + env_ptr = e.to_wide() + if isnil(env_ptr) { + continue + } + mut i := 0 + for { + character := unsafe { env_ptr[i] } + if character == 0 { + break + } + env_block << character + i++ + } + env_block << u16(0) + to_be_freed << env_ptr + } + env_block << u16(0) + creation_flags |= C.CREATE_UNICODE_ENVIRONMENT + defer { + unsafe { env_block.free() } + } + } + create_process_ok := C.CreateProcessW(0, voidptr(&wdata.command_line[0]), 0, 0, C.TRUE, - creation_flags, 0, work_folder_ptr, voidptr(&start_info), voidptr(&wdata.proc_info)) + creation_flags, if env_block.len > 0 { env_block.data } else { 0 }, work_folder_ptr, + voidptr(&start_info), voidptr(&wdata.proc_info)) failed_cfn_report_error(create_process_ok, 'CreateProcess') if p.use_stdio_ctl { close_valid_handle(&wdata.child_stdout_write)