From f3e8046eff473aa9bf940b7fbd156cf3dfbfa352 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 23 Feb 2021 00:17:01 -0500 Subject: also create separate pty structs per backend for now, they are identical, but i will change them to be specialized next --- src/pty.rs | 74 +++++++++++++++++++++++++------------------------------------- 1 file changed, 30 insertions(+), 44 deletions(-) (limited to 'src/pty.rs') diff --git a/src/pty.rs b/src/pty.rs index ad4dfcf..f192298 100644 --- a/src/pty.rs +++ b/src/pty.rs @@ -1,6 +1,24 @@ use crate::error::*; -use std::os::unix::io::{AsRawFd as _, FromRawFd as _, IntoRawFd as _}; +use ::std::os::unix::io::{AsRawFd as _, IntoRawFd as _}; + +pub mod std; + +#[cfg(feature = "async-std")] +pub mod async_io; +#[cfg(feature = "tokio")] +pub mod tokio; + +pub trait Pty { + fn new() -> Result + where + Self: Sized; + fn pt(&self) -> &::std::fs::File; + fn pts(&self) -> Result<::std::fs::File>; + fn resize(&self, size: &super::Size) -> Result<()> { + set_term_size(self.pt(), size).map_err(Error::SetTermSize) + } +} pub struct Size { row: u16, @@ -45,51 +63,19 @@ impl From<&Size> for nix::pty::Winsize { } } -pub struct Pty { - pt: std::fs::File, - ptsname: std::path::PathBuf, -} - -impl Pty { - pub fn new() -> Result { - let pt = nix::pty::posix_openpt( - nix::fcntl::OFlag::O_RDWR | nix::fcntl::OFlag::O_NOCTTY, - ) - .map_err(Error::CreatePty)?; - nix::pty::grantpt(&pt).map_err(Error::CreatePty)?; - nix::pty::unlockpt(&pt).map_err(Error::CreatePty)?; - - let ptsname = - nix::pty::ptsname_r(&pt).map_err(Error::CreatePty)?.into(); - - let pt_fd = pt.into_raw_fd(); +fn create_pt() -> Result<(::std::os::unix::io::RawFd, ::std::path::PathBuf)> { + let pt = nix::pty::posix_openpt( + nix::fcntl::OFlag::O_RDWR | nix::fcntl::OFlag::O_NOCTTY, + ) + .map_err(Error::CreatePty)?; + nix::pty::grantpt(&pt).map_err(Error::CreatePty)?; + nix::pty::unlockpt(&pt).map_err(Error::CreatePty)?; - // safe because posix_openpt (or the previous functions operating on - // the result) would have returned an Err (causing us to return early) - // if the file descriptor was invalid. additionally, into_raw_fd gives - // up ownership over the file descriptor, allowing the newly created - // File object to take full ownership. - let pt = unsafe { std::fs::File::from_raw_fd(pt_fd) }; + let ptsname = nix::pty::ptsname_r(&pt).map_err(Error::CreatePty)?.into(); - Ok(Self { pt, ptsname }) - } - - pub fn pt(&self) -> &std::fs::File { - &self.pt - } + let pt_fd = pt.into_raw_fd(); - pub fn pts(&self) -> Result { - let fh = std::fs::OpenOptions::new() - .read(true) - .write(true) - .open(&self.ptsname) - .map_err(|e| Error::OpenPts(self.ptsname.clone(), e))?; - Ok(fh) - } - - pub fn resize(&self, size: &Size) -> Result<()> { - set_term_size(self.pt(), size).map_err(Error::SetTermSize) - } + Ok((pt_fd, ptsname)) } nix::ioctl_write_ptr_bad!( @@ -98,7 +84,7 @@ nix::ioctl_write_ptr_bad!( nix::pty::Winsize ); -fn set_term_size(file: &std::fs::File, size: &Size) -> nix::Result<()> { +fn set_term_size(file: &::std::fs::File, size: &Size) -> nix::Result<()> { let size = size.into(); let fd = file.as_raw_fd(); // safe because std::fs::File is required to contain a valid file -- cgit v1.2.3-54-g00ecf