diff --git a/Cargo.lock b/Cargo.lock index d0216310ec..2df495498c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,40 +4,23 @@ version = 3 [[package]] name = "bitflags" -version = "1.3.2" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "309ba69985d5170852ebbe8fbb33850d20794d0aed5b210dfea2db798df64e10" dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall", -] - -[[package]] -name = "libredox" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a" -dependencies = [ - "bitflags 2.4.1", + "bitflags", "libc", "redox_syscall", ] @@ -46,7 +29,7 @@ dependencies = [ name = "ptyd" version = "0.1.0" dependencies = [ - "libredox 0.0.3", + "libredox", "redox-daemon", "redox-scheme", "redox_event", @@ -56,42 +39,42 @@ dependencies = [ [[package]] name = "redox-daemon" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7" +checksum = "7fbdeffdb03cf2961b211a2023e683d71f2c225ea93404da5dc34b0dc94f0341" dependencies = [ "libc", - "libredox 0.0.1", + "libredox", ] [[package]] name = "redox-scheme" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "425289b64797f9b7d98971e61d4838c67041c2ca13511e5a62539936873ae1a8" +checksum = "4a4d4161697395d7cc9b182a14a753b2ba0243dcf622e278e644c6e7f74904c1" dependencies = [ - "libredox 0.0.3", + "libredox", "redox_syscall", ] [[package]] name = "redox_event" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78fedc17aea72caee38ac1208e0f709fa1641af1bbe0205e7d434413a60621d" +checksum = "0fe498288c246de6b2df9be919cffe7d144480b2f1829f3fa987aa3ee067a04a" dependencies = [ - "bitflags 2.4.1", - "libredox 0.0.1", + "bitflags", + "libredox", "redox_syscall", ] [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "13c178f952cc7eac391f3124bd9851d1ac0bdbc4c9de2d892ccd5f0d8b160e96" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 2f0a2d3004..c03bd5bcf0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -libredox = "0.0.3" +libredox = "0.1.2" redox-daemon = "0.1.2" -redox-scheme = "0.1.0" -redox_event = "0.2.0" -redox_syscall = "0.4.1" +redox-scheme = "0.2.0" +redox_event = "0.4.0" +redox_syscall = "0.5.0" redox_termios = "0.1.3" diff --git a/src/main.rs b/src/main.rs index 4d6abcdaad..c852936c77 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,8 @@ use libredox::errno::{EAGAIN, EBADF, EWOULDBLOCK}; use libredox::error::Error; use libredox::{flag, Fd}; -use redox_scheme::{Request, SignalBehavior, Socket}; +use redox_scheme::{CallRequest, RequestKind, Response, SignalBehavior, Socket}; +use syscall::EINTR; use syscall::data::TimeSpec; mod controlterm; @@ -87,39 +88,57 @@ fn main() { .expect("pty: failed to daemonize"); } +struct Todo { + request: CallRequest, + cancelling: bool, +} + fn scan_requests( socket: &Socket, scheme: &mut PtyScheme, - todo: &mut Vec, + todo: &mut Vec, ) -> libredox::error::Result<()> { loop { let request = match socket.next_request(SignalBehavior::Restart) { Ok(Some(req)) => req, Ok(None) => return Err(Error::new(EBADF)), - Err(Error { - errno: EAGAIN | EWOULDBLOCK, - }) => break, + Err(error) if error.errno == EWOULDBLOCK || error.errno == EAGAIN => break, Err(other) => panic!("pty: failed to read from socket: {other}"), }; - if let Ok(response) = request.handle_scheme_block_mut(scheme) { - let _ = socket - .write_response(response, SignalBehavior::Restart) - .expect("pty: failed to write responses to pty scheme"); - } else { - todo.push(request); + + match request.kind() { + RequestKind::Cancellation(req) => { + if let Some(idx) = todo.iter().position(|t| t.request.request().request_id() == req.id) { + todo[idx].cancelling = true; + } + } + RequestKind::Call(request) => { + if let Ok(response) = request.handle_scheme_block_mut(scheme) { + let _ = socket + .write_response(response, SignalBehavior::Restart) + .expect("pty: failed to write responses to pty scheme"); + } else { + todo.push(Todo { request, cancelling: false }); + } + } + _ => (), } } Ok(()) } -fn do_todos(socket: &Socket, scheme: &mut PtyScheme, todo: &mut Vec) { +fn do_todos(socket: &Socket, scheme: &mut PtyScheme, todo: &mut Vec) { let mut i = 0; while i < todo.len() { - if let Ok(response) = todo[i].handle_scheme_block_mut(scheme) { + if let Ok(response) = todo[i].request.handle_scheme_block_mut(scheme) { todo.remove(i); socket .write_response(response, SignalBehavior::Restart) .expect("pty: failed to write responses to pty scheme"); + } else if todo[i].cancelling { + socket.write_response(Response::new(&todo[i].request, Err(Error::new(EINTR).into())), SignalBehavior::Restart) + .expect("pty: failed to write responses to pty scheme"); + todo.remove(i); } else { i += 1; }