aboutsummaryrefslogtreecommitdiffstats
path: root/src/pty.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pty.rs')
-rw-r--r--src/pty.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/pty.rs b/src/pty.rs
new file mode 100644
index 0000000..03dd7c1
--- /dev/null
+++ b/src/pty.rs
@@ -0,0 +1,32 @@
+use crate::error::*;
+
+pub struct Pty {
+ master: nix::pty::PtyMaster,
+ slave: std::fs::File,
+}
+
+impl Pty {
+ pub fn new() -> Result<Self> {
+ let master = nix::pty::posix_openpt(
+ nix::fcntl::OFlag::O_RDWR | nix::fcntl::OFlag::O_NOCTTY,
+ )?;
+ nix::pty::grantpt(&master)?;
+ nix::pty::unlockpt(&master)?;
+
+ let name = nix::pty::ptsname_r(&master)?;
+ let slave = std::fs::OpenOptions::new()
+ .read(true)
+ .write(true)
+ .open(name)?;
+
+ Ok(Self { master, slave })
+ }
+
+ pub fn master(&self) -> &nix::pty::PtyMaster {
+ &self.master
+ }
+
+ pub fn slave(&self) -> &std::fs::File {
+ &self.slave
+ }
+}