feat(userspace): Call/ReplyRecv IPC, malformed-request replies, servers exit on dead endpoint; drop send/receive compat, select!, async_syscall
This commit is contained in:
@@ -36,10 +36,17 @@ pub fn run() -> ! {
|
||||
|
||||
let ep = types::bounded::CapSlot::new(0).unwrap();
|
||||
|
||||
let mut next = syscall::receive_msg(ep);
|
||||
loop {
|
||||
let (w0, w1, _w2, _w3) = syscall::receive(ep);
|
||||
|
||||
match w0 {
|
||||
let message = match next {
|
||||
Ok(m) => m,
|
||||
Err(e) => {
|
||||
libkos::println!("storage: endpoint unusable ({:?}), exiting", e);
|
||||
syscall::exit();
|
||||
}
|
||||
};
|
||||
let [w0, w1, _, _] = message.words();
|
||||
let reply = match w0 {
|
||||
CMD_READ_FILE => {
|
||||
let filename_len = w1;
|
||||
let buf = shared_buf();
|
||||
@@ -60,12 +67,14 @@ pub fn run() -> ! {
|
||||
libkos::println!("NOT FOUND");
|
||||
}
|
||||
|
||||
syscall::send(ep, file_size, 0, 0, 0);
|
||||
[file_size, 0, 0, 0]
|
||||
}
|
||||
_ => {
|
||||
syscall::send(ep, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
_ => [0, 0, 0, 0],
|
||||
};
|
||||
next = match message {
|
||||
syscall::Received::Call { .. } => syscall::reply_recv(ep, reply, None),
|
||||
_ => syscall::receive_msg(ep),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user