Implement scheme call cancellation.
This commit is contained in:
Generated
+21
-38
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user