Implement scheme call cancellation.

This commit is contained in:
4lDO2
2024-03-16 10:02:41 +01:00
parent ad2c9b4b43
commit 28ba35baa7
3 changed files with 57 additions and 55 deletions
Generated
+21 -38
View File
@@ -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]]
+4 -4
View File
@@ -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"
+32 -13
View File
@@ -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<Request>,
todo: &mut Vec<Todo>,
) -> 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<Request>) {
fn do_todos(socket: &Socket, scheme: &mut PtyScheme, todo: &mut Vec<Todo>) {
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;
}