/// <summary> /// Bind shell to terminal/console /// </summary> /// <returns></returns> public static async Task BindAsync(this ISecureShell shell, bool forceVTerm, CancellationToken ct) { var win = IsWindowsAnniversaryEdition(forceVTerm); var inMode = ~0u; var outMode = ~0u; if (IsWindowsAnniversaryEdition(forceVTerm)) { EnableVtermOnWindows10AnniversaryEdition( out inMode, out outMode); } var ctrlC = Console.TreatControlCAsInput; Console.TreatControlCAsInput = true; using (var input = Console.OpenStandardInput()) using (var output = Console.OpenStandardOutput()) { await shell.BindAsync(input, output, Console.WindowWidth, Console.WindowHeight, Console.BufferWidth, Console.BufferHeight, ct); } Console.TreatControlCAsInput = ctrlC; if (inMode != ~0u && outMode != ~0u) { RestoreConsoleModes(inMode, outMode); } }
/// <summary> /// Shell into simulation /// </summary> /// <param name="shell"></param> /// <param name="options"></param> /// <returns></returns> private static async Task RunTerminalAsync(ISecureShell shell, CliOptions options) { if (shell == null) { throw new ArgumentException("Must login first"); } var cts = new CancellationTokenSource( options.GetValueOrDefault("-t", "--timeout", -1)); await shell.BindAsync(cts.Token); }