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/tokio.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/pty/tokio.rs (limited to 'src/pty/tokio.rs') diff --git a/src/pty/tokio.rs b/src/pty/tokio.rs new file mode 100644 index 0000000..84097f9 --- /dev/null +++ b/src/pty/tokio.rs @@ -0,0 +1,36 @@ +use crate::error::*; + +use std::os::unix::io::FromRawFd as _; + +pub struct Pty { + pt: std::fs::File, + ptsname: std::path::PathBuf, +} + +impl super::Pty for Pty { + fn new() -> Result { + let (pt_fd, ptsname) = super::create_pt()?; + + // 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) }; + + Ok(Self { pt, ptsname }) + } + + fn pt(&self) -> &std::fs::File { + &self.pt + } + + 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) + } +} -- cgit v1.2.3-54-g00ecf