From e37ebb22f0f66827feea831a77e1b019c52d0a1f Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Thu, 31 May 2018 19:18:59 +0200 Subject: [PATCH 1/2] Support new edge-triggered model --- src/bin/getty.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/bin/getty.rs b/src/bin/getty.rs index 705a2ddc3a..4a52f4cd8b 100644 --- a/src/bin/getty.rs +++ b/src/bin/getty.rs @@ -45,14 +45,24 @@ pub fn handle(event_file: &mut File, tty_fd: RawFd, master_fd: RawFd, process: & let handle_event = |event_id: usize| { if event_id == tty_fd { let mut packet = [0; 4096]; - let count = syscall::read(tty_fd, &mut packet).expect("getty: failed to read from TTY"); - if count != 0 { + loop { + let count = match syscall::read(tty_fd, &mut packet) { + Ok(0) => break, + Ok(count) => count, + Err(ref err) if err.errno == syscall::EAGAIN => break, + Err(_) => panic!("getty: failed to read from TTY") + }; syscall::write(master_fd, &packet[..count]).expect("getty: failed to write master PTY"); } } else if event_id == master_fd { let mut packet = [0; 4096]; - let count = syscall::read(master_fd, &mut packet).expect("getty: failed to read master PTY"); - if count != 0 { + loop { + let count = match syscall::read(master_fd, &mut packet) { + Ok(0) => break, + Ok(count) => count, + Err(ref err) if err.errno == syscall::EAGAIN => break, + Err(_) => panic!("getty: failed to read from master TTY") + }; syscall::write(tty_fd, &packet[1..count]).expect("getty: failed to write to TTY"); if packet[0] & 1 == 1 { let _ = syscall::fsync(tty_fd); From 3831828485bd1b0baae57c89970c40d5b2eb044e Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Thu, 31 May 2018 20:17:17 +0200 Subject: [PATCH 2/2] Return on EOF, don't break --- src/bin/getty.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/getty.rs b/src/bin/getty.rs index 4a52f4cd8b..9f3147ea8a 100644 --- a/src/bin/getty.rs +++ b/src/bin/getty.rs @@ -47,7 +47,7 @@ pub fn handle(event_file: &mut File, tty_fd: RawFd, master_fd: RawFd, process: & let mut packet = [0; 4096]; loop { let count = match syscall::read(tty_fd, &mut packet) { - Ok(0) => break, + Ok(0) => return, Ok(count) => count, Err(ref err) if err.errno == syscall::EAGAIN => break, Err(_) => panic!("getty: failed to read from TTY") @@ -58,7 +58,7 @@ pub fn handle(event_file: &mut File, tty_fd: RawFd, master_fd: RawFd, process: & let mut packet = [0; 4096]; loop { let count = match syscall::read(master_fd, &mut packet) { - Ok(0) => break, + Ok(0) => return, Ok(count) => count, Err(ref err) if err.errno == syscall::EAGAIN => break, Err(_) => panic!("getty: failed to read from master TTY")