/// An allocated pty pub struct Pty(crate::sys::Pty); impl Pty { /// Allocate and return a new pty. /// /// # Errors /// Returns an error if the pty failed to be allocated. pub fn new() -> crate::Result { Ok(Self(crate::sys::Pty::open()?)) } /// Change the terminal size associated with the pty. /// /// # Errors /// Returns an error if we were unable to set the terminal size. pub fn resize(&self, size: crate::Size) -> crate::Result<()> { self.0.set_term_size(size) } /// Opens a file descriptor for the other end of the pty, which should be /// attached to the child process running in it. See /// [`Command::spawn`](crate::blocking::Command::spawn). /// /// # Errors /// Returns an error if the device node to open could not be determined, /// or if the device node could not be opened. pub fn pts(&self) -> crate::Result { Ok(Pts(self.0.pts()?)) } } impl std::os::unix::io::AsRawFd for Pty { fn as_raw_fd(&self) -> std::os::unix::io::RawFd { self.0 .0.as_raw_fd() } } impl std::io::Read for Pty { fn read(&mut self, buf: &mut [u8]) -> std::io::Result { self.0 .0.read(buf) } } impl std::io::Write for Pty { fn write(&mut self, buf: &[u8]) -> std::io::Result { self.0 .0.write(buf) } fn flush(&mut self) -> std::io::Result<()> { self.0 .0.flush() } } impl std::io::Read for &Pty { fn read(&mut self, buf: &mut [u8]) -> std::io::Result { (&self.0 .0).read(buf) } } impl std::io::Write for &Pty { fn write(&mut self, buf: &[u8]) -> std::io::Result { (&self.0 .0).write(buf) } fn flush(&mut self) -> std::io::Result<()> { (&self.0 .0).flush() } } /// The child end of the pty /// /// See [`Pty::pts`] and [`Command::spawn`](crate::blocking::Command::spawn) pub struct Pts(pub(crate) crate::sys::Pts);