diff --git a/crates/wasi-common/src/sandboxed_tty_writer.rs b/crates/wasi-common/src/sandboxed_tty_writer.rs index 2f927d0d2f..3152926157 100644 --- a/crates/wasi-common/src/sandboxed_tty_writer.rs +++ b/crates/wasi-common/src/sandboxed_tty_writer.rs @@ -1,4 +1,4 @@ -use std::io::{Result, Write}; +use std::io::{IoSlice, Result, Write}; /// An adapter around a `Write` stream that guarantees that its output /// is valid UTF-8 and contains no control characters. It does this by @@ -124,6 +124,27 @@ where return Ok(result); } + fn write_vectored(&mut self, bufs: &[IoSlice]) -> Result { + // Terminal output is [not expected to be atomic], so just write all the + // individual buffers in sequence. + // + // [not expected to be atomic]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html#tag_16_474_08 + let mut total_written = 0; + + for buf in bufs { + let written = self.write(buf)?; + + total_written += written; + + // Stop at the first point where the OS writes less than we asked. + if written < buf.len() { + break; + } + } + + Ok(total_written) + } + fn flush(&mut self) -> Result<()> { self.inner.flush() }