Use raw block to return tty to proper state

This commit is contained in:
Sean Sullivan 2021-09-06 22:27:43 -07:00
parent 84f4fbf3cf
commit c88f4c0645

View File

@ -101,6 +101,7 @@ class Sandbox
command = [SANDBOX_EXEC, "-f", seatbelt.path, *args] command = [SANDBOX_EXEC, "-f", seatbelt.path, *args]
# Start sandbox in a pseudoterminal to prevent access of the parent terminal. # Start sandbox in a pseudoterminal to prevent access of the parent terminal.
T.unsafe(PTY).spawn(*command) do |r, w, pid| T.unsafe(PTY).spawn(*command) do |r, w, pid|
write_to_pty = proc {
# Set the PTY's window size to match the parent terminal. # Set the PTY's window size to match the parent terminal.
# Some formula tests are sensitive to the terminal size and fail if this is not set. # Some formula tests are sensitive to the terminal size and fail if this is not set.
winch = proc do |_sig| winch = proc do |_sig|
@ -113,11 +114,12 @@ class Sandbox
[Utils.popen_read("tput", "lines").to_i, Utils.popen_read("tput", "cols").to_i] [Utils.popen_read("tput", "lines").to_i, Utils.popen_read("tput", "cols").to_i]
end end
end end
begin
# Update the window size whenever the parent terminal's window size changes. # Update the window size whenever the parent terminal's window size changes.
old_winch = trap(:WINCH, &winch) old_winch = trap(:WINCH, &winch)
winch.call(nil) winch.call(nil)
$stdin.raw! if $stdin.tty?
stdin_thread = Thread.new { IO.copy_stream($stdin, w) } stdin_thread = Thread.new { IO.copy_stream($stdin, w) }
r.each_char { |c| print(c) } r.each_char { |c| print(c) }
@ -125,9 +127,15 @@ class Sandbox
Process.wait(pid) Process.wait(pid)
ensure ensure
stdin_thread&.kill stdin_thread&.kill
$stdin.cooked! if $stdin.tty?
trap(:WINCH, old_winch) trap(:WINCH, old_winch)
end end
}
if $stdout.tty?
$stdin.raw &write_to_pty
else
write_to_pty.call
end
end
raise ErrorDuringExecution.new(command, status: $CHILD_STATUS) unless $CHILD_STATUS.success? raise ErrorDuringExecution.new(command, status: $CHILD_STATUS) unless $CHILD_STATUS.success?
rescue rescue
@failed = true @failed = true