From a2ee05400f8cb4a44cd87742f95ebc2c3472e649 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Fri, 4 Nov 2022 15:12:09 -0700 Subject: Fix `Switch-Process` to set termios appropriate for child process (#18467) --- .../engine/Modules/SwitchProcessCommand.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/Modules/SwitchProcessCommand.cs b/src/System.Management.Automation/engine/Modules/SwitchProcessCommand.cs index 5e0cee6684..5734518231 100644 --- a/src/System.Management.Automation/engine/Modules/SwitchProcessCommand.cs +++ b/src/System.Management.Automation/engine/Modules/SwitchProcessCommand.cs @@ -69,10 +69,12 @@ namespace Microsoft.PowerShell.Commands // need null terminator at end execArgs[execArgs.Length - 1] = null; + // setup termios for a child process as .NET modifies termios dynamically for use with ReadKey() + ConfigureTerminalForChildProcess(true); int exitCode = Exec(command.Source, execArgs); - if (exitCode < 0) { + ConfigureTerminalForChildProcess(false); ThrowTerminatingError( new ErrorRecord( new Exception( @@ -108,6 +110,10 @@ namespace Microsoft.PowerShell.Commands CharSet = CharSet.Ansi, SetLastError = true)] private static extern int Exec(string path, string?[] args); + + // leverage .NET runtime's native library which abstracts the need to handle different OS and architectures for termios api + [DllImport("libSystem.Native", EntryPoint = "SystemNative_ConfigureTerminalForChildProcess")] + private static extern void ConfigureTerminalForChildProcess([MarshalAs(UnmanagedType.Bool)] bool childUsesTerminal); } } -- cgit v1.2.3