Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,23 +116,23 @@ pub fn ptsindex<T>(master: &mut T) -> io::Result<u32> where T: AsRawFd {
}

pub fn ptsname<T>(master: &mut T) -> io::Result<PathBuf> where T: AsRawFd {
Ok(Path::new(DEV_PTS_PATH).join(format!("{}", try!(ptsindex(master)))))
Ok(Path::new(DEV_PTS_PATH).join(format!("{}", ptsindex(master)?)))
}

/// Thread-safe (i.e. reentrant) version of `openpty(3)`
pub fn openpty(termp: Option<&Termios>, winp: Option<&WinSize>) -> io::Result<Pty> {
let mut master = try!(getpt());
try!(grantpt(&mut master));
try!(unlockpt(&mut master));
let name = try!(ptsname(&mut master));
let slave = try!(open_noctty(&name));
let mut master = getpt()?;
grantpt(&mut master)?;
unlockpt(&mut master)?;
let name = ptsname(&mut master)?;
let slave = open_noctty(&name)?;

match termp {
Some(t) => try!(tcsetattr(slave.as_raw_fd(), termios::TCSAFLUSH, &t)),
Some(t) => tcsetattr(slave.as_raw_fd(), termios::TCSAFLUSH, &t)?,
None => {}
}
match winp {
Some(w) => try!(set_winsize(&slave, w)),
Some(w) => set_winsize(&slave, w)?,
None => {}
}

Expand Down
14 changes: 7 additions & 7 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ impl TtyServer {
pub fn new<T>(template: Option<&T>) -> io::Result<TtyServer> where T: AsRawFd {
// Native runtime does not support RtioTTY::get_winsize()
let pty = match template {
Some(t) => try!(openpty(Some(&try!(Termios::from_fd(t.as_raw_fd()))), Some(&try!(get_winsize(t))))),
None => try!(openpty(None, None)),
Some(t) => openpty(Some(&Termios::from_fd(t.as_raw_fd())?), Some(&get_winsize(t)?))?,
None => openpty(None, None)?,
};

Ok(TtyServer {
Expand Down Expand Up @@ -148,15 +148,15 @@ impl TtyClient {
pub fn new<T, U>(master: T, peer: U, sigwinch_handler: Option<chan::Receiver<Signal>>) ->
io::Result<TtyClient> where T: AsRawFd + IntoRawFd, U: AsRawFd + IntoRawFd {
// Setup peer terminal configuration
let termios_orig = try!(Termios::from_fd(peer.as_raw_fd()));
let mut termios_peer = try!(Termios::from_fd(peer.as_raw_fd()));
let termios_orig = Termios::from_fd(peer.as_raw_fd())?;
let mut termios_peer = Termios::from_fd(peer.as_raw_fd())?;
termios_peer.c_lflag &= !(termios::ECHO | termios::ICANON | termios::ISIG);
termios_peer.c_iflag &= !(termios::IGNBRK | termios::ICRNL);
termios_peer.c_iflag |= termios::BRKINT;
termios_peer.c_cc[termios::VMIN] = 1;
termios_peer.c_cc[termios::VTIME] = 0;
// XXX: cfmakeraw
try!(tcsetattr(peer.as_raw_fd(), termios::TCSAFLUSH, &termios_peer));
tcsetattr(peer.as_raw_fd(), termios::TCSAFLUSH, &termios_peer)?;

// Create the proxy
let do_flush_main = Arc::new(AtomicBool::new(false));
Expand All @@ -173,7 +173,7 @@ impl TtyClient {

let do_flush = do_flush_main.clone();
let peer_fd = peer.as_raw_fd();
let peer_status = try!(unset_append_flag(peer_fd));
let peer_status = unset_append_flag(peer_fd)?;
thread::spawn(move || splice_loop(do_flush, None, m2p_rx.as_raw_fd(), peer_fd));

// Peer to master
Expand All @@ -187,7 +187,7 @@ impl TtyClient {

let do_flush = do_flush_main.clone();
let master_fd = master.as_raw_fd();
let master_status = try!(unset_append_flag(master_fd));
let master_status = unset_append_flag(master_fd)?;
thread::spawn(move || splice_loop(do_flush, Some(event_tx), p2m_rx.as_raw_fd(), master_fd));

// Handle terminal resizing
Expand Down