aboutsummaryrefslogtreecommitdiffstats
path: root/src/pty.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pty.rs')
-rw-r--r--src/pty.rs74
1 files changed, 30 insertions, 44 deletions
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<Self>
+ 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<Self> {
- 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<std::fs::File> {
- 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