aboutsummaryrefslogtreecommitdiffstats
path: root/src/pty/tokio.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pty/tokio.rs')
-rw-r--r--src/pty/tokio.rs36
1 files changed, 36 insertions, 0 deletions
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<Self> {
+ 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<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)
+ }
+}